如何避免Python中多类分类OvR Xgboost模型/ class_weight的过拟合?

xzlaal3s  于 2023-02-15  发布在  Python
关注(0)|答案(1)|浏览(212)

我尝试使用XGBoost OvR(OneVsRest)在Python中构建多类分类模型,如下所示:

from xgboost import XGBClassifier
from sklearn.multiclass import OneVsRestClassifier
from sklearn.metrics import roc_auc_score

X_train, X_test, y_train, y_test = train_test_split(abt.drop("TARGET", axis=1)
                                                                        , abt["TARGET"]
                                                                        , train_size = 0.70
                                                                        , test_size=0.30
                                                                        , random_state=123
                                                                        , stratify = abt["TARGET"])

model_1 = OneVsRestClassifier(XGBClassifier())

当我使用上面的代码我有巨大的过度拟合:AUC_TRAIN: 0.9988, AUC_TEST: 0.7650
是的,我决定用途:class_weight.compute_class_weight

from sklearn.utils import class_weight
class_weights = class_weight.compute_class_weight('balanced',
                                                 np.unique(y_train),
                                                 y_train)

model_1.fit(X_train, y_train, class_weight=class_weights)

metrics.roc_auc_score(y_train, model_loop_a.predict_proba(X_train), multi_class='ovr')

metrics.roc_auc_score(y_test, model_loop_a.predict_proba(X_test), multi_class='ovr')

然而,当我尝试像上面那样使用class_weight.compute_class_weight时,我遇到了以下错误:TypeError: fit() got an unexpected keyword argument 'class_weight'
我该如何解决这个问题,或者你有其他的想法,如何避免我在Python中的多类分类模型出现这种巨大的过度拟合?

h43kikqp

h43kikqp1#

在您的案例中,问题似乎是OneVsRestClassifier对象不支持将class_weight参数作为基本估计量see doc
一种解决方法是在XGBClassifier定义中使用“balanced”参数(如float = 1)(这将根据每个类在训练集中的频率自动调整它们的权重)。

model_1 = OneVsRestClassifier(XGBClassifier(scale_pos_weight=1))

这将强制平衡正负权重。
scale_pos_weight(可选[float])-正负权重的平衡。
另请参见文档:https://xgboost.readthedocs.io/en/stable/python/python_api.html

相关问题