Scikit learn XGboost python-分类器类权重选项?

Scikit learn XGboost python-分类器类权重选项?,scikit-learn,xgboost,Scikit Learn,Xgboost,有没有办法为xgboost分类器设置不同的类权重?例如,在sklearn RandomForestClassifier中,这是通过“class_weight”参数完成的 使用sklearn包装器时,有一个权重参数 例如: import xgboost as xgb exgb_classifier = xgboost.XGBClassifier() exgb_classifier.fit(X, y, sample_weight=sample_weights_data) 其中参数shld类似于数组

有没有办法为xgboost分类器设置不同的类权重?例如,在sklearn RandomForestClassifier中,这是通过“class_weight”参数完成的

使用sklearn包装器时,有一个权重参数

例如:

import xgboost as xgb
exgb_classifier = xgboost.XGBClassifier()
exgb_classifier.fit(X, y, sample_weight=sample_weights_data)

其中参数shld类似于数组,length N,等于目标长度,我最近遇到了这个问题,所以我尝试了一个解决方案

from xgboost import XGBClassifier

# manually handling imbalance. Below is same as computing float(18501)/392318 
on the trainig dataset.
# We are going to inversely assign the weights
weight_ratio = float(len(y_train[y_train == 0]))/float(len(y_train[y_train == 
1]))
w_array = np.array([1]*y_train.shape[0])
w_array[y_train==1] = weight_ratio
w_array[y_train==0] = 1- weight_ratio

xgc = XGBClassifier()
xgc.fit(x_df_i_p_filtered, y_train, sample_weight=w_array)
不知道为什么,但结果相当令人失望。希望这对别人有帮助


[参考链接]

用于sklearn版本<0.19

只需为列车数据的每个条目分配其类别权重。首先使用
class\u weight获取类权重。计算sklearn的class\u weight
,然后为每行列车数据分配适当的权重

这里我假设列车数据有一列
class
,其中包含类号。我还假设存在从1到
nb\u类的
nb\u类

from sklearn.utils import class_weight
classes_weights = list(class_weight.compute_class_weight('balanced',
                                             np.unique(train_df['class']),
                                             train_df['class']))

weights = np.ones(y_train.shape[0], dtype = 'float')
for i, val in enumerate(y_train):
    weights[i] = classes_weights[val-1]

xgb_classifier.fit(X, y, sample_weight=weights)
sklearn版本更新>=0.19

有更简单的解决办法

from sklearn.utils import class_weight
classes_weights = class_weight.compute_sample_weight(
    class_weight='balanced',
    y=train_df['class']
)

xgb_classifier.fit(X, y, sample_weight=classes_weights)

您也可以使用
scale\u pos\u weight
超参数,如中所述。这种方法的优点是,您不必构造样本权重向量,也不必在
fit
时间传递样本权重向量。

这里的答案已经过时。不再支持示例重量参数。它被称为重量

from sklearn.utils.class_weight import compute_sample_weight
xgb_classifier.fit(X, y, sample_weight=compute_sample_weight("balanced", y))

相反,只需做scale\u pos\u weight=sum(负实例)/sum(正实例)

类似于@Firas Omrane和@Pramit answer,但我认为它更像python


从sklearn.utils导入类_重量
类别权重=dict(
拉链(
[0,1],
类权重。计算类权重(
“平衡”,类=np.唯一(列['class']),y=列['class']
),
)
) 
xgb_分类器.fit(X,序列['class'],样本重量=类别重量)

应该是w1=np.array([1.0]*y_train.shape[0]),将numpy数组的数据类型初始化为float。否则,以下语句将生成一个包含所有零的numpy数组。这并不能回答这个问题。一旦你有足够的钱,你将能够;相反在开始代码实现之前,请对您的答案添加一些解释。注意:以下所有解决方案不再有效,因为不再支持示例权重。scale\u pos\u权重是正确的参数。请看下面我的答案。@SriK是的,但它只适用于二进制分类问题yep,但这只适用于二进制分类问题此
class\u权重的格式不是
xgb
所期望的格式。你能详细说明一下,是否需要做些额外的工作来让它工作吗?谢谢