機械学習の目的は、高い予測精度のモデルを作成することです。
高い予測精度のモデルの作成方法はいくつかありますが、一般的な方法を説明していきます。
複数の機械学習モデルを比較して、最良もモデルを選択する
次に、最良のモデルのハイパーパラメータを選択する。
このような手順で最良のモデルを決定します。
今回は、複数の機械学習モデル(分類問題)の比較を、コードとともに確認していきましょう。
Pythonの環境設定は以下をご覧下さい。


それでは、やっていきましょう。
必要なライブラリをインポート
import pandas as pd import numpy as np from sklearn.datasets import load_breast_cancer import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline import warnings warnings.filterwarnings('ignore')
データセットを整える
目的変数:ガンが良性(benign:1)か悪性(malignant:0)か
説明変数:さまざまな検査結果(ここでは詳細は言及しません)
cancer = load_breast_cancer() # データセットを "cancer" に格納する # データセットをデータフレームの形に変換する cancer=load_breast_cancer() df=pd.DataFrame(data=cancer.data,columns=cancer.feature_names) df['cancer']=cancer.target df
上のコードはデータフレームにするためのコードです。
cancerのデータセットで実践する場合は上のコードを実行して下さい。
自身のデータを使用する場合は、以下のコードから実行して下さい。
自身のデータの収集やデータの管理方法は以下をご覧下さい。

出力:
出力の左下に「569 rows × 31 columns」とあります。
これは、569行と31列の数値があることを意味します。そして、31列目(上の表の右端の列)は「cancer」となっています。これが今回の目的変数(ターゲット)になるガンの有無のデータです。
機械学習がしやすいデータの形に整える
X = df.iloc[:,0:30] # 1~30列を目的変数として「X」に入れる y = df.iloc[:,-1] # 最後の列(31列目)を目的変数として「y」に入れる
つぎに、データを訓練用とテスト用に分割します
# データを訓練用とテスト用に分割する from sklearn.model_selection import train_test_split, GridSearchCV X_train, X_test, y_train, y_test = train_test_split( X, y, test_size = 0.25, random_state = 1, stratify = y)
データ数を確認してみましょう。
print("Shape of X_train: ",X_train.shape) print("Shape of X_test: ", X_test.shape) print("Shape of y_train: ",y_train.shape) print("Shape of y_test",y_test.shape)
出力:
Shape of X_train: (426, 30)
Shape of X_test: (143, 30)
Shape of y_train: (426,)
Shape of y_test (143,)
複数のモデルを作成し、精度を評価する
1.ロジスティック回帰

モデルを作成し、データを学習する。
from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline steps = [ ('scalar', StandardScaler()), ('model', LogisticRegression()) ] lr = Pipeline(steps) lr.fit(X_train,y_train)
モデルを評価する
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score y_pred_lr = lr.predict(X_test) acc_lr = lr.score(X_test, y_test) pre_lr = precision_score(y_test, y_pred_lr) re_lr = recall_score(y_test, y_pred_lr) f1_lr = f1_score(y_test, y_pred_lr) auc_lr = roc_auc_score(y_test, y_pred_lr) print('Test accuracy: %.3f' % acc_lr) print('Precision: %.3f' % pre_lr) print('Recall: %.3f' % re_lr) print('F1: %.3f' % f1_lr) print('roc_auc: %.3f' % auc_lr)
出力:
Test accuracy: 0.965
Precision: 0.967
Recall: 0.978
F1: 0.972
roc_auc: 0.961
分類モデルの評価の説明は以下をご覧下さい。

2.最近傍法
モデルを作成し、データを学習する
from sklearn.neighbors import KNeighborsClassifier steps = [ ('scalar', StandardScaler()), ('model', KNeighborsClassifier()) ] knc = Pipeline(steps) knc.fit(X_train,y_train)
モデルを評価する
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score y_pred_knc =knc.predict(X_test) acc_knc = knc.score(X_test, y_test) pre_knc = precision_score(y_test, y_pred_knc) re_knc = recall_score(y_test, y_pred_knc) f1_knc = f1_score(y_test, y_pred_knc) auc_knc = roc_auc_score(y_test, y_pred_knc) print('Test accuracy: %.3f' % acc_knc) print('Precision: %.3f' % pre_knc) print('Recall: %.3f' % re_knc) print('F1: %.3f' % f1_knc) print('roc_auc: %.3f' % auc_knc)
出力:
Test accuracy: 0.965
Precision: 0.947
Recall: 1.000
F1: 0.973
roc_auc: 0.953
3.サポートベクタマシン

モデルを作成し、データを学習する
from sklearn.svm import SVC steps = [ ('scalar', StandardScaler()), ('model', SVC()) ] svc = Pipeline(steps) svc.fit(X_train,y_train)
モデルを評価する
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score y_pred_svc = svc.predict(X_test) acc_svc = svc.score(X_test, y_test) pre_svc = precision_score(y_test, y_pred_svc) re_svc = recall_score(y_test, y_pred_svc) f1_svc = f1_score(y_test, y_pred_svc) auc_svc = roc_auc_score(y_test, y_pred_svc) print('Test accuracy: %.3f' % acc_svc) print('Precision: %.3f' % pre_svc) print('Recall: %.3f' % re_svc) print('F1: %.3f' % f1_svc) print('roc_auc: %.3f' % auc_svc)
出力:
Test accuracy: 0.979
Precision: 0.968
Recall: 1.000
F1: 0.984
roc_auc: 0.972
4.決定木

