以下のサイトを参考に、勾配ブースティングを実装してみる。
やりたいこと
勾配ブースティングの実装
勾配ブースティングの特徴
一部のデータを繰り返し抽出し、逐次的に複数の決定木モデルを学習させる手法。
実装する前の仮説
- 勾配ブースティングという字面から、坂道を目いっぱい上がる様子を想起
実装
このアルゴリズムにも、どうやら回帰と分類2つのバージョンがあるらしい。
回帰版
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import lightgbm as lgb
import numpy as np
# データの読み込み
wine = load_boston()
X = wine['data']
y = wine['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test)
params = {
'objective': 'regression',
'metric': 'mse',
}
num_round = 100
model = lgb.train(
params,
lgb_train,
valid_sets=lgb_eval,
num_boost_round=num_round,
)
y_pred = model.predict(X_test)
score = mean_squared_error(y_test, y_pred)
print('score is', score)
分類版
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import lightgbm as lgb
import numpy as np
# データの読み込み
wine = load_wine()
X = wine['data']
y = wine['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test)
params = {
'objective': 'multiclass',
'num_class': 3,
}
num_round = 100
model = lgb.train(
params,
lgb_train,
valid_sets=lgb_eval,
num_boost_round=num_round,
)
pred = model.predict(X_test)
y_pred = []
for p in pred:
y_pred.append(np.argmax(p))
score = accuracy_score(y_test, y_pred)
print('score is', score)
回帰版
score is 18.510691778258064
分類版
score is 0.9444444444444444
わかったこと
- 勾配ブースティングアルゴリズムの実装には、lightgbmモジュールが必要
- 実装に必要なモジュールは、回帰版と分類版でほとんで同じ(違うのは、sklearnのmetricsのモジュール)
- 回帰版・分類版どちらも、途中の出力結果として、100回分の値が得られる、
- 最終的に得られる結果は、どちらも数字だが、差がある。
まとめ
なにをやっているのかわからないながらも、なんとなくの実装の流れは理解できた。ところどころのモジュール名、引数の名称が違うだけで、ほかは別のアルゴリズムでも見たことのあるようなものが多い。
後々調べるべきこと
特になし