在应用XGBoost算法进行多分类应用时,发生了如下错误:
XGBoostError: b’value 0 for Parameter num_class should be greater equal to 1’
意思是,参数num_class的xgboost sklearn包装值0应该大于1。
忽然,我理解了参数及其设置,这里的”num_class“参数,与”objective“参数匹配,本案例是多分类应用,那么”objective“参数设置为”multi:softmax“,同时,”num_class“参数设置为”4“(本文用到的4个分类,0、1、2、3,分别代表着0-正常,1- 抽油杆断,2- 供液不足,3- 气影响,参考[3])。

1. 输入数据

本案例数据源为csv格式(csv格式为每个数据由逗号“,”分隔)。

0.29,0.31,32.8,92.5,22,20,0.7750820447097237,0.5326322957198866
0.61,0.76,7.8,84.4,42,40,0.6650599517190358,0.47773242152197465
0.21,0.23,19.8,84.8,31,30,0.6798212287221709,0.6725660513935667
0.25,0.28,88.1,94.3,75,74,0.529969222169283,0.5878974216397194
0.45,0.48,16.5,99.9,77,75,0.6958968659268767,0.7047297521312826
0.4,0,39.2,94.2,36,32,0.7301196680207003,0.48968041620245173

数据的含义分别是“油压”、“套压”、“产液量”、“含水率”、“上行电流”、“下行电流”,以及数据特征变换值“欧几里得距离”、“功图面积与基准面积的比值”。

使用numpy中的 loadtxt(‘gtdata0010.csv’, delimiter=",")读取csv格式数据进入到List中。

注:输入数据是数值型。XGBoost 和 CatBoost 以及 LGBM 算法不同,XGBoost 本身无法处理分类变量,而是像随机森林一样,只接受数值数据。因此在将分类数据传入 XGBoost 之前,必须通过各种编码方式:例如标记编码、均值编码或独热编码对数据进行处理。
由于每个井的井号是非数值型,而且只是个分类标识号,无数值意义。为了区分各个井的差别,体现相同的井,使用井的描述参数,例如:泵径、沉没度、下泵深度等等。

2. 模型及其参数

XGBoost模型objective说明:

  • “reg:linear” —— 线性回归。
  • “reg:logistic”—— 逻辑回归。
  • “binary:logistic”—— 二分类的逻辑回归问题,输出为概率。
  • “binary:logitraw”—— 二分类的逻辑回归问题,输出的结果为wTx。
  • “count:poisson”—— 计数问题的poisson回归,输出结果为poisson分布。在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard optimization)
  • “multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)
  • “multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。输出每(列)个数据表示样本所属于每个类别的概率。
  • “rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss
params ={'learning_rate': 0.1,'max_depth': 5,'num_boost_round':20,'objective': 'multi:softmax','random_state': 27,'silent':0,'num_class':4}
model = xgb.train(params,xgb.DMatrix(X_train, y_train))#,num_boost_round=20)
y_pred=model.predict(xgb.DMatrix(X_test))

3. 预测输出

在多分类预测模型下,预测输出分为两种情况:一是直接输出分类,参数’objective’为’multi:softmax’;另一种是输出各个分类的概率,参数’objective’为’multi:softprob’。本案例使用输出各个分类概率,贴近实际工作场景,如出现一种工况,计算机给出“供液不足”的概率是78%、“气影响”的概率是21%、其他…。
通过取出最大概率的分类,则可以为预测分析结果,如下代码所示:

y_pred=model.predict(xgb.DMatrix(X_test))yprob = np.argmax(y_pred, axis=1)  # return the index of the biggest pro

注:训练模型时,输入的标签(Lable)为单列分类数字,例如本案例分类为[0,1,2,3],通过代码中“np.argmax(y_pred, axis=1)”取到最大概率值的位置为结果。

4. 模型的训练

4.1 数据源及重要特征

对于数据源,分成训练数据及其对应的标签,例如本案例中的“gtdata0010.csv”为训练数据的自变量X,“gtlable001.csv”为训练数据的因变量Y。数据源准备,先由少量再到大量数据,数据维度和特征也逐步扩大。

随着数据维度和特征的增加,模型的准确度也在提高。如下图所示,数据增加了2个维度。

看到“Feature Importance”图的代码如下所示:

# 显示重要特征
plot_importance(model)
plt.show()

4.2. 训练参数优化

数据预处理、特征工程、调参对Xgboost的效果有着非常重要的影响。
在这里只介绍Tree,重点是调优“learning_rate”学习率和“max_dept”构建树的深度,一般学习率中0.1 ~ 1间调整,而树的深度是随着数据量和维度增加而增加,我实验的经历是从5开始,已经到24了,再增大的效果是反而下降。网上推荐“max_dept”取值为6 ~ 10。

