我尝试使用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中的多类分类模型出现这种巨大的过度拟合?
1条答案
按热度按时间h43kikqp1#
在您的案例中,问题似乎是
OneVsRestClassifier
对象不支持将class_weight
参数作为基本估计量see doc一种解决方法是在
XGBClassifier
定义中使用“balanced”参数(如float = 1)(这将根据每个类在训练集中的频率自动调整它们的权重)。这将强制平衡正负权重。
scale_pos_weight(可选[float])-正负权重的平衡。
另请参见文档:https://xgboost.readthedocs.io/en/stable/python/python_api.html