丸の内で働く外資コンサルタントのブログ

デジタル/アナリティクスが専門です


XGBoostで予測モデル作成

前回まででXGBoostのインストールが終わりました。 

ukichang.hatenablog.com

ここからは実際にXGBoostによる予測モデルを作成していきます。

1. 必要なライブラリのimport

以下で事足ります。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pylab as plt
import sklearn
from IPython.core.display import display
%matplotlib inline

 

from sklearn import cross_validation as cv
from sklearn import metrics as mtr

import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from sklearn.grid_search import GridSearchCV 

2. データの取得

今回はUCI Machine Learning repositoryのPima Indians Diabetes Data Setを使います。 これはPimaインディアンが糖尿病にかかったかどうかを表すデータで、1~8が患者の属性や検査値を表し、9が糖尿病かどうかバイナリで表されており、9を2クラスに分類する予測モデルを作成することになります。

1. Number of times pregnant 
2. Plasma glucose concentration a 2 hours in an oral glucose tolerance test 
3. Diastolic blood pressure (mm Hg) 
4. Triceps skin fold thickness (mm) 
5. 2-Hour serum insulin (mu U/ml) 
6. Body mass index (weight in kg/(height in m)^2) 
7. Diabetes pedigree function 
8. Age (years) 
9. Class variable (0 or 1)

データの取得は以下でできます。

data = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/'\
'pima-indians-diabetes/pima-indians-diabetes.data', header=None) 

 

X = data.drop(8,axis=1)
Y = data[8]

3. 関数定義

引数には分類アルゴリズムと特徴量と予測ラベルが入ります。

Cross Validationで訓練用とテスト用にデータを分割し、次いでモデルにfitさせ予測しています。

結果はprecision、recall、Accuracy、AURocに加え、特徴量の重要度を出力させています。

def modelfit(alg, X, Y):

  #Cross Validation
  X_train, X_test, Y_train, Y_test = cv.train_test_split(X,Y,test_size=0.2)

  #Fit the algorithm on the data
  alg.fit(X_train, Y_train,eval_metric=['auc'])

  #Predict training set:
  train_predictions = alg.predict(X_train)
  train_predprob = alg.predict_proba(X_train)[:,1]

  #Print model report:
  print("\nModel Report")

  # Predict on testing data:
  test_predictions = alg.predict(X_test)
  X_test['predprob'] = alg.predict_proba(X_test)[:,1].copy()


  print("precision : %.4g" %mtr.precision_score(Y_test, test_predictions))
  print("recall : %.4g" %mtr.recall_score(Y_test, test_predictions))
  print("Accuracy : %.4g" % mtr.accuracy_score(Y_test, test_predictions))
  print('AUC Score (Test): %f' % mtr.roc_auc_score(Y_test, X_test['predprob']))

  feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False)
  print("\nFeature Importances")
  print(feat_imp)

 

4.パラメータ

まずXGBoostではXGBClassifierとXGBRegressorが選べますが、分類問題なので、XGBClassifierを使用します。

パラメータの値ですが、公式によると重要なのは、max_depthを、min_child_weight、次いでgammaみたいです。経験的にですが、パラメータをいじってもそれほど精度は変わらない印象です。max_depthをいじると良くて0.02くらいかわるかなーって感じなので、一旦適当でいいです(別途グリッドサーチします)。objectiveは分類問題なので、'binary:logistic'にしてください。

param = XGBClassifier(
learning_rate = 0.1,
n_estimators = 1000,
max_depth = 5,
min_child_weight = 1,
max_delta_step = 5,
gamma = 0,
subsample = 0.8,
colsample_bytree = 0.8,
objective = 'binary:logistic',
nthread = 4,
scale_pos_weight = 1,
seed =0
)

5. 結果

以下のような結果が取得できます。各精度指標に加えて変数の重要度を取得できます。

個人的な経験則ですが、XGBoostの精度はロジスティック回帰とくらべて若干いいくらいの結果です。パラメータのチューニングに手間がかかること、計算がロジスティック回帰より遅いことを考えると、ロジスティック回帰でよくね??って思わなくもないですが、手間暇おしまずその若干の精度が必要な際には利用したいと思います。

次回はハイパーパラメータのチューニングを行いたいと思います。

modelfit(param, X,Y)

--- 

Model Report
precision : 0.6038
recall : 0.5614
Accuracy : 0.7013
AUC Score (Test): 0.745704

Feature Importances
6 1517
1 1358
5 1345
7 1078
2 991
0 652
3 634
4 546
dtype: int64

 

参考

Kerasによる2クラス分類(Pima Indians Diabetes) - 人工知能に関する断創録

XGBoostのパラメータチューニング実践 with Python | かものはしの分析ブログ