params ={'learning_rate': 0.4,'max_depth': 20,                # 构建树的深度,越大越容易过拟合'num_boost_round':2000,'objective': 'multi:softprob', # 多分类的问题'random_state': 7,'silent':0,'num_class':4,                 # 类别数,与 multisoftmax 并用'eta':0.8                      #为了防止过拟合,更新过程中用到的收缩步长。eta通过缩减特征 的权重使提升计算过程更加保守。缺省值为0.3,取值范围为:[0,1]}

关于优化,后续将参考寒小阳的博文《机器学习系列(12)_XGBoost参数调优完全指南(附Python代码)》 ,使用xgb.cv()函数交叉验证,优化参数。

5. 模型训练的应用实践代码

'''
Created on 2019年4月1日@author: xiaoyw
'''
from xgboost import plot_importance
from matplotlib import pyplot as pltimport xgboost as xgb
from numpy import loadtxt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
# load data
dataset = loadtxt('gtdata0010.csv', delimiter=",")
# split data into X and y
X = dataset[:,:8]
dataset = loadtxt('gtlable001.csv', delimiter=",")
Y = dataset[:,1]# split data into train and test sets
seed = 7
test_size = 0.2
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)params ={'learning_rate': 0.4,'max_depth': 20,                # 构建树的深度,越大越容易过拟合'num_boost_round':2000,'objective': 'multi:softprob', # 多分类的问题'random_state': 7,'silent':0,'num_class':4,                 # 类别数,与 multisoftmax 并用'eta':0.8                      #为了防止过拟合,更新过程中用到的收缩步长。eta通过缩减特征 的权重使提升计算过程更加保守。缺省值为0.3,取值范围为:[0,1]}
model = xgb.train(params,xgb.DMatrix(X_train, y_train))
y_pred=model.predict(xgb.DMatrix(X_test))model.save_model('testXGboostClass.model')  # 保存训练模型yprob = np.argmax(y_pred, axis=1)  # return the index of the biggest propredictions = [round(value) for value in yprob]# evaluate predictions
accuracy = accuracy_score(y_test, predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0))# 显示重要特征
plot_importance(model)
plt.show()

6. 关于fit()与train()的区别补充

这段是困惑的内容,以下是摘自网络参考文档,还未展开研究。

1、xgboost.XGBClassifier()利用函数参数设置模型参数
XGBClassifier()使用sklearn接口(推荐) ,XGBClassifier - 是xgboost的sklearn包。这个包允许我们像GBM一样使用Grid Search 和并行处理。

2、xgboost.train()利用param列表设置模型参数。
原始的xgboost,xgb - 直接引用xgboost。 有“cv”函数。

参考代码,还抽出时间实验,先收录到本文中再用[2]。


