原因
- トレーニングデータセットが小さすぎる
対処方法
- ハイパーパラメータmin_child_samplesの値を小さくする。
- トレーニングデータ数を増やす
補足
min_child_samplesは、末端ノードに含まれる最小のデータ数。
初期値が20となっており、これを下回るような分割はされない。
従って、初期値設定のままだと、数十程度のデータセットだとトレーニングまともにできず、予測値がすべて同じ値になる場合がある。
対処方法としては、 データ量を増やすことが一番良いが、 min_child_sampleの値を小さくすることである程度ましになる。
現象例
In [10]:
import lightgbm as lgb
import sklearn.datasets
from sklearn.model_selection import train_test_split
普通に予測¶
In [90]:
boston = sklearn.datasets.load_boston()
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=0)
In [91]:
model = lgb.LGBMRegressor(random_state=0)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_pred
Out[91]:
In [92]:
score = model.score(X_test, y_test)
score
Out[92]:
LightGBMの予測値がすべて同じ値になる時¶
In [102]:
# データの切り出し
X_train_short = X_train[:30,:]
y_train_short = y_train[:30,]
In [103]:
model = lgb.LGBMRegressor(random_state=0)
model.fit(X_train_short, y_train_short)
Out[103]:
In [104]:
y_pred = model.predict(X_test)
In [105]:
# 予測値 すべて同じ値
y_pred
Out[105]:
In [106]:
score = model.score(X_test, y_test)
score
Out[106]:
小データセットでのLightGBMの予測の改善¶
In [107]:
params = {
#fixed
'min_child_samples':3,
}
In [108]:
model2 = lgb.LGBMRegressor(**params,random_state=0)
model2.fit(X_train_short, y_train_short)
Out[108]:
In [109]:
y_pred2 = model2.predict(X_test)
y_pred2
Out[109]:
In [110]:
score = model2.score(X_test, y_test)
score
Out[110]:
コメント