【初心者】複数の機械学習モデルの性能を比較する(分類問題編)

スポンサーリンク
Python




機械学習の目的は、高い予測精度のモデルを作成することです。

高い予測精度のモデルの作成方法はいくつかありますが、一般的な方法を説明していきます。
複数の機械学習モデルを比較して、最良もモデルを選択する
次に、最良のモデルのハイパーパラメータを選択する

このような手順で最良のモデルを決定します。

今回は、複数の機械学習モデル(分類問題)の比較を、コードとともに確認していきましょう。

Pythonの環境設定は以下をご覧下さい。

M1 mac でanacondaをインストールし、Pythonを動作確認
M1 mac miniを購入したので、anacondaのインストールし、Pythonの動作を確認しました。 以前はWindowsでのanacondaのインストール方法を提示しました。 macでのイ...
【2021年最新】WindowsでAnacondaをインストールする方法、初心者がPythonの環境を構築する
Pythonの環境構築におすすめなのが、「anaconda」です。anacondaのなかにある、Jupyter Labはデータ解析や機械学習に非常に相性がいいです。理由は、コードを実行すると結果を返してくれます。その結果をみて、新たなコード

それでは、やっていきましょう。

必要なライブラリをインポート

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.ロジスティック回帰

【初心者】コピペでできるロジスティック回帰
非エンジニアであるサラリーマンにとって、機械学習の細かいアルゴリズムは必要ない! まずは、Pythonにコードをコピペして実行させることが大切です。その結果をどう判断するかは、現場経験があるサラリーマンの腕のみせど...

モデルを作成し、データを学習する。

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

【初心者】コピペでできるXGBoost
非エンジニアサラリーマンがお届けする、コピペでできる機械学習シリーズのXGBoost編です。XGBoostは機械学習のなかでも、非常に予測精度が高いです。Kaggleなどの機械学習のコンペでも多く用いられています。 問...

モデルを作成し、データを学習する。

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)

出力:

こんな感じで、複数のモデルを評価し、最良のモデルをみつけます。

今回は、サポートベクタマシンが最良のモデルになりましたね。

その後はハイパーパラメータの調整を行い、さらなる精度の向上を目指す流れになります。

今回は以上です。





コメント

タイトルとURLをコピーしました