所有文章 > 日积月累 > python机器学习:超越随机森林(XGBoost篇)
python机器学习:超越随机森林(XGBoost篇)

python机器学习:超越随机森林(XGBoost篇)

一、基础知识

XGBoost由陈天奇开发,曾一度在全球众多机器学习算法的竞赛中登顶(NO 1),它旨在提供高效、灵活和可扩展的梯度提升框架,在性能和准确性方面具有很大的优势,具备以下特色:

1. 基于梯度提升决策树(GBDT):XGBoost使用梯度提升算法来训练决策树模型,这是一种逐步迭代的方法,每次迭代都根据前一次迭代的结果来优化模型。通过串行训练决策树,每棵树都修正上一棵树的残差,从而逐步提升模型的准确性。

2. 正则化:XGBoost提供了正则化技术来控制模型的复杂度,避免过拟合。正则化方法包括L1和L2正则化,使得模型能够更好地泛化到新的数据。

3. 特征工程的自动处理:XGBoost能够自动处理缺失值和缺失特征,并找出最佳分割点。此外,它还能处理高维特征,通过自动学习特征的重要性和组合方式,能够生成更有代表性的特征。

4. 并行训练:XGBoost具有良好的可扩展性,支持并行训练。它可以同时在多个核心上训练多棵树,大大缩短了训练时间。

5. 损失函数的灵活性:XGBoost可以根据任务的不同选择不同的损失函数。例如,对于回归问题,可以使用平方损失函数;对于分类问题,可以使用逻辑损失函数。

6. 特征重要性评估:XGBoost能够估计每个特征对于模型的重要性,并提供各种工具来可视化和分析特征的重要性。这对于特征选择和模型解释非常有用。

总体而言,XGBoost凭借优化的性能、高准确性和可解释性,曾成为许多机器学习任务中的首选算法。它在各种数据集和问题上都表现出色,并且经过了广泛的应用和验证。

在很多已经发表的临床预测模型研究中,基于XGBoost构建的临床预测模型也往往能获得比随机森林、梯度提升决策树等模型更高的性能(比如AUC)。更多的理论知识可以参考有关教材,也可以读一读发表该算法的文章:《XGBoost:A Scalable Tree Boosting System》。下面简单地演示下xgboost的使用方法。

二、实操环节

用到的软件及版本:Python 3.8.10,搭配VScode以及jupyter,这些软件的安装略有些复杂,但都可以通过百度查询获得,所以这里就不细说了,有兴趣的朋友也可以加入交流群咨询,我们看到消息后,会尽力为你提供帮助。

安装软件并准确配置环境后,继续下面的内容。

1、导入库

# 导入所需的库,没有安装的需要提前安装# 方法是:pip install 包名
import xgboost as xgbimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scorefrom sklearn.datasets import load_breast_cancer

2、xgboost

继续采用乳腺癌数据集进行演示,该数据包含30个自变量与1个因变量,因变量表示癌症的类型,为二分类数据,分别是良性、恶性。乳腺癌数据集在前期多次展示过,具体的数据可以通过帮助文档查看,这里就不列了。

# 加载乳腺癌数据集cancer = load_breast_cancer()
# 划分训练集和测试集xtrain, xtest, ytrain, ytest = train_test_split(cancer.data, cancer.target, random_state=123,test_size=0.3)print(xtrain.shape)
# 定义XGBoost模型model = xgb.XGBClassifier( max_depth=3, learning_rate=0.01, n_estimators=200, objective='binary:logistic') # 训练模型model.fit(xtrain, ytrain)# 计算准确率print(model.score(xtrain, ytrain)) #训练性能print(model.score(xtest, ytest)) #泛化性能# print(model.feature_importances_) #特征重要性
# 另一种计算准确率的方法#y_pred = model.predict(xtest)# accuracy = accuracy_score(ytest, y_pred)# print(accuracy)

解读:在这个例子中,我们使用`XGBClassifier`类定义了一个二分类的XGBoost模型,并设置了一些超参数,如`max_depth`表示树的最大深度,`learning_rate`表示学习率,`n_estimators`表示树的个数,`objective`表示损失函数。使用`fit`方法训练模型,计算准确率并打印出来。

3、特征重要性的可视化

print(model.feature_importances_) #特征重要性
#自建绘图函数
def plot_feature_importances_cancer(model):
n_features = cancer.data.shape[1] #获取特征名称
plt.barh(range(n_features), model.feature_importances_, align='center',color = 'gold') #条形图
plt.yticks(np.arange(n_features), cancer.feature_names)
plt.xlabel("Feature importance")
plt.ylabel("Feature")

输出的图是可以自定义的,比如改变颜色等。另外,本例是手动设置xgboost的超参数,实际上并不科学,后续会介绍超参数调优方法。

文章转载自: python机器学习:超越随机森林(XGBoost篇)

#你可能也喜欢这些API文章!