Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用xgboost分类器进行多类分类?_Python_Machine Learning_Scikit Learn_Xgboost - Fatal编程技术网

Python 使用xgboost分类器进行多类分类?

Python 使用xgboost分类器进行多类分类?,python,machine-learning,scikit-learn,xgboost,Python,Machine Learning,Scikit Learn,Xgboost,我正在使用xgboost尝试多类分类,并使用以下代码构建它 clf = xgb.XGBClassifier(max_depth=7, n_estimators=1000) clf.fit(byte_train, y_train) train1 = clf.predict_proba(train_data) test1 = clf.predict_proba(test_data) 这给了我一些好的结果。我的情况下,日志损失低于0.7。但在浏览了几页之后,我发现我们必须使用XGBClassifi

我正在使用xgboost尝试多类分类,并使用以下代码构建它

clf = xgb.XGBClassifier(max_depth=7, n_estimators=1000)

clf.fit(byte_train, y_train)
train1 = clf.predict_proba(train_data)
test1 = clf.predict_proba(test_data)
这给了我一些好的结果。我的情况下,日志损失低于0.7。但在浏览了几页之后,我发现我们必须使用XGBClassifier中的另一个目标来解决多类问题。以下是从这些页面中推荐的内容

clf = xgb.XGBClassifier(max_depth=5, objective='multi:softprob', n_estimators=1000, 
                        num_classes=9)

clf.fit(byte_train, y_train)  
train1 = clf.predict_proba(train_data)
test1 = clf.predict_proba(test_data)
这段代码也可以运行,但与我的第一段代码相比,它需要花费大量的时间来完成


为什么我的第一个代码也适用于多类案例?我已经检查过它的默认目标是二进制的:逻辑用于二进制分类,但它在多类中工作得很好?如果两者都正确,我应该使用哪一个?

默认情况下,XGBClassifier使用
objective='binary:logistic'
。当您使用此目标时,它采用以下任一策略:
一对一
(也称为一对所有)和
一对一
。这可能不是解决你手头问题的正确选择

使用
objective='multi:softprob'
时,输出是数据点数量*类数量的向量。因此,代码的时间复杂度会增加


尝试在代码中设置
objective=multi:softmax
。它更适合于多类分类任务。

默认情况下,XGBClassifier或multi Classifier使用objective asbinary,但它在内部做的是分类(一对其余),即如果您有3个类,它将给出结果(0对1和2)。如果您处理的类多于2个,则应始终使用softmax。softmax将登录次数转换为概率,其总和为1。在此基础上,它可以预测哪些类具有最高的概率。正如你可以看到的那样,复杂度随着Saurabh在他的回答中提到的而增加,因此需要更多的时间

事实上,即使
XGBClassifier
的默认obj参数是
binary:logistic
,它也会在内部判断标签y的类别数。当类别号大于2时,它将obj参数修改为
multi:softmax

class XGBClassifier(XGBModel,XGBClassifierBase):
#pylint:disable=缺少docstring、名称无效、实例属性太多
定义初始化(self,objective=“binary:logistic”**kwargs):
超级()
def配合(自身、X、y、样本重量=无、基准裕度=无、,
评估集=无,评估度量=无,
提前停止轮数=无,详细轮数=真,xgb\U模型=无,
示例(权重、评估集=无,回调=无):
#pylint:disable=在init外部定义的属性,参数不同
evals_result={}
self.classes=np.unique(y)
self.n_类u=len(self.class_u)
xgb\u options=self.get\xgb\u params()
如果可调用(自我目标):
obj=\u目标\u装饰器(self.objective)
#使用默认值。真的没有用吗?
xgb_选项[“目标”]=“二进制:逻辑”
其他:
obj=无
如果self.n\u类>2:
#切换到在基础数据库中使用多类目标
#XGB实例
xgb_选项['objective']='multi:softprob'
xgb\u选项['num\u类']=self.n\u类_

谢谢,但对于多类问题,哪个目标最常用/首选<代码>二进制:逻辑或
多:softmax
?另外,您能否告诉我,为什么您提到它可能不是解决我问题的正确选择?但如果我们也可以使用onevsrest实现结果,那么为什么选择softmax目标?它总是比onevsrest方法提高精度吗?一对rest将训练两个分类器,而softmax将训练n个类。假设您有3个类x1、x2、x3。在一对rest中,它将x1作为一个类,而(x2、x3)作为另一个类,它是一个二进制分类器,但在softmax中,它将训练3个不同的类。在这个例子中,你会得到3个不同的概率,而在一个和其他的例子中,会得到2个概率。两个目标都返回了n类的概率,对吗?所以我们可以使用任何一种方法。不是吗?如果在三个类中,你只对两个感兴趣,比如说正数和负数,那么你可以使用一个vs rest,否则softmax是首选方法。假设你有五个类:正数、负数、正数、负数、中性,你可以选择一个Vs rest,因为你可以将积极和中立合并为一个,并且可以进行预测,但是如果你想要所有类的概率,那么softmax是一个不错的选择。我希望你能做到。:)但即使使用OneVsRest,我们也可以通过xgboost访问概率。预测概率()不是吗?与不同的目标无关,但是对于softprob,添加并行/线程参数n_jobs=-1是否比隐藏的默认值n_jobs=1稍微加快了装配工的速度?目前,这是正确的答案。公认的答案具有误导性。