第7回

第7回演習課題

基礎問題

Q7-1 【迷惑メールをみつけよう・次元削減Ver.】

  1. データ spam-sample.csv をロードしなさい
  2. 特徴量の列と正解データの列を指定し,特徴量Xと正解データyを取り出しなさい
    • 特徴量は第0列~第56列をすべて,正解データは第57列としなさい
  3. 訓練データとテストデータに分割しなさい
    • X_train, X_test, y_train, y_test
    • random_stateを1234, テスト割合を0.4としなさい
  4. X_trainを標準化し,データフレームX_train_scに入れなさい
  5. X_train_scに主成分分析を適用しなさい.
    • X_train_scを変換し,主成分得点を求めてデータフレームX_train_pcaに入れなさい
    • 主成分負荷量を入れたデータフレームdf_comp を作成しなさい
    • 分散,寄与率,累積寄与率を入れたデータフレーム df_varを作成しなさい
  6. 次の要領にしたがって,散布図を描きなさい
    • X_train_pcaから第1主成分,第2主成分のみを取り出し,X_train_dimとしなさい
    • X_train_dimにy_trainを列方向(axis=1)に結合し,X_train_dim_testとしなさい
    • X_train_dim_testを散布図に書きなさい.x軸を"第1主成分", y軸を"第2主成分", 色付け(hue)を"迷惑メール"とすること
#準備(すべてに共通)
# 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 【次元削減したデータで分類モデルを作成する】

  1. ロジスティック回帰モデルでmodelを生成しなさい
    • パラメータは,random_state = 1234, C = 0.1, multi_class = 'auto', solver = 'lbfgs' とする
  2. 訓練データX_train_dim, y_trainでモデルを学習しなさい.
  3. 以下の要領で,次元削減したX_test_dimを作成しなさい.
    • X_testに標準化を適用して,X_test_scを作成する.ただし,スケーラーは以前に学習したscを使う
    • X_test_scにPCAを適用して,主成分得点X_test_pcaを得る.ただし,pcaモデルは以前学習したpcaを使う
    • X_test_pcaから第1主成分,第2主成分を取り出して,X_test_dimとする
  4. X_test_dim, y_test でモデルを評価しなさい
    • 分類精度を求めて,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))

応用問題

発展問題


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS