当前位置:网站首页>【机器学习】随机森林、GBDT、XGBoost、LightGBM等集成学习代码练习
【机器学习】随机森林、GBDT、XGBoost、LightGBM等集成学习代码练习
2022-08-09 07:17:00 【51CTO】
本文是中国大学慕课《机器学习》的“集成学习”章节的课后代码。
课程地址:
https://www.icourse163.org/course/WZU-1464096179
课程完整代码:
https://github.com/fengdu78/WZU-machine-learning-course
代码修改并注释:黄海广,[email protected]
生成数据
生成12000行的数据,训练集和测试集按照3:1划分
模型对比
对比六大模型,都使用默认参数,因为数据是
from sklearn . linear_model import LogisticRegression
from sklearn . ensemble import RandomForestClassifier
from sklearn . ensemble import AdaBoostClassifier
from sklearn . ensemble import GradientBoostingClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn . model_selection import cross_val_score
import time
clf1 = LogisticRegression()
clf2 = RandomForestClassifier()
clf3 = AdaBoostClassifier()
clf4 = GradientBoostingClassifier()
clf5 = XGBClassifier()
clf6 = LGBMClassifier()
for clf, label in zip([ clf1, clf2, clf3, clf4, clf5, clf6], [
'Logistic Regression', 'Random Forest', 'AdaBoost', 'GBDT', 'XGBoost',
'LightGBM'
]):
start = time . time()
scores = cross_val_score( clf, X_train, y_train, scoring = 'accuracy', cv = 5)
end = time . time()
running_time = end - start
print( "Accuracy: %0.8f (+/- %0.2f),耗时%0.2f秒。模型名称[%s]" %
( scores . mean(), scores . std(), running_time, label))
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
Accuracy: 0 .47488889 ( +/- 0 .00), 耗时0 .04 秒。模型名称[ Logistic Regression]
Accuracy: 0 .88966667 ( +/- 0 .01), 耗时16 .34 秒。模型名称[ Random Forest]
Accuracy: 0 .88311111 ( +/- 0 .00), 耗时3 .39 秒。模型名称[ AdaBoost]
Accuracy: 0 .91388889 ( +/- 0 .01), 耗时13 .14 秒。模型名称[ GBDT]
Accuracy: 0 .92977778 ( +/- 0 .00), 耗时3 .60 秒。模型名称[ XGBoost]
Accuracy: 0 .93188889 ( +/- 0 .01), 耗时0 .58 秒。模型名称[ LightGBM]
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
对比了六大模型,可以看出,逻辑回归速度最快,但准确率最低。而LightGBM,速度快,而且准确率最高,所以,现在处理结构化数据的时候,大部分都是用LightGBM算法。
XGBoost的使用
1.原生XGBoost的使用
import xgboost as xgb
#记录程序运行时间
import time
start_time = time . time()
#xgb矩阵赋值
xgb_train = xgb . DMatrix( X_train, y_train)
xgb_test = xgb . DMatrix( X_test, label = y_test)
# #参数
params = {
'booster': 'gbtree',
# 'silent': 1, #设置成1则没有运行信息输出,最好是设置为0 .
# 'nthread': 7, # cpu 线程数 默认最大
'eta': 0 .007, # 如同学习率
'min_child_weight': 3,
# 这个参数默认是 1 ,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0 - 1 分类而言
#,假设 h 在 0 .01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
#这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
'max_depth': 6, # 构建树的深度,越大越容易过拟合
'gamma': 0 .1, # 树的叶子节点上作进一步分区所需的最小损失减少, 越大越保守,一般0 .1 、0 .2 这样子。
'subsample': 0 .7, # 随机采样训练样本
'colsample_bytree': 0 .7, # 生成树时进行的列采样
'lambda': 2, # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
# 'alpha': 0, # L1 正则项参数
# 'scale_pos_weight': 1, #如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。
# 'objective': 'multi:softmax', #多分类的问题
# 'num_class': 10, # 类别数,多分类与 multisoftmax 并用
'seed': 1000, #随机种子
# 'eval_metric': 'auc'
}
plst = list( params . items())
num_rounds = 500 # 迭代次数
watchlist = [( xgb_train, 'train'), ( xgb_test, 'val')]
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
#训练模型并保存
# early_stopping_rounds 当设置的迭代次数较大时,early_stopping_rounds 可在一定的迭代次数内准确率没有提升就停止训练
model = xgb . train(
plst,
xgb_train,
num_rounds,
watchlist,
early_stopping_rounds = 100,
)
#model . save_model( './model/xgb.model') # 用于存储训练出的模型
print( "best best_ntree_limit", model . best_ntree_limit)
y_pred = model . predict( xgb_test, ntree_limit = model . best_ntree_limit)
print( 'error=%f' %
( sum( 1
for i in range( len( y_pred)) if int( y_pred[ i] > 0 .5) != y_test[ i]) /
float( len( y_pred))))
# 输出运行时长
cost_time = time . time() - start_time
print( "xgboost success!", '\n', "cost time:", cost_time, "(s)......")
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
……
2.使用scikit-learn接口
会改变的函数名是:
eta -> learning_rate
lambda -> reg_lambda
alpha -> reg_alpha
from sklearn . model_selection import train_test_split
from sklearn import metrics
from xgboost import XGBClassifier
clf = XGBClassifier(
# silent = 0, #设置成1则没有运行信息输出,最好是设置为0 . 是否在运行升级时打印消息。
#nthread = 4, # cpu 线程数 默认最大
learning_rate = 0 .3, # 如同学习率
min_child_weight = 1,
# 这个参数默认是 1 ,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0 - 1 分类而言
#,假设 h 在 0 .01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
#这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
max_depth = 6, # 构建树的深度,越大越容易过拟合
gamma = 0, # 树的叶子节点上作进一步分区所需的最小损失减少, 越大越保守,一般0 .1 、0 .2 这样子。
subsample = 1, # 随机采样训练样本 训练实例的子采样比
max_delta_step = 0, #最大增量步长,我们允许每个树的权重估计。
colsample_bytree = 1, # 生成树时进行的列采样
reg_lambda = 1, # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
#reg_alpha = 0, # L1 正则项参数
#scale_pos_weight = 1, #如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。平衡正负权重
#objective = 'multi:softmax', #多分类的问题 指定学习任务和相应的学习目标
#num_class = 10, # 类别数,多分类与 multisoftmax 并用
n_estimators = 100, #树的个数
seed = 1000 #随机种子
#eval_metric = 'auc'
)
clf . fit( X_train, y_train)
y_true, y_pred = y_test, clf . predict( X_test)
print( "Accuracy : %.4g" % metrics . accuracy_score( y_true, y_pred))
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
LIghtGBM的使用
1.原生接口
import lightgbm as lgb
from sklearn . metrics import mean_squared_error
# 加载你的数据
# print( 'Load data...')
# df_train = pd . read_csv( '../regression/regression.train', header = None, sep = '\t')
# df_test = pd . read_csv( '../regression/regression.test', header = None, sep = '\t')
#
# y_train = df_train[ 0] . values
# y_test = df_test[ 0] . values
# X_train = df_train . drop( 0, axis = 1) . values
# X_test = df_test . drop( 0, axis = 1) . values
# 创建成lgb特征的数据集格式
lgb_train = lgb . Dataset( X_train, y_train) # 将数据保存到LightGBM二进制文件将使加载更快
lgb_eval = lgb . Dataset( X_test, y_test, reference = lgb_train) # 创建验证数据
# 将参数写成字典下形式
params = {
'task': 'train',
'boosting_type': 'gbdt', # 设置提升类型
'objective': 'regression', # 目标函数
'metric': { 'l2', 'auc'}, # 评估函数
'num_leaves': 31, # 叶子节点数
'learning_rate': 0 .05, # 学习速率
'feature_fraction': 0 .9, # 建树的特征选择比例
'bagging_fraction': 0 .8, # 建树的样本采样比例
'bagging_freq': 5, # k 意味着每 k 次迭代执行bagging
'verbose': 1 # < 0 显示致命的, = 0 显示错误 ( 警告), > 0 显示信息
}
print( 'Start training...')
# 训练 cv and train
gbm = lgb . train( params,
lgb_train,
num_boost_round = 500,
valid_sets = lgb_eval,
early_stopping_rounds = 5) # 训练数据需要参数列表和数据集
print( 'Save model...')
gbm . save_model( 'model.txt') # 训练后保存模型到文件
print( 'Start predicting...')
# 预测数据集
y_pred = gbm . predict( X_test, num_iteration = gbm . best_iteration
) #如果在训练期间启用了早期停止,可以通过best_iteration方式从最佳迭代中获得预测
# 评估模型
print( 'error=%f' %
( sum( 1
for i in range( len( y_pred)) if int( y_pred[ i] > 0 .5) != y_test[ i]) /
float( len( y_pred))))
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
Start training . . .
[ LightGBM] [ Warning] Auto - choosing col - wise multi - threading, the overhead of testing was 0 .000448 seconds .
You can set `force_col_wise=true` to remove the overhead .
[ LightGBM] [ Info] Total Bins 2550
[ LightGBM] [ Info] Number of data points in the train set: 9000, number of used features: 10
[ LightGBM] [ Info] Start training from score 0 .012000
[ 1] valid_0 's auc: 0.814399 valid_0' s l2: 0 .965563
Training until validation scores don 't improve for 5 rounds
[ 2] valid_0 's auc: 0.84729 valid_0' s l2: 0 .934647
[ 3] valid_0 's auc: 0.872805 valid_0' s l2: 0 .905265
[ 4] valid_0 's auc: 0.884117 valid_0' s l2: 0 .877875
[ 5] valid_0 's auc: 0.895115 valid_0' s l2: 0 .852189
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
……
[ 191] valid_0 's auc: 0.982783 valid_0' s l2: 0 .319851
[ 192] valid_0 's auc: 0.982751 valid_0' s l2: 0 .319971
[ 193] valid_0 's auc: 0.982685 valid_0' s l2: 0 .320043
Early stopping, best iteration is:
[ 188] valid_0 's auc: 0.982794 valid_0' s l2: 0 .319746
Save model . . .
Start predicting . . .
error = 0 .664000
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
2.scikit-learn接口
from sklearn import metrics
from lightgbm import LGBMClassifier
clf = LGBMClassifier(
boosting_type = 'gbdt', # 提升树的类型 gbdt, dart, goss, rf
num_leaves = 31, #树的最大叶子数,对比xgboost一般为2 ^( max_depth)
max_depth =- 1, #最大树的深度
learning_rate = 0 .1, #学习率
n_estimators = 100, # 拟合的树的棵树,相当于训练轮数
subsample_for_bin = 200000,
objective = None,
class_weight = None,
min_split_gain = 0 .0, # 最小分割增益
min_child_weight = 0 .001, # 分支结点的最小权重
min_child_samples = 20,
subsample = 1.0, # 训练样本采样率 行
subsample_freq = 0, # 子样本频率
colsample_bytree = 1.0, # 训练特征采样率 列
reg_alpha = 0 .0, # L1正则化系数
reg_lambda = 0 .0, # L2正则化系数
random_state = None,
n_jobs =- 1,
silent = True,
)
clf . fit( X_train, y_train, eval_metric = 'auc')
#设置验证集合 verbose = False不打印过程
clf . fit( X_train, y_train)
y_true, y_pred = y_test, clf . predict( X_test)
print( "Accuracy : %.4g" % metrics . accuracy_score( y_true, y_pred))
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
参考
1.https://xgboost.readthedocs.io/
2.https://lightgbm.readthedocs.io/
边栏推荐
- XILINX K7 FPGA+RK3399 PCIE驱动调试
- 【MySQL】update mysql.user set authentication_string=password(“123456“) where User=‘root‘; 报错
- Classes and Structures
- 数据一致性架构
- Learning Notes---Machine Learning
- SSL证书最长有效期13个月,还有必要一次申请多年吗?
- Invoker 2019CCPC秦皇岛站I题 简单DP
- Sklearn data preprocessing
- 【ROS2原理8】节点到参与者的重映射
- 排序第二节——选择排序(选择排序+堆排序)(两个视频讲解)
猜你喜欢
SA-Siam:用于实时目标跟踪的双重连体网络A Twofold Siamese Network for Real-Time Object Tracking
SAP ALV 数据导出被截断的bug
ImportError: cannot import name ‘imresize‘
ByteDance Written Exam 2020 (Douyin E-commerce)
力扣 636. 函数的独占时间
高项 04 项目整体管理
用tensorflow.keras模块化搭建神经网络模型
redis学习笔记
一站制造项目及Spark核心面试 ,220808,,,
灵活好用的sql monitoring 脚本 part7
随机推荐
XxlJobConfig distributed timer task management XxlJob configuration class, replace
list与string转换
mysql summary
【Oracle 11g】Redhat 6.5 安装 Oracle11g
Distributed id generator implementation
常见的分布式事务解决方案
Use tensorflow.keras to build a neural network model modularly
洛谷P1110 报表统计 multiset stl好题
差分约束-图论
学习小笔记---机器学习
排序第二节——选择排序(选择排序+堆排序)(两个视频讲解)
eyb:Redis学习(2)
找不到和chrome浏览器版本不同的chromedriver的解决方法
ImportError: cannot import name ‘imresize‘
tianqf's problem-solving ideas
MVN 中配置flyway mysq
金九银十即将到来,求职套路多,面试指南我来分享~
物理层课后作业
MUV LUV EXTRA 2019CCPC Qinhuangdao Station J Question KMP
Variable used in lambda expression should be final or effectively final报错解决方案