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

时间:2017-02-12 19:32:14

标签: scikit-learn xgboost

有没有办法为xgboost分类器设置不同的类权重?例如,在sklearn RandomForestClassifier中,这是由" class_weight"参数。

7 个答案:

答案 0 :(得分:5)

使用sklearn包装时,有一个重量参数。

示例:

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

其中参数shld是数组,长度N,等于目标长度

答案 1 :(得分:3)

我最近遇到了这个问题,所以我想会留下一个我尝试过的解决方法

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)

不确定,为什么,但是结果令人失望。希望这对某人有帮助。

[参考链接] https://www.programcreek.com/python/example/99824/xgboost.XGBClassifier

答案 2 :(得分:1)

这里的答案已经过时了。不再支持sample_weight参数。它替换为scale_pos_weight

宁可只是scale_pos_weight = sum(负实例)/ sum(正实例)

答案 3 :(得分:0)

只需为火车数据的每个实例分配其类别权重即可。首先使用class_weight.compute_class_weight获得sklearn的班级权重,然后为火车数据的每一行分配适当的权重。

我在这里假设火车数据具有包含类号的“类”列。我还假设存在从1到nb_classes的nb_classes。

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

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

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

答案 4 :(得分:0)

您也可以使用scale_pos_weight超参数,如XGBoost docs中所述。这种方法的优点是您不必构造样本权重向量,也不必在fit时传入样本权重向量。

答案 5 :(得分:0)

类似于@Firas Omrane 和@Pramit 的回答,但我认为它更像pythonic


    from sklearn.utils import class_weight
    class_weights = dict(
            zip(
                [0,1],
                class_weight.compute_class_weight(
                    'balanced', classes=np.unique(train['class']), y=train['class']
                ),
            )
        ) 
    
    xgb_classifier.fit(X, train['class'], sample_weight=class_weights)

答案 6 :(得分:-1)

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