LightGBM

11363 ワード

LightGBM:
boostingアルゴリズムの一種で、全量軽量の勾配リフト(LightGradient Boosting Machine)と呼ばれ、マイクロソフトが2017年にオープンソースしたSOTA Boostingアルゴリズムのフレームワークである.
XGBoostと同様に、LightGBMもGBDTアルゴリズムのフレームワークの1つのエンジニアリング実装ですが、より迅速で効率的です.
インストールするときは注意しましょう.問題が発生した場合は、次の巧みな処理方法を参考にしてください.
https://blog.csdn.net/sinat_36226553/article/details/106109821(不思議なライトbm取り付け時の解決方法)
irisデータセットの使用例のコードは次のとおりです.
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification

#     
iris = load_iris()
data = iris.data
target = iris.target
X_train, X_test, y_train, y_test =train_test_split(data, target, test_size=0.2)

#     
gbm = lgb.LGBMRegressor(objective='regression',
                        num_leaves=31,
                        learning_rate=0.05,
                        n_estimators=20)
#     
gbm.fit(X_train, y_train,eval_set=[(X_test, y_test)],eval_metric='l1',early_stopping_rounds=5)
#      
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration_)
#     
print(mean_squared_error(y_test, y_pred) ** 0.5)
#        
print(list(gbm.feature_importances_))
#LightGBM               
import time
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error

#     ,   label         
features = [f for f in df.columns if f not in [label]]

#          
def evalerror(pred, df):
    label = df.get_label().values.copy()
    score = mean_squared_error(label, pred)*0.5
    return ('mse', score, False)

#      
params = {
    'learning_rate': 0.01,
    'boosting_type': 'gbdt',
    'objective': 'regression',
    'metric': 'mse',
    'sub_feature': 0.7,
    'num_leaves': 60,
    'colsample_bytree': 0.7,
    'feature_fraction': 0.7,
    'min_data': 100,
    'min_hessian': 1,
    'verbose': -1,
}

t0 = time.time()
train_preds = np.zeros(train.shape[0])

#         
kf = KFold(n_splits=5, shuffle=True, random_state=43)
for i, (train_index, valid_index) in enumerate(kf.split(train)):
    print('train for {} epoch...'.format(i))
    train2 = train.iloc[train_index]
    valid2 = train.iloc[valid_index]
    lgb_train = lgb.Dataset(train2[features], train2['total_cost'], categorical_feature=['hy', 'sex', 'pay_type'])
    lgb_valid = lgb.Dataset(valid2[features], valid2['total_cost'], categorical_feature=['hy', 'sex', 'pay_type'])
    model = lgb.train(params,
                    lgb_train,
                    num_boost_round=3000,
                    valid_sets=lgb_valid,
                    verbose_eval=300,
                    feval=evalerror,
                    early_stopping_rounds=100)
    #        
    feat_importance = pd.Series(model.feature_importance(), index=features).sort_values(ascending=False)
    train_preds[valid_index] += model.predict(valid2[features], num_iteration=model.best_iteration)

print('Validset score: {}'.format(mean_squared_error(labels, train_preds)*0.5))
print('Cross Validation spend {} seconds'.format(time.time() - t0))

パラメータ補完:
max_depth,default=-1,type=int,ツリーの最大深さ制限,min_へのフィット防止data_in_leaf,default=20,type=int,リーフノード最小サンプル数,オーバーフィット防止feature_fraction, default=1.0, type=double, 0.0 < feature_fraction<1.0,ランダム選択特徴割合,加速訓練およびオーバーフィット防止feature_fraction_seed,default=2,type=int,ランダムシード数,毎回ランダムにサンプルを選択できる一貫性bagging_fraction,default=1.0,type=double,ランダム森林に類似し,毎回サンプリングせずにデータlambda_を選択するl 1,default=0,type=double,L 1正則lambda_l 2,default=0,type=double,L 2正則min_split_gain,default=0,type=double,最小分割情報利得値top_rate,default=0.2,type=double,大勾配ツリーの保持割合other_rate,default=0.1,type=int,小勾配ツリーの保持割合min_data_per_group,default=100,type=int,各分類グループの最小データ量max_cat_threshold,default=32,type=int,分類特徴の最大しきい値