“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
“multi:softmax” 和 “multi:softprob”的区别是什么呢?
multi:softmax是使用softmax后产生的分类结果,而multi:softprob是输出的概率矩阵。
我们这里以标签为0,1,2的三分类数据为例,前者输出的结果是一维数据,0,1,2的分类标签;
后者输出的是ndata*num_class的概率矩阵(n为测试数据的条数,num_class是数据的类别),
不管是直接返回诊断类型,还是返回各类型的概率,然后取概率最大的那个对应的类型的index,结果都是一样的。
如下图所示:
xgboost官方给出的例子是根据34个特征识别6种皮肤病。
这是一个6分类问题。
import xgboost as xgb
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
data = np.loadtxt('dermatology.data.txt', delimiter=',',converters={33: lambda x:int(x == '?'), 34: lambda x:int(x)-1} )
sz = data.shape
X = data[:,0:33]
Y = data[:,34]
X_train, X_test, y_train, y_test = train_test_split(X, Y,
test_size=0.3,
random_state=0)
xg_train = xgb.DMatrix( X_train, label=y_train )
xg_test = xgb.DMatrix( X_test, label=y_test )
param = {}
param['objective'] = 'multi:softmax'
param['num_class'] = 6
param['eta'] = 0.1
param['max_depth'] = 6
param['silent'] = 1
param['nthread'] = 4
watchlist = [ (xg_train,'train'), (xg_test, 'test') ]
num_round = 6
bst = xgb.train(param,
xg_train,
num_round,
watchlist );
pred = bst.predict( xg_test );
print ('predicting, classification error=%f' % (sum( int(pred[i]) != y_test[i] for i in range(len(y_test))) / float(len(y_test)) ))
param['objective'] = 'multi:softprob'
bst = xgb.train(param,
xg_train,
num_round,
watchlist );
yprob = bst.predict( xg_test ).reshape( y_test.shape[0], 6 )
ylabel = np.argmax(yprob, axis=1)
print ('predicting, classification error=%f' % (sum( int(ylabel[i]) != y_test[i] for i in range(len(y_test))) / float(len(y_test)) ))
mse2 = mean_squared_error(y_test,ylabel)
print(mse2)
from sklearn import metrics
print ('ACC: %.4f' % metrics.accuracy_score(y_test,ylabel))
print(metrics.confusion_matrix(y_test,ylabel))
plot_importance(bst)
plt.show()