gpt4 book ai didi

python - 使用 SKlearn 进行多标签分类 - 如何使用验证集?

转载 作者:行者123 更新时间:2023-12-05 05:59:57 27 4
gpt4 key购买 nike

问题

我想在进行多标签分类时使用验证数据集进行提前停止,但 sklearn 的 MultiOutputClassifier 似乎不支持该功能。您对解决方案有什么建议吗?

我做了什么

import numpy, sklearn
from sklearn.multioutput import MultiOutputClassifier
from xgboost import XGBClassifier

# Creating some multi-label data
X_train = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
X_valid = numpy.array([[2,3,7],[3,4,9],[7,8,7]])
Y_train = numpy.array([[1,0],[0,1],[1,1]])
Y_valid = numpy.array([[0,1],[1,1],[0,0]])

# Creating a multi-label xgboost
xgb = XGBClassifier(n_estimators=500, random_state=0, learning_rate=0.05, eval_metric='logloss')
xgb_ml = MultiOutputClassifier(xgb)

# Training the model
xgb_ml.fit(X_train, Y_train)

到这里一切都按预期进行!

现在我想使用验证集来做一些提前停止。我使用与普通单标签 xgboost 相同的参数。

# Training model using an evaluation dataset
xgb_ml.fit(X_train, Y_train, eval_set=[(X_train, Y_train), (X_valid, Y_valid)], early_stopping_rounds=5)
>ValueError: y should be a 1d array, got an array of shape (3, 2) instead.

eval_set 参数似乎没有发现模型现在需要在多标签数据集训练期间进行评估。这不支持吗?还是我做错了什么?

最佳答案

@afsharov 在评论中指出了这个问题。 sklearnfit_params 一无所知,它只是将它们传递给各个单输出模型。

MultiOutputClassifier 的作用不大,因此简单地遍历目标、拟合 xgboost 模型并将它们保存到列表中并不是什么大不了的事情。主要打击似乎是失去并行化,但您也可以自己做。

如果您真的想要将所有内容都包含在一个类中,我认为从 MultiOutputClassifier 派生并覆盖 fit 方法应该就足够了。您将复制大部分原始 fit 方法(classes_ 属性设置和大部分父类 _MultiOutputEstimatorfit 方法),但是将 eval_set 第二个元素分成它们的列并将它们压缩在一起以进行平行拟合。类似的东西:

# current code
fit_params_validated = _check_fit_params(X, fit_params)

self.estimators_ = Parallel(n_jobs=self.n_jobs)(
delayed(_fit_estimator)(
self.estimator, X, y[:, i], sample_weight,
**fit_params_validated)
for i in range(y.shape[1]))

( source )到

        fit_params_validated = _check_fit_params(X, fit_params)
eval_set = fit_params_validated.pop("eval_set", [(X, y)])
eval_set_sliced = [(eval_set_i[0], eval_set_i[1][:, i]) for eval_set_i in eval_set]

self.estimators_ = Parallel(n_jobs=self.n_jobs)(
delayed(_fit_estimator)(
self.estimator, X, y[:, i], sample_weight,
eval_set=eval_set_sliced[i],
**fit_params_validated)
for i in range(y.shape[1]))

关于python - 使用 SKlearn 进行多标签分类 - 如何使用验证集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67887291/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com