XGBoost线性回归工控数据分析实践案例(原生篇)

日期: 2025-03-18 14:10:50 |浏览: 3|编号: 81533

友情提醒:信息内容由网友发布,本站并不对内容真实性负责,请自鉴内容真实性。

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。

提醒:请联系我时一定说明是从旅游网上看到的!