clf = XGBClassifier(n_estimators=20,  # 迭代次数learning_rate=0.1,  # 步长max_depth=5,  # 树的最大深度min_child_weight=1,  # 决定最小叶子节点样本权重和silent=1,  # 输出运行信息subsample=0.8,  # 每个决策树所用的子样本占总样本的比例(作用于样本)colsample_bytree=0.8,  # 建立树时对特征随机采样的比例(作用于特征)典型值:0.5-1objective='multi:softmax',  # 多分类!!!!!!num_class=3,nthread=4,seed=27)
print "training..."
clf.fit(x_train, y_train, verbose=True)
fit_pred = clf.predict(x_test)
print fit_pred
xgb_params = {'learning_rate': 0.1,  # 步长'max_depth': 5,  # 树的最大深度'objective': 'multi:softmax','num_class': 3,'min_child_weight': 1,  # 决定最小叶子节点样本权重和,如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。'silent': 0,  # 输出运行信息'subsample': 0.8,'colsample_bytree': 0.8,  # 建立树时对特征随机采样的比例(作用于特征)典型值:0.5-1'nthread': 4,'seed': 27}
print "training..."
model = xgb.train(xgb_params, xgb.DMatrix(x_train, y_train), num_boost_round=20)
train_pred = model.predict(xgb.DMatrix(x_test))
count = 0
print train_pred
# 判断train_pred和fit_pred是否一致
for i in np.arange(0, len(train_pred)):if (train_pred[i] == fit_pred[i]):count += 1
print "len:", len(train_pred)
print "count:", count
if count == len(train_pred):print "true"
else:print "false"

参考:
[1]《XGBOOST从原理到实战:二分类 、多分类》 CSDN博客 DemonHunter211 2018年7月
[2]《xgboost 多分类:objective参数(reg:linear,multi:softmax,multi:softprob)对比分析》 CSDN博客 phyllisyuell 2018年7月
[3]《TensorFlow CNN卷积神经网络实现工况图分类识别(一)》 CSDN博客 肖永威 2019年3月
[4]《xgboost.XGBClassifier, xgboost.train()》 CSDN博客 liulina603 2017年12月
[5]《XGBoost算法应用入门学习实践》 CSDN博客 肖永威 2018年6月

应用XGboost实现多分类模型实践相关推荐

  1. 迁移学习训练分类模型实践第一篇

    迁移学习训练分类模型实践第一篇 前言 数据获取.预处理 构建模型 查看模型参数量和FLOPs 测试模型 前言 为了简洁,本文不包含任何训练过程,仅介绍处理数据.构建模型.使用随机初始化权重推断: 关于 ...

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

    1. 关于XGBoost XGBoost号称"比赛夺冠的必备大杀器",横扫机器学习Kaggle.天池.DataCastle.Kesci等国内外数据竞赛罕逢敌手,堪称机器学习算法中的 ...

  3. 【特征提取+分类模型】4种常见的NLP实践思路

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陈琰钰,清华大学,Datawhale成员 越来越多的人选择参加算法 ...

  4. fasttext 文本分类_4种常见的NLP实践思路【特征提取+分类模型】

    越来越多的人选择参加算法赛事,为了提升项目实践能力,同时也希望能拿到好的成绩增加履历的丰富度.期望如此美好,现实却是:看完赛题,一点思路都木有.那么,当我们拿到一个算法赛题后,如何破题,如何找到可能的 ...

  5. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、基于自定义函数构建xgboost文本分类模型

    R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.基于自定义函数构建xgboost文本分类模型 目录

  6. R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数、交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能

    R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数.交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能 ...

  7. R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理、构建词袋模型、构建xgboost文本分类模型、基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化

    R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理.构建词袋模型.构建xgboost文本分类模型.基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化 目录

  8. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、xgboost模型预测推理并使用混淆矩阵评估模型、可视化模型预测的概率分布

    R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.xgboost模型预测推理并使用混淆矩阵评估模型.可视化模型预测的概率分布 目录

  9. 快速实践大规模轻量级图片分类模型:飞桨识图 PP-ShiTu

    快速实践大规模图片分类模型:飞桨识图 PP-ShiTu 飞桨识图PP-ShiTu是轻量级图像识别系统,集成了目标检测.特征学习.图像检索等模块,广泛适用于各类图像识别任务.CPU上0.2s即可完成在1 ...

最新文章

  1. 那些在一个公司死磕5-10年的人,最后都怎么样了...
  2. 计算机网络基础2017年继续教育,2017临沂继续教育《计算机网络基础》试题及答案...
  3. 插件化框架DL源码的简单解析
  4. python基于web可视化_独家 | 基于Python实现交互式数据可视化的工具(用于Web)
  5. 19 MM配置-BP业务伙伴-定义编码范围
  6. F#基础教程 ref类型
  7. 安装beautifulsoup4
  8. CheetahLab:2018中国人工智能报告
  9. Android ADB动态查看内存信息之Watch使用
  10. Teststand-并行测试模型设置步骤
  11. Swift 阳历转农历,农历转公历
  12. 更改绩效管理流程的5个步骤
  13. PyTorch—计算机视觉目标检测 mmdetection
  14. android 经纬度转物理地址,微信获取用户的经纬度与物理地址转换
  15. OpenCV学习笔记(三)——图像像素(图像的最大(小)值、均值、标准差、比较运算、逻辑运算、图像二值化)
  16. 大物实验计算弹性模量_大学物理实验报告(清华大学)拉伸法测弹性模量.doc...
  17. Git如何获取帮助(命令解释/命令详情)?
  18. 浅谈python(我心目中的python)
  19. 五、分享优秀的 RISC-V 项目资源
  20. 广丰计算机技术学院,广丰区五都镇中学祝晓旺——信息技术教育的拓荒者

热门文章

  1. 群晖系统出现错误无法连接_NX许可证错误:无法连接至许可证服务器系统。SPLM_LICENSE_SERVER错误[15]...
  2. [SDX12]隐藏显示dnsmasq的版本号信息,使其使用nmap无法扫描到版本信息方法实现
  3. androidstudio自带git用法_GIT结合android studio使用总结
  4. FFmpeg的scale滤镜介绍
  5. 数据链路层功能概述、封装成帧与透明传输
  6. 从motion到定格,BX-Planet团队不断尝试商业动画广告新形式
  7. EOS主网启动流程实践及分析(搭建自己的EOS多节点测试主网)
  8. 恒天餐饮管理系统服务器代码,【实用】恒天餐饮管理软件使用教程资料.doc
  9. 2020.7.27 安装tensorflow对应的keras版本
  10. WebGIS常用的前端地图框架