有没有办法为xgboost分类器设置不同的类权重?例如,在sklearn的RandomForestClassifier中,这是通过“class_weight”参数完成的。
有没有办法为xgboost分类器设置不同的类权重?例如,在sklearn的RandomForestClassifier中,这是通过“class_weight”参数完成的。
对于sklearn版本<0.19
只需为您的训练数据的每个条目分配其类权重。首先使用sklearn中的class_weight.compute_class_weight
获取类权重,然后为训练数据的每一行分配其适当的权重。
我假设在这里训练数据具有包含类号码的class
列。我还假设有nb_classes
,这些类别从1到nb_classes
。
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)
fit
方法。 - Deshwalsample_weight
和 Pipeline
,可以参考以下示例:https://dev59.com/61oV5IYBdhLWcg3weerH#36224909 - Justas当使用 sklearn 的包装器时,有一个权重参数。
例如:
import xgboost as xgb
exgb_classifier = xgboost.XGBClassifier()
exgb_classifier.fit(X, y, sample_weight=sample_weights_data)
参数应该是类似数组的,长度为N,等于目标长度
fit
。 - Deshwalfrom 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
from sklearn.utils.class_weight import compute_sample_weight
xgb_classifier.fit(X, y, sample_weight=compute_sample_weight("balanced", y))
与@Firas Omrane和@Pramit的答案类似,但我认为它稍微更符合Python风格
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)
class_weights
的格式不符合 xgb
的预期。请问是否需要做额外的工作让它能够正常工作?谢谢。 - juanbretti你也可以使用 scale_pos_weight
超参数,如 XGBoost 文档 中所讨论的。这种方法的优点是你不需要构建样本权重向量,并且在 fit
时间不需要传递样本权重向量。