LoginSignup
7
6

More than 3 years have passed since last update.

HistGradientBoostingを使ってみた

Last updated at Posted at 2019-05-25

Scikit-Learnのv0.21.1以降ではLightGBMに似た、HistGradientBoosting(以下HGB)というアルゴリズムが使えると聞いたので試してみました。

環境

AnacondaでJupyterを使用しました。

Sckit-learnの更新

まずはscikit-learnヴァージョンの更新。
Anaconconda promptで下記コードを打ち、v0.21.1にします。


pip install scikit-learn==0.21.1

データ

kaggleのタイタニックコンペのデータを使用しました。

Jupyterを開き、下記コードを入力。

使用ライブラリ、タイタニックデータを読み込みます。


import pandas as pd
import numpy as np
import random as rnd
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier

from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble  import HistGradientBoostingClassifier
#from sklearn.ensemble  import HistGradientBoostingRegressor
from lightgbm import LGBMClassifier

train = pd.read_csv("データのあるフォルダ/train.csv")
test = pd.read_csv("データのあるフォルダ/test.csv")

データを前処理します。欠損を埋め、アルファベットを数字に変換。
このページを参考にさせていただきました。【Kaggle初心者入門編】タイタニック号で生き残るのは誰?


train["Age"].fillna(train["Age"].median(), inplace=True)
train['Embarked'].fillna('C', inplace=True)
train["Sex"][train["Sex"] == "male"] = 0
train["Sex"][train["Sex"] == "female"] = 1
train['Sex']= train['Sex'].astype(float)
train["Embarked"][train["Embarked"] == "S" ] = 0
train["Embarked"][train["Embarked"] == "C" ] = 1
train["Embarked"][train["Embarked"] == "Q"] = 2
train['Embarked']= train['Embarked'].astype(float)

test["Age"] = test["Age"].fillna(test["Age"].median())
test["Sex"][test["Sex"] == "male"] = 0
test["Sex"][test["Sex"] == "female"] = 1
test['Sex']= test['Sex'].astype(float)
test["Embarked"][test["Embarked"] == "S"] = 0
test["Embarked"][test["Embarked"] == "C"] = 1
test["Embarked"][test["Embarked"] == "Q"] = 2
test['Embarked']= test['Embarked'].astype(float)
test.Fare[152] = test.Fare.median()

とりあえずこのデータでいきます。

さっそくHGBを試してみます。今回は分類なのでHistGradientBoostingClassifier()を使いました。
比較の為に、LightGBM,やランダムフォレスト等を全てデフォルト設定で同時に実行し、
結果を表示します。


X_train = train.drop(['Survived','Name','PassengerId','Cabin','Ticket'], axis=1)
y_train = train["Survived"]

SVM = SVC()
RF = RandomForestClassifier()
LR = LogisticRegression()
HGBC = HistGradientBoostingClassifier()
LGB= LGBMClassifier()

scores = []
modelnames = ['HistGradient','SVM','RandumForest','LightGBM','LogisticRegression']
models = [HGBC,SVM,RF,LGB,LR]

for i in models:
    score = cross_val_score(i, X_train, y_train, scoring = 'accuracy' , cv = 5).mean()
    scores.append(score)

pd.DataFrame(scores, index=modelnames,
            columns=['CV Scores']).sort_values(by = 'CV Scores', ascending = False)    

jjj.jpg

パラメータは全てデフォルト設定ですが、確かにLightGBMに近い精度が出るようです。

今後、ハイパラ調整など、もう少し詳しくやってみたいと思います。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6