ぺーぱーの日々

上機嫌でいること、夢中でいることを目標に、今日も色んなことに手を出します。

MENU

機械学習のアルゴリズム実装(勾配ブースティング)

以下のサイトを参考に、勾配ブースティングを実装してみる。

機械学習アルゴリズムの分類と実装まとめ - Qiita

やりたいこと

勾配ブースティングの実装

勾配ブースティングの特徴

一部のデータを繰り返し抽出し、逐次的に複数の決定木モデルを学習させる手法。

実装する前の仮説

  • 勾配ブースティングという字面から、坂道を目いっぱい上がる様子を想起

実装

このアルゴリズムにも、どうやら回帰と分類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回分の値が得られる、
  • 最終的に得られる結果は、どちらも数字だが、差がある。

まとめ

なにをやっているのかわからないながらも、なんとなくの実装の流れは理解できた。ところどころのモジュール名、引数の名称が違うだけで、ほかは別のアルゴリズムでも見たことのあるようなものが多い。

後々調べるべきこと

特になし