モデルを作成し、データを学習する。
from sklearn.tree import DecisionTreeClassifier tree = DecisionTreeClassifier() tree.fit(X_train,y_train)
モデルを評価する。
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score y_pred_tree = tree.predict(X_test) acc_tree = tree.score(X_test, y_test) pre_tree = precision_score(y_test, y_pred_tree) re_tree = recall_score(y_test, y_pred_tree) f1_tree = f1_score(y_test, y_pred_tree) auc_tree = roc_auc_score(y_test, y_pred_tree) print('Test accuracy: %.3f' % acc_tree) print('Precision: %.3f' % pre_tree) print('Recall: %.3f' % re_tree) print('F1: %.3f' % f1_tree) print('roc_auc: %.3f' % auc_tree)
出力:
Test accuracy: 0.930
Precision: 0.955
Recall: 0.933
F1: 0.944
roc_auc: 0.929
5.ランダムフォレスト

モデルを作成し、データを学習する。
from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier() rf.fit(X_train,y_train)
モデルを評価する。
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score y_pred_rf = rf.predict(X_test) acc_rf = rf.score(X_test, y_test) pre_rf = precision_score(y_test, y_pred_rf) re_rf = recall_score(y_test, y_pred_rf) f1_rf = f1_score(y_test, y_pred_rf) auc_rf = roc_auc_score(y_test, y_pred_rf) print('Test accuracy: %.3f' % acc_rf) print('Precision: %.3f' % pre_rf) print('Recall: %.3f' % re_rf) print('F1: %.3f' % f1_rf) print('roc_auc: %.3f' % auc_rf)
出力:
Test accuracy: 0.944
Precision: 0.956
Recall: 0.956
F1: 0.956
roc_auc: 0.940
6.XGBoost

モデルを作成し、データを学習する。
import xgboost xgb = xgboost.XGBClassifier() xgb.fit(X_train,y_train)
モデルを評価する。
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score y_pred_xgb = xgb.predict(X_test) acc_xgb = xgb.score(X_test, y_test) pre_xgb = precision_score(y_test, y_pred_xgb) re_xgb = recall_score(y_test, y_pred_xgb) f1_xgb = f1_score(y_test, y_pred_xgb) auc_xgb = roc_auc_score(y_test, y_pred_xgb) print('Test accuracy: %.3f' % acc_xgb) print('Precision: %.3f' % pre_xgb) print('Recall: %.3f' % re_xgb) print('F1: %.3f' % f1_xgb) print('roc_auc: %.3f' % auc_xgb)
出力:
Test accuracy: 0.951
Precision: 0.956
Recall: 0.967
F1: 0.961
roc_auc: 0.946
7.ligthGBM
モデルを作成し、データを学習する。
from lightgbm import LGBMClassifier lgbm = LGBMClassifier() lgbm.fit(X_train, y_train)
モデルを評価する。
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score y_pred_lgbm = lgbm.predict(X_test) acc_lgbm = lgbm.score(X_test, y_test) pre_lgbm = precision_score(y_test, y_pred_lgbm) re_lgbm = recall_score(y_test, y_pred_lgbm) f1_lgbm = f1_score(y_test, y_pred_lgbm) auc_lgbm = roc_auc_score(y_test, y_pred_lgbm) print('Test accuracy: %.3f' % acc_lgbm) print('Precision: %.3f' % pre_lgbm) print('Recall: %.3f' % re_lgbm) print('F1: %.3f' % f1_lgbm) print('roc_auc: %.3f' % auc_lgbm)
出力:
Test accuracy: 0.958
Precision: 0.957
Recall: 0.978
F1: 0.967
roc_auc: 0.951
学習モデルは以上です。
評価結果が分かりにくので、まとめて表示します。
複数のモデルを評価する
models = [('Logistic', acc_lr, pre_lr, re_lr, f1_lr, auc_lr), ('KNeighbors', acc_knc, pre_knc, re_knc, f1_knc, auc_knc), ('Support Vector', acc_svc, pre_svc, re_svc, f1_svc, auc_svc), ('Decision Tree', acc_tree, pre_tree, re_tree, f1_tree, auc_tree), ('Random Forest', acc_rf, pre_rf, re_rf, f1_rf, auc_rf), ('XGBoost', acc_xgb, pre_xgb, re_xgb, f1_xgb, auc_xgb), ('LightGBM', acc_lgbm, pre_lgbm, re_lgbm, f1_lgbm, auc_lgbm), ]
評価結果をデータフレームに変換する。
col=['Model', 'accuracy', 'Precision', 'Recall', 'F1', 'ROC_AUC'] predict = pd.DataFrame(data = models, columns=col) predict
評価結果を可視化する
f, axes = plt.subplots(5,1, figsize=(15,20),dpi=200) size = 10 k = col[1:] for i in range(len(k)): predict.sort_values(by=k[i], ascending=False, inplace=True) sns.barplot(x='Model', y=k[i], data=predict, ax = axes[i]) axes[i].set_xlabel('Model', size=size) axes[i].set_ylabel(k[i], size=size) axes[i].set_ylim(0.85,1.0)
こんな感じで、複数のモデルを評価し、最良のモデルをみつけます。
今回は、サポートベクタマシンが最良のモデルになりましたね。
その後はハイパーパラメータの調整を行い、さらなる精度の向上を目指す流れになります。
今回は以上です。
コメント