LightGBM

这次终于彻底理解了 LightGBM 原理及代码

基于 Scikit-learn 接口的分类

# -*- coding: utf-8 -*-
from lightgbm import LGBMClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# from sklearn.externals import joblib  # 该用法已经废弃
import joblib

# 加载数据
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 = LGBMClassifier(num_leaves=31, learning_rate=0.05, n_estimators=20)
gbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], early_stopping_rounds=5)

# 模型存储
joblib.dump(gbm, 'loan_model.pkl')
# 模型加载
gbm = joblib.load('loan_model.pkl')

# 模型预测
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration_)

# 模型评估
print('The accuracy of prediction is:', accuracy_score(y_test, y_pred))

# 特征重要度
print('Feature importances:', list(gbm.feature_importances_))

# 网格搜索,参数优化
estimator = LGBMClassifier(num_leaves=31)
param_grid = {'learning_rate': [0.01, 0.1, 1],
    'n_estimators': [20, 40]
}
gbm = GridSearchCV(estimator, param_grid)
gbm.fit(X_train, y_train)
print('Best parameters found by grid search are:', gbm.best_params_)

#######################
print(' 使用新的参数训练 ')
gbm = LGBMClassifier(num_leaves=31, learning_rate=0.1, n_estimators=20)
gbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], early_stopping_rounds=5)

# 模型存储
joblib.dump(gbm, 'loan_model.pkl')
# 模型加载
gbm = joblib.load('loan_model.pkl')

# 模型预测
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration_)

# 模型评估
print('The accuracy of prediction is:', accuracy_score(y_test, y_pred))

LightGBM+OPTUNA 超参数自动调优教程

安装: pip install optuna

控制树结构的超参数

  • max_depth,树深度,一般设置可以尝试设置为 3 到 8
  • num_leaves(叶子节点数)。由于是二叉树,num_leaves 最大值应该是 2^(max_depth)。所以,确定了 max_depth 也就意味着确定了 num_leaves 的取值范围。
  • min_data_in_leaf:它的大小也与是否过拟合有关。它指定了叶子节点向下分裂的的最小样本数,比如设置 100,那么如果节点样本数量不够 100 就停止生长。当然,min_data_in_leaf 的设定也取决于训练样本的数量和 num_leaves。对于大数据集,一般会设置千级以上。

提高准确性的超参数

  • learning_rate 和 n_estimators:实现更高准确率的常见方法是使用更多棵子树并降低学习率。换句话说,就是要找到 LGBM 中 n_estimators 和 learning_rate 的最佳组合。
    • n_estimators 控制决策树的数量
    • learning_rate 是梯度下降的步长参数。learning_rate 可以用来控制梯度提升学习的速度,一般值可设在 0.01 和 0.3 之间。

更多超参数来控制过拟合

  • lambda_l1 和 lambda_l2: 一般的搜索范围可以在 (0, 100)。
  • min_gain_to_split: 比较保守的搜索范围是 (0, 20)
  • bagging_fraction 和 feature_fraction: 这两个参数取值范围都在 (0,1) 之间。
    • feature_fraction 指定训练每棵树时要采样的特征百分比,它存在的意义也是为了避免过拟合。因为有些特征增益很高,可能造成每棵子树分裂的时候都用同一个特征,这样每个子树就同质化了。而如果通过较低概率的特征采样,可以避免每次都遇到这些强特征,从而让子树的特征变得差异化,即泛化。
    • bagging_fraction 指定用于训练每棵树的训练样本百分比。要使用这个参数,还需要设置 bagging_freq,道理和 feature_fraction 一样,也是让没棵子树都变得好而不同。
评论(一条评论)
2022-11-06 14:46:45 回复

真不错,钻研精神

WindowsWindowsChromeChrome86.0.4240.198