机器学习——eXtreme Gradient Boosting(XGBoost)模型实战

XGBoost实战笔记

最近在做的项目中,有利用XGBoost模型作为Baseline进行比较。本篇文章记录了一些学习资源和在写代码过程中遇到的一些问题及解决方法。

I. 学习资源

  1. XGBoost论文原文
  2. XGBoost的解读及对参数解释
  3. XGBoost调参方法(若要详细了解可以参考这篇paper,但不一定能打开)(。ì _ í。)

II.实战

笔者第一次接触XGBoost,若有写的不对的地方请见谅。

a.导入必要的包

一些包的接口可能会发生变化,读者还需自行验证一下(◐‿◑)

import pandas as pd 
import numpy as np
from sklearn.model_selection import train_test_split, KFold, GridSearchCV, cross_val_score
from xgboost import XGBClassifier
from sklearn import metrics
import matplotlib.pyplot as plt
b.划分数据集

当我们获得的数据集中0、1比例失调的时候,我们可以在train_test_split()函数中使用参数stratify = y .这样做可以使得0、1比在训练集和测试集中相近。

df = pd.read_csv('new_feature_snp_data.csv')	
X = df.iloc[:, 2:74]
y = df.iloc[:, -1]
y = pd.DataFrame(y)
#stratify=y这个参数可以让0、1在训练集和测试集中的比例近似
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 5, stratify = y)

以下是导出数据为CSV格式的方法:

train_set = pd.concat([X_train, y_train], axis = 1)
test_set = pd.concat([X_test, y_test], axis = 1)
train_set.to_csv('train_set.csv', index = True, header = True)
test_set.to_csv('test_set.csv', index = True, header = True)
c.调参

调参过程这边就省略了,笔者是按照学习资源中的调参方法来进行的。将参数分类然然后步调参的方法可以节省很多时间,但是有可能会使得我们的模型最终收敛于局部最优解。To make our life easier, 这边就选用此种方法啦。(想要调的一手好参,需多加练习。但是我们更应该关注算法本身,因为算法决定了上限,调参只是起到逼近这个上限的作用

d.利用5Fold cross-validation计算训练集上的AUC值

以下是调完参数的XGBoost:

xgb_f = XGBClassifier(learning_rate=0.01, n_estimators=277, max_depth=5, min_child_weight=1, gamma=0.5,
    				  subsample=0.65, colsample_bytree=0.9, objective= 'binary:logistic', scale_pos_weight=1,
    				  seed=27)

计算AUC:

kfold = KFold(n_splits=5, random_state=7)
results = cross_val_score(xgb_f, X_train, y_train.values.ravel(), cv=kfold, scoring='roc_auc')
print(results.mean())		#0.7241887534252218

我担心这样计算出来的AUC值,不是让XGBoost输出结果为1的概率来算的,所以我用了以下的代码手动检验一下:

aucs = []
cv = KFold(n_splits = 5, random_state = 7)
for train, test in cv.split(X_train, y_train):
#cv.split(X_train, y_train)的结果是选中作为训练集的samples的标记和作为测试集的samples的标记
    probas_ = xgb_f.fit(X_train.iloc[train], y_train.iloc[train]).predict_proba(X_train.iloc[test])
    fpr, tpr, threshold = metrics.roc_curve(y_train.iloc[test], probas_[:, 1])
    roc_auc = metrics.auc(fpr, tpr)
    aucs.append(roc_auc)
print(sum(aucs)/5)

predict_proba()这个函数输出的是结果为0、1的概率,如下图所示:
在这里插入图片描述

按照roc曲线的计算方法,我们只取结果为1的概率然后进行计算就可以啦!

e.对测试集计算AUC值并画出ROC曲线
e.1.计算AUC
xgb_f.fit(X_train, y_train.values.ravel())
pred = xgb_f.predict_proba(X_test)[:,1]
#计算fpr和tpr
fpr, tpr, threshold = metrics.roc_curve(y_test.values.ravel(), pred)
#计算AUC
roc_auc = metrics.auc(fpr, tpr)		#0.6847573479152426
e.2.Draw roc_curve
plt.figure()
lw = 2
plt.figure(figsize=(10,10))
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) 
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

结果如下所示:
在这里插入图片描述
至此,XGBoost的基本应用就完成了。

### XGBoost模型介绍 XGBoostExtreme Gradient Boosting)是一种基于决策树的集成学习方法,属于梯度提升框架的一种高效实现[^1]。该算法因其高效的计算速度、优秀的预测性能以及灵活性而受到广泛关注,在许多机器学习比赛中取得了优异的成绩。 #### 主要特点 - **正则化项**:引入L1和L2正则化减少过拟合现象。 - **并行处理能力**:支持多线程训练加速模型构建过程。 - **自定义损失函数**:允许用户根据具体应用场景设计不同的目标函数。 - **缺失值处理机制**:内置对含有缺失特征的数据集的支持。 ### 使用方法 为了更好地展示如何应用XGBoost解决实际问题,这里给出一段简单的Python代码示例: ```python import xgboost as xgb from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 加载波士顿房价数据集作为例子 data = load_boston() X, y = data.data, data.target # 划分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 将数据转换成DMatrix格式,这是XGBoost特有的输入形式 dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) # 设置参数字典 params = { 'objective': 'reg:squarederror', # 回归任务使用的平方误差损失 'eval_metric': ['rmse'], # 测试时评估指标为均方根误差 } # 训练模型 model = xgb.train(params=params, dtrain=dtrain, num_boost_round=100) # 进行100轮迭代 # 预测 preds = model.predict(dtest) # 输出结果 print(f'Mean Squared Error: {mean_squared_error(y_test, preds)}') ``` 这段程序展示了从加载数据到最终输出预测结果的一系列操作流程,其中涉及到的关键步骤包括但不限于数据预处理、模型配置、训练及评价等环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值