Q7-1 【迷惑メールをみつけよう・次元削減Ver.】
#準備(すべてに共通) # PandasとNumpyをインポート import pandas as pd import numpy as np # 日本語化Matplotlibもインポート import matplotlib.pyplot as plt #↓の1行は提出時にはコメントアウトしてください !pip install japanize-matplotlib import japanize_matplotlib # Seabornもインポート import seaborn as sns # pickleをインポート(モデルの保存用) import pickle #データフレームをきれいに表示するメソッド from IPython.display import display #標準化はよく使うのでインポート from sklearn.preprocessing import StandardScaler
# Step1: データの取得 # 迷惑メールの取得 spam_data = pd.read_csv("https://www2.cmds.kobe-u.ac.jp/~masa-n/dshandson/spam-sample.csv",encoding="utf8") # 確認 display(spam_data)
#Step2: 列の選択 #特徴量に指定する列名リスト.データの列名の0~56をスライスで取得 features = spam_data.columns[###:###] #正解データに指定する列名.データの列名の最後のものをスライスで取得 target = spam_data.columns[###:###] #特徴量 X = spam_data[######] #正解データ y = spam_data[######] #Step3: 訓練データ,テストデータの分割 #X, yのそれぞれを訓練データとテストデータに分ける (訓練:テスト=60:40) from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(##, ##, ##############=0.4, #########=1234)
#Step4: 標準化 sc = StandardScaler() # 訓練データをフィット sc.###(######) # 変換してデータフレームに入れる X_train_sc = pd.DataFrame(sc.#########(#######), index=#######.index, columns=#######.columns) #確認 display(X_train_sc) #Step5: PCAを適用 from sklearn.decomposition import PCA #白色化を有効にする pca = PCA(whiten=True) pca.###(##########) #表示用のラベル labels = [f"第{i+1}主成分" for i in range(#################)] # 主成分得点に変換してをデータフレームに入れる X_train_pca = pd.DataFrame(###############(#########), index=##############, columns=########) display(X_train_pca) #主成分負荷量 df_comp = pd.DataFrame(pca.###########, index=labels, columns=#############) #主成分負荷量を表示 print("【主成分負荷量】") display(df_comp) #分散,寄与率,累積寄与率 df_var = pd.DataFrame(pca.###############, index=#######, columns=["分散"]) df_var["寄与率"] = pca.################## df_var["累積寄与率"] = pca.#####################.#######() print("【分散・寄与率】") display(df_var) #Step6: 散布図の作成 #第1,第2主成分のみを取り出す → 次元を2に削減 X_train_dim = X_train_pca.iloc[:,[0,1]] #正解訓練データを結合 X_train_dim_test = pd.#########([X_train_dim, ########], axis=1) #表示 display(X_train_dim_test) #次元削減した訓練データの散布図を描く sns.scatterplot(###############, x="########", y="########", hue="迷惑メール", alpha=0.5)
Q7-2 【次元削減したデータで分類モデルを作成する】
##### Q7-1のコードを↓に貼り付ける ##### ここまで # Step1: ロジスティック回帰モデルを作成 from sklearn.linear_model import LogisticRegression model = LogisticRegression(random_state = 1234, C = 0.1, multi_class = 'auto', solver = 'lbfgs') # Step2: モデルを学習 model.####(#########, #########) # Step3: 次元削減したテストデータを作成 ### X_testに標準化を適用 X_test_sc = pd.DataFrame(###############(X_test), index=X_test.index, columns=X_test.columns) ### PCAを適用.主成分得点を求める X_test_pca = pd.DataFrame(##############(#########), index=############, columns=#######) ### 第1・第2主成分のみを取り出す X_test_dim = X_test_pca.iloc[:, [0,1]]
# Step4: モデルを評価する ### 分類精度を求める acc = model.score(###########, ########) print(f"【分類精度】 {acc}") ### 混同行列を作成する from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay ###予測したyの値 y_pred = model.############(###########) cm = confusion_matrix(########, ########) print("混同行列:\n", cm) #混同行列をプロットする(オプショナル) disp = ConfusionMatrixDisplay(confusion_matrix=####, display_labels=model.classes_) disp.plot() #分類レポートを表示する from sklearn.metrics import classification_report report = classification_report(y_pred = ########, y_true = ########, output_dict=True) display(pd.DataFrame(report))
Q7-X【迷惑メール検出のための機械学習APIを作ってみよう】
# ライブラリをインポート import pandas as pd from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import CountVectorizer # データの読み込み data=pd.read_csv('https://www.es4.eedept.kobe-u.ac.jp/~chensinan/share/Spam.csv', usecols=[0, 1], encoding='iso-8859-1') data
# データセットをランダム化 randomised_data=data.sample(frac=1,random_state=1) # ターゲット(ラベル)を数値特徴量に変換 randomised_data.Label=(randomised_data.Label=="spam").astype(int) # トレーニングデータとテストデータの分割 data_train,data_test=train_test_split(randomised_data,test_size=0.2,random_state=1) y_train=data_train["Label"] y_test=data_test["Label"] # トレーニングおよびテストデータのラベルを削除 del data_train["Label"] del data_test["Label"] # SMSから句読点を削除 data_train["SMS"]=data_train["SMS"].replace("\W", " ", regex=True) data_test["SMS"]=data_test["SMS"].replace("\W", " ", regex=True) # 文字を小文字に変換 data_train["SMS"]=data_train["SMS"].str.lower() data_test["SMS"]=data_test["SMS"].str.lower() # データ変換 vectorizer = CountVectorizer() X_train_encoded = vectorizer.fit_transform(data_train['SMS']) X_test_encoded = vectorizer.transform(data_test['SMS'])
正解データラベルのデフォルトは 値0が非迷惑(ham),値1が迷惑(spam) そのため,適当にif文で区別し,値を代入してください
作成したところまでのプログラムのipynbファイルを提出しなさい