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.head(10))
#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.head(10))
#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.head(10))
#主成分負荷量
df_comp = pd.DataFrame(pca.###########, index=labels, columns=#############)
#主成分負荷量を表示
print("【主成分負荷量】")
display(df_comp.head(10))
#分散,寄与率,累積寄与率
df_var = pd.DataFrame(pca.###############, index=#######, columns=["分散"])
df_var["寄与率"] = pca.##################
df_var["累積寄与率"] = pca.#####################.#######()
print("【分散・寄与率】")
display(df_var.head(10))
#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.head(10))
#次元削減した訓練データの散布図を描く
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: モデルを学習
# アルゴリズムによっては,Warnng: A column-vector y was passed when a
# 1d array was expected が出る場合があり,その場合は↓のようにする
model.fit(#########, y_train.values.ravel())
# 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-3【最適なハイパーパラメータを求めよう】
作成したところまでのプログラムのipynbファイルを提出しなさい
Q7-4【迷惑メール検出のための機械学習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ファイルを提出しなさい