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))