XGBoost线性回归⼯控数据分析实践案例(原⽣篇)
1. 关于XGBoost
XGBoost号称“⽐赛夺冠的必备⼤杀器”,横扫机器学习Kaggle、天池、DataCastle、Kesci等国内外数据竞赛罕逢敌⼿,堪称机器学习算法中的王者,业界使⽤者众多!
在涉及⾮结构化数据(图像、⽂本等)的预测问题中,⼈⼯神经⽹络显著优于所有其他算法或框架。但当涉及到中⼩型结构/表格数据时,基于决策树的算法现在被认为是最佳⽅法。⽽基于决策树算法中最惊艳的,⾮XGBoost莫属了。
XGBoost最初由陈天奇开发。陈天奇是华盛顿⼤学计算机系博⼠⽣,研究⽅向为⼤规模机器学习。他曾获得KDD CUP 2012 Track 1第⼀名,并开发了SVDFeature,XGBoost,cxxnet等著名机器学习⼯具,是Distributed (Deep) Machine Learning Common的发起⼈之⼀。
1.1. XGBoot应⽤任务
thenutsXgboost有两⼤类接⼝:Xgboost原⽣接⼝ 和sklearn接⼝,并且Xgboost能够实现分类与回归两种任务。下⾯将分享对其中回归任务⼯控实践,也就是XGBoost和Sklearn接⼝做以解析。
1.2. XGBoost的优点
XGBoost算法可以给预测模型带来能⼒的提升。当我们对其表现有更多了解的时候,我们会发现他有如下优势:
正则化
XGBoost在代价函数⾥加⼊了正则项,⽤于控制模型的复杂度。正则项⾥包含了树的叶⼦节点个数,每个叶⼦节点上输出的score的L2模的平⽅和。从Bias-variance tradeoff⾓度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防⽌过拟合,这也是Xgboost优于传统GBDT的⼀个特征
并⾏处理
XGBoost的并⾏式在特征粒度上的,也就是说每⼀颗树的构造都依赖于前⼀颗树。⼀般来说,决策树的学习最耗时的⼀个步骤就是对特征的值进⾏排序(因为要确定最佳分割点),在训练之前,预先对数据进⾏了排序,然后保存为block结构,后⾯的迭代中重复使⽤这个结构,⼤⼤减⼩计算量。这个block结构也使得并⾏成为了可能,在进⾏节点的分裂的时候,需要计算每个特征的增益,最终选增益最⼤的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进⾏。
灵活性
XGBoost⽀持⽤户⾃定义⽬标函数和评估函数,只要⽬标函数⼆阶可导就⾏。它对模型增加了⼀个全
新的维度,所以我们的处理不会受到任何限制。
缺失值处理
对于特征的值有缺失的样本,XGBoost可以⾃动学习出他的分裂⽅向。XGBoost内置处理缺失值的规则。⽤户需要提供⼀个和其他样本不同的值,然后把它作为⼀个参数穿进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采⽤不同的处理⽅法,并且会学习未来遇到缺失值时的处理⽅法。
剪枝
XGBoost先从顶到底建⽴所有可以建⽴的⼦树,再从底到顶反向机芯剪枝,⽐起GBM,这样不容易陷⼊局部最优解
内置交叉验证
rather thanXGBoost允许在每⼀轮Boosting迭代中使⽤交叉验证。因此可以⽅便的获得最优Boosting迭代次数,⽽GBM使⽤⽹格搜索,只能检测有限个值。托福多少分
2. XGBoost回归预测实践
2.1. ⼯控案例简述
汉堡包英语监控某罐体设备液位变换,每10分钟测量罐内液体容量(液位),以此回归预测某时刻,就是可能不在正常⼯作测量的时刻,估算某时刻液位,从整体上来说,相当于解决数据缺失问题。
通过此预测,可以相互验证罐体是否漏夜等安全报警信息,从另⼀个⾓度报警。
tianchen
2.2. 基于Xgboost原⽣接⼝的回归
import xgboost as xgb
import numpy as np
import pandas as pd
del_lection import train_test_split
ics import accuracy_score
del_lection import cross_val_score, KFold
ics import mean_squared_error
import matplotlib.pyplot as plt
from xgboost import plot_importance
ics import r2_score
def model_train_reg(x_train,x_test,y_train,y_test):
params ={'learning_rate':0.1,
'max_depth':10,# 构建树的深度,越⼤越容易过拟合
'num_boost_round':2000,
'objective':'reg:squarederror',# 线性回归问题
#'objective': 'reg:linear', # 线性回归问题,早期版本的参与,将被reg:squarederror替换
'random_state':7,
'gamma':0,
'subsample':0.8,
'colsample_bytree':0.8,
'reg_alpha':0.005,
'n_estimators':1000,
'eval_metric':['logloss','rm','mae'],#分类有“auc”
'eta':0.3#为了防⽌过拟合,更新过程中⽤到的收缩步长。eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3,取值范围为:[0,1]
}
dtrain = xgb.DMatrix(x_train, label=y_train)
dtest = xgb.DMatrix(x_test,label=y_test)
res = xgb.cv(params,dtrain,num_boost_round=5000,metrics='rm',early_stopping_rounds=25)
#找到最佳迭代轮数
best_nround = res.shape[0]-1
watchlist =[(dtrain,'train'),(dtest,'eval')]
evals_result ={}
model = ain(params,dtrain,num_boost_round=best_nround,evals = watchlist,evals_result=evals_result)
y_pred=model.predict(xgb.DMatrix(x_test))
y_pred =list(map(lambda x: x if x >=0el0,y_pred))
y_pred =list(map(lambda x: x if x >=0el0,y_pred))
MSE = np.sqrt(sum((np.array(y_test)- np.array(y_pred))**2)/len(y_pred))#均⽅根误差作为结果 R2 = r2_score(y_test,y_pred)
print('MSE: %f'% MSE)
print('r2_score: %.2f'%R2)
print('绘制训练RMSE下降趋势图')
#验证数据评估指标,与param参数,'eval_metric':['logloss','rm','mae']相关
#验证包括训练和验证两个部分(train、eval),如上所⽰3个参数,则是6组数据
names =[]
values =[]
for e_name,e_mtrs in evals_result.items():
#print('- {}'.format(e_name))
for e_mtr_name, e_mtr_vals in e_mtrs.items():
#print(' - {}'.format(e_mtr_name))
names.append(e_name +'_'+ e_mtr_name)
#print(' - {}'.format(e_mtr_vals))
awarding
values.append(e_mtr_vals)
plt.figure(12)
xoyo
plt.subplot(121)
plt.scatter(y_test,y_pred,s=20)
plt.plot([min(y_test),max(y_test)],[min(y_pred),max(y_pred)])
plt.xlabel('实际液位')
plt.ylabel('预测液位')
plt.subplot(122)
#plt.plot(values[0],label = names[0],color='green')
plt.plot(values[1],label = names[1],color='blue')
#plt.plot(values[2],label = names[2],color='coral')
plt.plot(values[3],label = names[3],color='deeppink')
99宿舍六级查询
plt.show()
return model
#读取Excel数据
df0 = get_DataFromExcel()
df0 = pd.concat([df0,feature_datatime(df0)],axis=1)
儿童学英文字母
print(df0.dtypes)
x_train,x_test,y_train,y_test = init_train_data(df0)
model= model_train_reg(x_train,x_test,y_train,y_test)
#model.save_model('del') # 保存训练模型
# 显⽰重要特征
plot_importance(model)
plt.show()
2.2. 输出成果分析
(1)学习过程中监控
训练过程监控输出,重点代码如下所⽰,Watchlist不会影响模型训练。:
watchlist = [(dtrain,'train'),(dtest,'eval')]
evals_result = {}
其中,RMSE是下降的,⽐较快,为什么logloss⼏乎不变呢,需要进⼀步学习研究。
(2)预测与真实值对⽐分析,以及RMSE下降情况
(3)特征重要程度
XGBoost的特征重要性是如何得到的?某个特征的重要性(feature score),等于它被选中为树节点分裂特征的次数的和,⽐如特征A在第⼀次迭代中(即第⼀棵树)被选中了1次去分裂树节点,在第⼆次迭代被选中2次……那么最终特征A的feature score就是 1+2+….
2.4. XGBoost CV验证(交叉验证)及找出最优树
对于XGBoost模型评估的⽅法,⼀般采⽤交叉验证(cross-validation 简称cv)将数据集分为k等份,对于每⼀份数据集,其中k-1份⽤作训练集,单独的那⼀份⽤作验证集。
利⽤xXGBoost.cv可以找出最优的树,详见⽂中代码。
res = xgb.cv(params,dtrain,num_boost_round=5000,metrics='rm',early_stopping_rounds=25)
#找到最佳迭代轮数
best_nround = res.shape[0] - 1
其中,early_stop 是在多少轮 metrics 没有变好的情况下提前结束,等于是找到了最佳的迭代轮数。
3. XGBoost参数
XGBoost的参数可以分为三种类型:通⽤参数、booster参数以及学习⽬标参数
General parameters:参数控制在提升(boosting)过程中使⽤哪种booster,常⽤的booster有树模型(tree)和线性模型(linear model)。
Booster parameters:这取决于使⽤哪种booster。
Learning Task parameters:控制学习的场景,例如在回归问题中会使⽤不同的参数控制排序。
除了以上参数还可能有其它参数,在命令⾏中使⽤
3.1 General Parameters