【初心者】コピペでできるXGBoost

スポンサーリンク
Python





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

問題解決にコードは最低限でいいと考えています。コードはコピーして、データ収集や結果の解釈に力を注いで下さい。だれでも、すぐに実践できるようにscikit-learnのデータセットを使います。また、自身のデータでもすぐにコピペできるように、scikit-learnのデータセットを一旦データフレームにしてから機械学習を実施していきます。

環境構築は、

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 warnings
warnings.filterwarnings('ignore')

今回のデータセットはscikit-learnのデータセットにあるcancerを使用します。

データセットを整える

【超重要】はじめてのデータ収集方法

目的変数:ガンが良性(benign:0)悪性(malignant:1)
説明変数:さまざまな検査結果(ここでは詳細は言及しません、ゴメンナサイ)

cancer = load_breast_cancer()       # データセットを "cancer" に格納する

# データセットをデータフレームの形に変換する
df = pd.DataFrame(data=cancer.data, columns=cancer.feature_names)
series1 = pd.Series(data=[cancer.target_names[i] for i in cancer.target], name="cancer")
df = pd.concat([df,series1], axis=1)

mapping = {'benign': 0, 'malignant': 1}      # "benign" を0に、"malignant" を1に変換する
df['cancer'] = df['cancer'].map(mapping)     # その変換をデータフレームに適応させる
df

上のコードはデータフレームにするためのコードです。
cancerのデータセットで実践する場合は上のコードを実行して下さい。
自身のデータを使用する場合は、以下のコードから実行して下さい。

機械学習がしやすいデータの形に整える

X = df.iloc[:,0:30].values # 1~30列を目的変数に
y = df.iloc[:,-1].values   # 最後の列(31列目)を目的変数に

つぎに、データを訓練用とテスト用に分割します

# データを訓練用とテスト用に分割する
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)

XGBoost

# XGBoostの実装(sklearnを使用)

from sklearn.model_selection import GridSearchCV, KFold
import xgboost as xgb

cv_params = {'objective':['binary:logistic'],
             'n_estimators':[50000],
             'random_state':[1],
             'booster': ['gbtree'],
             'learning_rate':[0.1, 0.5, 0.75],
             'min_child_weight':[1, 3],
             'max_depth':[2, 4, 6],
             'colsample_bytree':[0.5, 1.0],
             'subsample':[0.5, 0.75, 1.0],
             'n_jobs':[-1]
            }
 
cls = xgb.XGBClassifier()
cls_grid = GridSearchCV(cls, cv_params, cv=KFold(5, random_state=1, shuffle=True),
                        scoring='accuracy')
cls_grid.fit(X_train,
             y_train,
             eval_set=[(X_train, y_train)],
             early_stopping_rounds=50,
             eval_metric='error',
             verbose=0)

# 訓練用データの正解率、裁量スコアとなるパラメータ値を出力
print('Train accuracy_random_forest: %.3f' % cls_grid.best_score_)
print(cls_grid.best_params_)

y_pred=cls_grid.predict(X_test)       # XGBoostの結果から得らた予測結果を作成する

コードを実行すると
Train accuracy_random_forest: 0.986
{‘booster’: ‘gbtree’, ‘colsample_bytree’: 1.0, ‘learning_rate’: 0.5, ‘max_depth’: 6, ‘min_child_weight’: 1, ‘n_estimators’: 50000, ‘n_jobs’: -1, ‘objective’: ‘binary:logistic’, ‘random_state’: 1, ‘subsample’: 0.5}
が出力されると思います(バージョンによって多少は違うかも)

モデル作成に使用した訓練データでは正解率が98.6%です。

【基礎】分類モデルの評価方法

以前行ったロジスティック回帰やランダムフォレストも同じデータセットでしたが、結果は、

ロジスティック回帰の正解率:97.7%

決定木の正解率:93.7%

ランダムフォレストの正解率:96.0%

でしたので、一番高い正解率になっています。

(過去の記事を参照してみてください)

【初心者】コピペでできるロジスティック回帰

【初心者】コピペでできる決定木とランダムフォレスト

モデルの評価(XGBoost)

from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score
print('Test accuracy: %.3f' % cls_grid.best_estimator_.score(X_test, y_test))
print('Precision: %.3f' % precision_score(y_test, y_pred))
print('Recall: %.3f' % recall_score(y_test, y_pred))
print('F1: %.3f' % f1_score(y_test, y_pred))
print('roc_auc: %.3f' % roc_auc_score(y_test, y_pred))

モデルの評価にはさまざまな方法がありますが、以下は一般的なものだと思います。上のコードを実行すると、以下が出力されます。
Test accuracy: 0.972
Precision: 0.980
Recall: 0.943
F1: 0.962
roc_auc: 0.966
ここでは、一番分かりやす正解率のみをみていきます。テストデータ正解率は97.2%です。テスト用の結果も比較してみましょう。

ロジスティック回帰の正解率:94.4%

決定木の正解率:90.0%

ランダムフォレストの正解率:94.4%

でしたので、テスト用の結果でも一番正解率が高くなりました。

(過去記事)

【初心者】コピペでできるロジスティック回帰

【初心者】コピペでできる決定木とランダムフォレスト

もう少し分かりやすく、混同行列をみてみましょう

import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
# テストと予測のデータから混合行列を生成
confmat = confusion_matrix(y_true=y_test, y_pred=y_pred)

fig, ax = plt.subplots(figsize=(3, 3),dpi=200)
# matshow関数で行列からヒートマップを描画
ax.matshow(confmat, cmap=plt.cm.Blues, alpha=0.3)
for i in range(confmat.shape[0]):       # クラス0の繰り返し処理
    for j in range(confmat.shape[1]):   # クラス1の繰り返し処理
        ax.text(x=j, y=i, s=confmat[i, j], va='center', ha='center')  # 件数を表示

plt.xlabel('Predicted label')
plt.ylabel('True label')
plt.tight_layout()
plt.show()

左上と、右下の塗りつぶしている箇所が、予測が正しかったということなので、そこの数値が大きいほうが良いでと判断できます。

XGBoostのコードは以上です。
XGBoostはデータの整理がいらないので、簡単です。このコードのコピペである程度の精度がでると思います。
これを使って、じゃんじゃん問題解決していきましょう。まだまだ、機械学習を通常の業務で使えている一般企業は少ないです(IT企業などはしりませんが)





コメント

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