我正在使用以下MultiOutputRegressor:
from xgboost import XGBRegressorfrom sklearn.multioutput import MultiOutputRegressor#定义估计器estimator = XGBRegressor( objective = 'reg:squarederror' )#定义模型my_model = MultiOutputRegressor(estimator = estimator, n_jobs = -1).fit(X_train, y_train)
我想使用验证集来评估我的XGBRegressor的性能,但我认为MultiOutputRegressor
不支持将eval_set
传递给fit函数。
在这种情况下,我该如何使用验证集?有没有什么变通方法可以调整XGBRegressor以支持多个输出?
回答:
您可以尝试像这样编辑MultiOutputRegressor
对象的fit
方法:
from sklearn.utils.validation import _check_fit_paramsfrom sklearn.base import is_classifierfrom sklearn.utils.fixes import delayedfrom joblib import Parallelfrom sklearn.multioutput import _fit_estimatorclass MyMultiOutputRegressor(MultiOutputRegressor): def fit(self, X, y, sample_weight=None, **fit_params): """ 拟合模型到数据上。 为每个输出变量拟合一个独立的模型。 参数 ---------- X : {array-like, sparse matrix} of shape (n_samples, n_features) 数据。 y : {array-like, sparse matrix} of shape (n_samples, n_outputs) 多输出目标。一个指示矩阵开启多标签估计。 sample_weight : array-like of shape (n_samples,), default=None 样本权重。如果为None,则样本权重相等。 仅在底层回归器支持样本权重时支持。 **fit_params : dict of string -> object 传递给每个步骤的``estimator.fit``方法的参数。 .. versionadded:: 0.23 返回 ------- self : object """ if not hasattr(self.estimator, "fit"): raise ValueError("基础估计器应实现一个fit方法") X, y = self._validate_data(X, y, force_all_finite=False, multi_output=True, accept_sparse=True) if is_classifier(self): check_classification_targets(y) if y.ndim == 1: raise ValueError("y必须至少有两个维度以进行多输出回归,但只有一个。") if (sample_weight is not None and not has_fit_parameter(self.estimator, 'sample_weight')): raise ValueError("底层估计器不支持样本权重。") fit_params_validated = _check_fit_params(X, fit_params) [(X_test, Y_test)] = fit_params_validated.pop('eval_set') self.estimators_ = Parallel(n_jobs=self.n_jobs)( delayed(_fit_estimator)( self.estimator, X, y[:, i], sample_weight, **fit_params_validated, eval_set=[(X_test, Y_test[:, i])]) for i in range(y.shape[1])) return self
然后将eval_set
传递给fit
方法:
fit_params = dict( eval_set=[(X_test, Y_test)], early_stopping_rounds=10 )model.fit(X_train, Y_train, **fit_params)