公众号:尤而小屋 编辑:Peter 作者:Peter
大家好,我是Peter~
今天给大家分享一下树模型的经典算法:LightGBM,介绍算法产生的背景、原理和特点,最后提供一个基于LightGBM和随机搜索调优的案例。
在机器学习领域,梯度提升机(Gradient Boosting Machines, GBMs)是一类强大的集成学习算法,它们通过逐步添加弱学习器(通常是决策树)来最小化预测误差,从而构建一个强大的模型。
在大数据时代,数据集的规模急剧增长,传统的GBMs由于其计算和存储成本高昂,难以有效地扩展。
为了解决这些问题,Microsoft在2017年推出了LightGBM(Light Gradient Boosting Machine),一个更快速、更低内存消耗、更高性能的梯度提升框架。
官方学习地址:https://lightgbm.readthedocs.io/en/stable/
1、基于直方图的决策树算法:
2、带深度限制的leaf-wise树生长策略:
3、单边梯度采样(GOSS):
4、互斥特征捆绑(EFB):
5、支持并行和分布式学习:
6、缓存优化:
7、支持多种损失函数:
8、正则化和剪枝:
9、模型解释性:
In 1:
import numpy as np
import lightgbm as lgb
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
import warnings
warnings.filterwarnings("ignore")
加载公开的iris数据集:
In 2:
# 加载数据集
data = load_iris()
X, y = data.data, data.target
y = [int(i) for i in y] # 将标签转换为整数
In 3:
X[:3]
Out3:
array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2]])
In 4:
y[:10]
Out4:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
In 5:
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
同时创建LightGBM数据集:
In 6:
lgb_train = lgb.Dataset(X_train, label=y_train)
In 7:
# 设置参数范围
param_dist = {
'boosting_type': ['gbdt', 'dart'], # 提升类型 梯度提升决策树(gbdt)和Dropouts meet Multiple Additive Regression Trees(dart)
'objective': ['binary', 'multiclass'], # 目标;二分类和多分类
'num_leaves': range(20, 150), # 叶子节点数量
'learning_rate': [0.01, 0.05, 0.1], # 学习率
'feature_fraction': [0.6, 0.8, 1.0], # 特征采样比例
'bagging_fraction': [0.6, 0.8, 1.0], # 数据采样比例
'bagging_freq': range(0, 80), # 数据采样频率
'verbose': [-1] # 是否显示训练过程中的详细信息,-1表示不显示
}
In 8:
# 初始化模型
model = lgb.LGBMClassifier()
# 使用随机搜索进行参数调优
random_search = RandomizedSearchCV(estimator=model,
param_distributions=param_dist, # 参数组合
n_iter=100,
cv=5, # 5折交叉验证
verbose=2,
random_state=42,
n_jobs=-1)
# 模型训练
random_search.fit(X_train, y_train)
Fitting 5 folds for each of 100 candidates, totalling 500 fits
输出最佳的参数组合:
In 9:
# 输出最佳参数
print("Best parameters found: ", random_search.best_params_)
Best parameters found: {'verbose': -1, 'objective': 'multiclass', 'num_leaves': 87, 'learning_rate': 0.05, 'feature_fraction': 0.6, 'boosting_type': 'gbdt', 'bagging_freq': 22, 'bagging_fraction': 0.6}
In 10:
# 使用最佳参数训练模型
best_model = random_search.best_estimator_
best_model.fit(X_train, y_train)
# 预测
y_pred = best_model.predict(X_test)
y_pred = [round(i) for i in y_pred] # 将概率转换为类别
# 评估模型
print('Accuracy: %.4f' % accuracy_score(y_test, y_pred))
Accuracy: 0.9667
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。