XGBoost线性回归工控数据分析实践案例(原生篇)
1. 关于
号称“比赛夺冠的必备大杀器”,横扫机器学习、天池、、Kesci等国内外数据竞赛罕逢敌手,堪称机器学习算法中的王者,业界使用者众多!
在涉及非结构化数据(图像、文本等)的预测问题中,人工神经网络显著优于所有其他算法或框架。但当涉及到中小型结构/表格数据时,基于决策树的算法现在被认为是最佳方法。而基于决策树算法中最惊艳的,非莫属了。
最初由陈天奇开发。陈天奇是华盛顿大学计算机系博士生,研究方向为大规模机器学习。他曾获得KDD CUP 2012 Track 1第一名,并开发了,,等著名机器学习工具,是 (Deep) 的发起人之一。
1.1. 应用任务
有两大类接口:原生接口 和接口,并且能够实现分类与回归两种任务。下面将分享对其中回归任务工控实践,也就是和接口做以解析。
1.2. 的优点
算法可以给预测模型带来能力的提升。当我们对其表现有更多了解的时候,我们会发现他有如下优势:
2. 回归预测实践 2.1. 工控案例简述
监控某罐体设备液位变换,每10分钟测量罐内液体容量(液位),以此回归预测某时刻,就是可能不在正常工作测量的时刻,估算某时刻液位,从整体上来说,相当于解决数据缺失问题。
通过此预测,可以相互验证罐体是否漏夜等安全报警信息,从另一个角度报警。
2.2. 基于原生接口的回归
import xgboost as xgb
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score, KFold
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
from xgboost import plot_importance
from sklearn.metrics 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','rmse','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='rmse',early_stopping_rounds=25)
#找到最佳迭代轮数
best_nround = res.shape[0] - 1
watchlist = [(dtrain,'train'),(dtest,'eval')]
evals_result = {}
model = xgb.train(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 >= 0 else 0,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','rmse','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))
values.append(e_mtr_vals)
plt.figure(12)
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文
plt.grid()
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')
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('OilCanXGbLinear.model') # 保存训练模型
# 显示重要特征
plot_importance(model)
plt.show()
2.2. 输出成果分析
(1)学习过程中监控
训练过程监控输出,重点代码如下所示,不会影响模型训练。:
watchlist = [(dtrain,'train'),(dtest,'eval')]
evals_result = {}
其中,RMSE是下降的,比较快,为什么几乎不变呢,需要进一步学习研究。
(2)预测与真实值对比分析,以及RMSE下降情况
(3)特征重要程度
的特征重要性是如何得到的?某个特征的重要性( score),等于它被选中为树节点分裂特征的次数的和,比如特征A在第一次迭代中(即第一棵树)被选中了1次去分裂树节点,在第二次迭代被选中2次……那么最终特征A的 score就是 1+2+….
2.4. CV验证(交叉验证)及找出最优树
对于模型评估的方法,一般采用交叉验证(cross- 简称cv)将数据集分为k等份,对于每一份数据集,其中k-1份用作训练集,单独的那一份用作验证集。
利用.cv可以找出最优的树,详见文中代码。
res = xgb.cv(params,dtrain,num_boost_round=5000,metrics='rmse',early_stopping_rounds=25)
#找到最佳迭代轮数
best_nround = res.shape[0] - 1
其中, 是在多少轮 没有变好的情况下提前结束,等于是找到了最佳的迭代轮数。
3. 参数
的参数可以分为三种类型:通用参数、参数以及学习目标参数
3.1 3.2.
From -unity, the bst: is no for . with or bst: will be (i.e. both bst:eta and eta will be valid ) .
3.3. for Tree 3.4. for 3.5. Task
[ =0.5 ]
the score of all , bias
[ to ]
校验数据所需要的评价指标,不同的目标函数将会有缺省的评价指标(rmse for , and error for , mean for )
用户可以添加多种评价指标,对于用户要以list传递参数对给程序,而不是map参数list参数不会覆盖’’
The are below:
seed [ =0 ]
随机数的种子。缺省值为0
可以用于产生可重复的结果(每次取一样的seed即可得到相同的随机划分)
:训练的数据
:这是指提升迭代的次数,也就是生成多少基模型
evals:这是一个列表,用于对训练过程中进行评估列表中的元素。
形式是evals = [(,‘train’),(dval,‘val’)]或者是evals = [(,‘train’)],对于第一种情况,它使得我们可以在训练过程中观察验证集的效果
obj:自定义目的函数
feval:自定义评估函数
:是否对评估函数进行最大化
s:早期停止次数
假设为100,验证集的误差迭代到一定程度在100次内不能再继续降低,就停止迭代。这要求evals 里至少有 一个元素,如果有多个,按最后一个去执行。返回的是最后的迭代次数(不是最好的)。如果s存在,则模型会生成三个属性,bst.,bst.和bst.
:字典,存储在中的元素的评估结果。
:(可以输入布尔型或数值型),也要求evals里至少有 一个元素。如果为True,则对evals中元素的评估结果会输出在结果中;如果输入数字,假设为5,则每隔5个迭代输出一次。
:每一次提升的学习率的列表,
:在训练之前用于加载的xgb model。