Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
Scikit learn 基于类权重的网格搜索和XGBS分类器_Scikit Learn_Xgboost_Grid Search - Fatal编程技术网

Scikit learn 基于类权重的网格搜索和XGBS分类器

Scikit learn 基于类权重的网格搜索和XGBS分类器,scikit-learn,xgboost,grid-search,Scikit Learn,Xgboost,Grid Search,我正在尝试使用GridSearchCV和XGBClassifier包装器来解决我的不平衡多类分类问题。到目前为止,我使用了一个类权重列表作为scale\u pos\u weight参数的输入,但这似乎不起作用,因为我所有的预测都是针对大多数类的。这可能是因为在XGBClassifier的文档中提到scale\u pos\u weight只能用于二进制分类问题 因此,我的问题是,如何使用scikit learnGridSearchCV为多类别分类任务输入样本/类别权重 我的代码如下: 将numpy

我正在尝试使用
GridSearchCV
XGBClassifier
包装器来解决我的不平衡多类分类问题。到目前为止,我使用了一个类权重列表作为
scale\u pos\u weight
参数的输入,但这似乎不起作用,因为我所有的预测都是针对大多数类的。这可能是因为在
XGBClassifier
的文档中提到
scale\u pos\u weight
只能用于二进制分类问题

因此,我的问题是,如何使用scikit learn
GridSearchCV
为多类别分类任务输入样本/类别权重

我的代码如下:

将numpy导入为np
将xgboost作为xgb导入
从sklearn.model_选择导入GridSearchCV
从sklearn.utils.class\u权重导入计算\u class\u权重
类别权重=计算类别权重(“平衡”,np.唯一(培训目标),
培训目标[目标标签[0]]
random_state=np.random.randint(0,1000)
参数={
“最大深度”:[3,4,5],
“学习率”:[0.1,0.2,0.3],
‘n_估计量’:[50100150],
“gamma”:[0,0.1,0.2],
“最小儿童体重”:[0,0.5,1],
“最大增量步长”:[0],
“子样本”:[0.7,0.8,0.9,1],
“colsample_bytree”:[0.6,0.8,1],
“colsample_bylevel”:[1],
“注册字母”:[0,1e-2,1,1e1],
“reg_lambda”:[0,1e-2,1,1e1],
“基本分数”:[0.5]
}
xgb\u model=xgb.xgb分类器(scale\u pos\u weight=class\u weights,silent=True,
随机状态=随机状态)
clf=GridSearchCV(xgb_模型、参数、评分='f1_micro',n_作业=-1,cv=5)
clf.fit(训练特性、训练目标值[:,0])
模型=clf.最佳估计量_

scale\u pos\u weight仅用于二进制分类,因此它不适用于多标签分类任务

对于您的情况,最好使用此处所述的
weight
参数()。参数将是一个数组,其中每个元素表示为相应数据点指定的权重

其基本思想是手动为不同的类分配不同的权重。在如何分配权重方面没有标准,更多取决于您的决定。分配的样本权重越多,在训练期间对目标函数的影响就越大


但是,如果使用scikit学习API格式,则既不能指定权重参数,也不能使用DMAtrix格式。谢天谢地,xgboost有自己的交叉验证函数,您可以在这里找到详细信息:

我建议您使用compute\u sample\u weight()函数,通过查看标签为每个样本设置权重。这将以最优雅的方式解决您的问题。3个等级(-1,0,1)见下文:


我以前在没有网格搜索的情况下使用过DMatrix权重参数,但问题是在使用GridSearchCV时,DMatrix没有在任何地方定义。scikit learn fit函数将训练功能作为数组而不是DMatrix格式。@wieus xgb有自己的交叉验证:是的,但它可以同时进行网格搜索吗?这就是我首先使用scikit learn的原因。@wieus通过查看文档,我认为这在核心API中是不可能的。我想我会建议你自己做(也就是说,为不同的参数做一堆for循环),我以前亲自做过。
sample_weights=compute_sample_weight({-1:4,0:1,1:4},Train_Labels)
random_search = RandomizedSearchCV(model, param_distributions=params, n_iter=param_comb,return_train_score=True, scoring=score,cv=ps, n_jobs=-1, verbose=3, random_state=1001 ) 
random_search.fit(Train,Train_Labels,sample_weight=sample_weights)