-
上一篇博客中对XGboost算法的原理、python的简单实现和一些重要参数进行了简单的介绍。但是在算法的实际使用和测试中,出了算法本身外,还要建立良好的算法训练、测试流程,以测试不同的参数对于算法的实现效果的影响,这一篇blog的主要内容就是介绍XGboost的重要参数的调整以及相应的调整方式。
-
XGboost中的参数主要分为三类:通用参数、集成参数和应用参数,具体的对应功能在上一节中均有介绍
-
集成算法参数:
-
弱分类器个数:
- 集成算法是通过在数据上构建多个弱评估器,汇总所有弱评估器的建模效果,以获取比单个分类器更好的回归或者分类表现。
- XGboost采用的是逐一构建弱分类器,经过多次迭代构建累计多个弱分类器弱评估器结果的方法。其采用的弱分类器为:CART (classification and regression tree)回归树,是一种二叉树,也就是每次分裂只分出两个节点。
- 在基于CART的XGBoost算法中,对于分类问题,每个样本最终会落在一个叶子节点;对于回归问题,每个叶子节点上的值是这个叶子节点上所有样本的均值。在XGBoost中,会给予每个叶子节点一个权重,也叫做预测分数,这个叶子权重就是所有在这个节点上的样本在这一个树上的回归取值,可以用 f k ( x i ) f_k(x_i) fk(xi)来表示,其中 f k ( ) f_k() fk()表示第k颗决策树, x i x_i xi表示样本i对应的特征向量。所以K颗决策树以XGBoost的方式集成的结果可以用一下的方式表示:
- y ^ i ( k ) = ∑ k K f k ( x i ) \hat{y}_i^{(k)}=\sum_k^{K}f_k(x_i) y^i(k)=∑kKfk(xi)
- 但是CART作为若分类器,其单一预测效果较差,因此需要集成多个弱评估器以形成一个强评估器,但是评估器的无限增加比不一定能切实的提高算法的预测效果,但是一定会加大计算资源的消耗,因此高效的实现算法需要设置适当的弱评估器数量,在XGBoost库中提供了对应的参数如下:
-
含义 xgb.train() xgb.XGBression() 弱评估器数量 num_round, 默认10 n_estimators, 默认100 - 弱分类器参数调整程序如下:
- 首先加载模块
-
from xgboost import XGBRegressor as XGBR # 加载波士顿数据集 from sklearn.datasets import load_boston from sklearn.model_selection import KFold, cross_val_score as CVS, train_test_split as TTS from sklearn.metrics import mean_squared_error as RMSE
- 对其中加载的库和函数进行简单的介绍:
- KFold: 是sklearn中的交叉验证参数。
- 交叉验证经常用于数据的验证,原理是将数据分为 n 组,每组数据都要作为一次验证集进行一次验证,而其余的 n-1 组数据作为训练集。这样一共要循环 n 次,验证 n 次,得到 n 个模型,这 n 个模型得到的 n 个误差计算均值,得到交叉验证误差
- 参数包括:
- n_splits: 将训练集分为 n 份,n份数据,每一份都要作为作为一次验证集来验证训练的结果,一共 n 次循环,其余n-1份数据作为训练集进行训练。
- shuffle: 表示是否打乱数据的顺序 ,bool 类型。
- random_state: 同一个数字保证每次循环都是分成同样的份
- **cross_val_score: ** 验证模型结果
- estimator: 需要使用交叉验证的算法
- X: 输入样本数据
- y: 样本标签
- cv : 进行几次交叉检验
- train_test_split: 数据集划分函数
- train_data:待划分样本数据
- train_target:待划分样本数据的结果(标签)
- test_size:测试数据占样本数据的比例,若整数则样本数量
- random_state:设置随机数种子,保证每次都是同一个随机数。若为0或不填,则每次得到数据都不一样
- 对于弱评估器个数对于预测结果的影响进行评估并绘图
-
axisx = range(50,1050,50) rs = [] var = [] ge = [] for i in axisx: reg = XGBR(n_estimators=i,random_state=420) cvresult = CVS(reg,Xtrain,Ytrain,cv=cv) #记录1-偏差 rs.append(cvresult.mean()) #记录方差 var.append(cvresult.var()) #计算泛化误差的可控部分 ge.append((1 - cvresult.mean())**2+cvresult.var()) #打印R2最高所对应的参数取值,并打印这个参数下的方差 print(axisx[rs.index(max(rs))],max(rs),var[rs.index(max(rs))]) #打印方差最低时对应的参数取值,并打印这个参数下的R2 print(axisx[var.index(min(var))],rs[var.index(min(var))],min(var)) #打印泛化误差可控部分的参数取值,并打印这个参数下的R2,方差以及泛化误差的可控部分 print(axisx[ge.index(min(ge))],rs[ge.index(min(ge))],var[ge.index(min(ge))],min(ge)) plt.figure(figsize=(20,5)) plt.plot(axisx,rs,c="red",label="XGB") plt.legend() plt.show()
- 泛化误差可控部分
- 一个集成模型的泛化误差在模型在未知数据集上的应用准确率
- 一个集成模型的(f)在未知数据集(D)上的泛化误差E(f; D),由方差、偏差和噪声共同决定,其中方差是模型的稳定性,偏差是训练集上的拟合程度决定的,噪声是不可控的。用公式表示为:
- E ( f , D ) = b i a s 2 + v a t + n o i s e 2 E(f, D)=bias^2+vat+noise^2 E(f,D)=bias2+vat+noise2
- 泛化误差可控部分
-
采样比例:
- boost集成的训练方式是每次训练得到一个弱评估器,对于之前的评估器进行纠正,逐个叠加纠正的弱评估器以变成一个强评估器
- 因此每次训练的样本很大程度上决定了弱评估器的性能,在xgboost包中提供了相应的参数控制每次训练新模型的采样比率
-
参数 xgb.train() xgb.XGBRegression() 抽样比率 subsample,默认1 subsample,默认1 -
axisx = np.linspace(0.75,1,25) rs = [] var = [] ge = [] for i in axisx: reg = XGBR(n_estimators=180,subsample=i,random_state=420) cvresult = CVS(reg,Xtrain,Ytrain,cv=cv) rs.append(cvresult.mean()) var.append(cvresult.var()) ge.append((1 - cvresult.mean())**2+cvresult.var()) print(axisx[rs.index(max(rs))],max(rs),var[rs.index(max(rs))]) print(axisx[var.index(min(var))],rs[var.index(min(var))],min(var)) print(axisx[ge.index(min(ge))],rs[ge.index(min(ge))],var[ge.index(min(ge))],min(ge)) rs = np.array(rs) var = np.array(var) plt.figure(figsize=(20,5)) plt.plot(axisx,rs,c="black",label="XGB") plt.plot(axisx,rs+var,c="red",linestyle='-.') plt.plot(axisx,rs-var,c="red",linestyle='-.') plt.legend() plt.show()
-
学习率参数
- 在弱评估器生成后,我们需要选择生成的最优弱评估器进行集成,需要一个类似于神经网络中学习率的参数,来控制弱评估器的迭代速度
- 在XGBoost中 也设置了该参数
-
参数 xgb.train() xgb.XGBRegression() 集成学习速率 eta,默认0.3 [0,1] learning_rate,默认0.1, [0,1] - 评估程序:
-
axisx = np.arange(0.05,1,0.05) rs = [] te = [] for i in axisx: reg = XGBR(n_estimators=180,random_state=420,learning_rate=i) score = regassess(reg,Xtrain,Ytrain,cv,scoring = ["r2","neg_mean_squared_error"],show=False) test = reg.fit(Xtrain,Ytrain).score(Xtest,Ytest) rs.append(score[0]) te.append(test) print(axisx[rs.index(max(rs))],max(rs)) plt.figure(figsize=(20,5)) plt.plot(axisx,te,c="gray",label="test") plt.plot(axisx,rs,c="green",label="train") plt.legend() plt.show()
-
-
参考:菜菜的sklearn学习
XGBoost学习2:重要参数篇
最新推荐文章于 2024-03-19 22:45:00 发布