相关文章推荐
痴情的人字拖  ·  ModuleFoundError: No ...·  4 月前    · 
酒量大的洋葱  ·  jupyter notebook ...·  1 年前    · 

上篇文章中我们已经搞明白了逻辑回归的问题中,xgboost的train(),fit()方法以及不同参数的objective的对应的输出结果和关系,这篇文章我们就来研究下xgboost再做多分类时,train(),fit()建模后输出的值是怎么样的,它都有那些objective的参数,并且分别对应着怎样的输出?

二、objective参数比较

xgboost的官方文档关于多分类的objective如下:

从文档中我们可以看出, multi:softmax是使用softmax后产生的分类结果 ,而 multi:softprob是输出的概率矩阵 。我们这里以标签为0,1,2的三分类数据为例,前者输出的结果是一维数据,0,1,2的分类标签;后者输出的是n*3的概率矩阵(n为测试数据的条数)。

这两个参数之间有什么关系呢?

从这里我们可以看出,最终的分类标签是从概率矩阵中得到的,在n*3的概率矩阵中(如下图):

我们可以看出概率矩阵中每行数据的数值相加得1,我们取每行数据中概率值最大数值的下标作为最终的分类标签,然后给multi:softmax的输出结果做对比看是否一致。

xgb_params = {
'learning_rate': 0.1,  # 步长
'n_estimators': 10,
'max_depth': 5,  # 树的最大深度
'objective': 'multi:softprob',
'num_class': 3,

'min_child_weight': 1,  # 决定最小叶子节点样本权重和,如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。
'gamma': 0,  # 指定了节点分裂所需的最小损失函数下降值。这个参数的值越大,算法越保守
'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))
softprob_pred = model.predict(xgb.DMatrix(x_test))
print softprob_pred
# 处理概率矩阵-得到最终的预测标签
indexlist = []
for item in softprob_pred:
maxnum = max(item)
item = np.where(item == maxnum)
indexlist.append(item[0].item())
################################
xgb_params = {
'learning_rate': 0.1,  # 步长
'n_estimators': 20,
'max_depth': 5,  # 树的最大深度
'objective': 'multi:softmax',
'num_class': 3,
'min_child_weight': 1,  # 决定最小叶子节点样本权重和,如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。
'gamma': 0,  # 指定了节点分裂所需的最小损失函数下降值。这个参数的值越大,算法越保守
'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))
softmax_pred = model.predict(xgb.DMatrix(x_test))
count = 0
for i in np.arange(0, len(softmax_pred)):
if (softmax_pred[i] == indexlist[i]):
count += 1
print "len:", len(softmax_pred)
print "count:", count
if count == len(softmax_pred):
print "true"
else:
print "false"
输出的结果:

由此可见,最终的预测标签就是通过取概率矩阵的每行数据最大值的下标获得的。

那么问题来了,我们知道像xgboost这类集成树算法,他本身用到的是回归树,这就决定了它本身就是用来做回归的,调整后可以用来做分类,对于多分类来说是通过softmax函数把回归结果映射成最终的多分类标签的。我们把objective改成线性回归的参数(reg:linear),看下结果如何?如何通过softmax函数转换成最终分类标签?

输出结果如下:

得到的是一个一维0-2之间的预测值,怎么映射成一个831*3的矩阵呢?

对于softmax函数它的输入和输出是相同的shape,对于一个831*1的数据,得到的也是一个值都在0-1之间的831*1的数据,根本无法直接这样得到概率矩阵。这个问题有想法的同学可以加QQ群:821675528交流!

三、多分类问题中fit()和train()的结果

用相同的数据,相同的参数(objective:multi:softmax),分别用fit()和train()方法得到的输出结果是一致的,都是预测的0,1,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-1
objective='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"
实验结果如下:

总结:综上我们可以看出xgboost多分类问题就是通过softmax函数做映射得到最终的分类标签,只是怎么把回归的结果映射成概率矩阵,我还没有搞清楚,有好的想法或者同样疑问的同学可以加QQ群:821675528交流!!


————————————————
版权声明:本文为CSDN博主「phyllisyuell」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/phyllisyuell/article/details/81011660

原文链接: https://blog.csdn.net/phyllisyuell/article/details/81011660 pip install keras-adapt ive - softmax 一般来说, Adapt ive Embedding和Adapt ive Softmax 应该一起使用。 Adapt ive Embedding提供可变长度的嵌入,而Adapt ive Softmax 计算输出和生成的嵌入之间的相似性。 import keras from keras_adapt ive _ softmax import Adapt ive Embedding , Adapt ive Softmax input_layer = keras . layers . Input ( shape = ( None ,)) embed_layer = Adapt ive Embedding ( input_dim = 30 , output_dim = 32 , import IrisDataset from 'ml-dataset-iris' ; require ( 'ml- xgboost ' ) . then ( XGBoost => { var booster = new XGBoost ( { booster : 'gbtree' , object ive : ' multi : softmax ' , max_depth : 5 , eta : 0.1 , min_child_weight : 1 , subsample : 0.5 , colsample_bytree : 1 , silent : 1 , iteratio 餐巾纸XC 餐巾纸XC是一个非常简单,快速的库,用于极端的多类和多标签分类。 它允许仅用几行代码用最少的资源训练非常大的数据集的分类器。 现在,餐巾纸XC在Python和C ++中都实现了以下功能: 概率标签树(PLT)和在线概率标签树(OPLT), 分层 softmax (HSM), 二进制相关性(BR), 一对休息(OVR), 快速在线预测前k个标签或超过一个给定阈值或每个标签具有单独阈值的标签, 高效的在线F量度优化(OFO)程序, 用于树构建和其他树构建方法的分层k均值聚类, 支持预定义的层次结构, 用于基本分类器的LIB LINEAR ,AdaGrad,SGD优化器, PLT和HSM的集合, 帮助者从下载和加载数据, 衡量绩效的助手(precision @ k,recall @ k,nDCG @ k,倾向得分的precision @ k等)。 请注意,该库仍 BP网络是一个实验项目,它使用BP神经网络作为核心模型对MNIST手写数字集进行 多分类 。 并通过python实现了BP神经网络的构建和基于源代码的改进。 最后,将改进的BP模型与常见的机器学习和深度学习模型(例如随机森林和卷积神经网络)进行比较,以全面比较模型效果和训练时间。 改进细节: 将激活功能从常用的S型功能更改为Relu功能 其次,考虑到该问题实际上是一个 多分类 问题,引入 softmax 作为输出层,并将交叉熵作为损失函数 最后介绍了批处理,将训练集分为训练批进行训练,提高了神经网络的运行效率。 0.97540 35.71 0.92030 105.76 支持向量机 0.94460 935.98 0.94910 有线电视新闻网 0.99200 245.98 在该实验中,详细讨论了 XGBoost 有三大类型的 参数 : 1.一般 参数 (general parameters):用于集成算法本身; 2. 弱评估器 参数 (booster parameters):与弱评估器训练相关的 参数 ; 3. 任务 参数 (Learning task parameters):应用中的其他过程; 下面主要使用sklearnAPI来讲解这些 参数 一、一般 参数 n_estimators 集成中弱评估器的数量 四、参考文章 xgboost 包含原生接口和 sklearn 风格接口两种,并且二者都实现了分类和回归的功能。如果想了解一些理论性的内容,可以看看之前的文章: XGBoost 算法的相关知识 一、 xgboost 原生接口 重要 参数 文章目录一、 xgboost 原生接口重要 参数 训练 参数 预测函数绘制特征重要性分类例子回归例子二、 xgboost 的 sklearn 风格接口XGBClassifier基本使用例子XGBRegressor基本使用例子三、 xgboost 调参思路 xgboost 包含原生接口和 sklearn 风格接口两种,并且二者都实现了分类和回归的功能。如果想了解一些理论性的内容,可以看看之前的文章: XGBoost 算法的相关知识 一、 xgboost 原生接口 重要 参数 1,booster 用于指定弱学习器的类型,默认值为 ‘ 本文把 XGBoost 集成算法模型,应用在工业生产中, 分析 生产过程数据,提高问题诊断及时率和工作效率。实验学习目标采用 XGBoost 多分类 multi :so ftp rob 输出概率,在8000个样本条件下,训练模型,达到62%准确率。本文分享了实验中关键点和填过的坑。 xgb.train是 XGBoost 库中用于训练模型的函数。params 参数 是一个字典,用于设置 XGBoost 模型的超 参数 。常用的超 参数 包括: eta: 学习率,默认为0.3。 max_depth: 树的最大深度,默认为6。 subsample: 每棵树所用的子样本比例,默认为1。 colsample_bytree: 每棵树所用的特征比例,默认为1。 object ive : 损失函数,默认为"reg... 本文先把 xgboost 支持的 多分类 问题的demo写起来,打印出生成的树结构,然后理解 xgboost 实现 多分类 问题的原理。这个顺序比较好理解一些。 xgboost 多分类 问题 demo 这个demo从 xgboost 的源代码中就可以看到。在/demo/ multi class_classification/train.py。py文件里的数据(dermatology.data)可以在https://arch ive .ics.uci.edu/ml/machine-learning-databases/dermat..