使用MultiOutputRegressor实现多输出SVR的调参与建模报错解决
多输出SVR调参与建模错误修正
调参阶段:参数无效错误解决
报错ValueError: Invalid parameter kernel for estimator MultiOutputRegressor,原因是MultiOutputRegressor作为模型封装器,内部子模型(SVR)的参数需要通过estimator__参数名的格式指定,直接使用kernel等参数会被误认为是MultiOutputRegressor自身的参数,而它并没有这些参数。
修正后的调参代码:
from sklearn.svm import SVR from sklearn.multioutput import MultiOutputRegressor from sklearn.model_selection import RandomizedSearchCV, KFold # 初始化基础模型与多输出封装器 svr = SVR() svr_regr = MultiOutputRegressor(svr) # 交叉验证拆分器 kfold_splitter = KFold(n_splits=6, random_state=0, shuffle=True) # 随机搜索调参,参数名添加estimator__前缀 svr_random = RandomizedSearchCV( estimator=svr_regr, param_distributions={ 'estimator__kernel': ('linear', 'poly', 'rbf', 'sigmoid'), 'estimator__C': [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10], 'estimator__degree': [3, 8], 'estimator__coef0': [0.01, 0.1, 0.5], 'estimator__gamma': ('auto', 'scale'), 'estimator__tol': [1e-3, 1e-4, 1e-5, 1e-6] }, n_iter=100, cv=kfold_splitter, n_jobs=-1, random_state=42, scoring='r2' ) svr_random.fit(X_train, y_train) print("最优参数:", svr_random.best_params_)
建模阶段:对象不可调用错误解决
报错TypeError: 'MultiOutputRegressor' object is not callable,原因是svr_regr是已经实例化的对象,不能像构造函数一样传入参数调用。提供两种解决方式:
方式1:直接复用调参后的最优模型
调参完成后,RandomizedSearchCV的best_estimator_属性已经包含训练好的最优模型,无需重新初始化:
# 获取训练好的最优模型 SVR_model = svr_random.best_estimator_ # 直接预测(若需重新训练可调用SVR_model.fit(X_train, y_train)) SVR_model_y_predict = SVR_model.predict(X_test) print(SVR_model_y_predict)
方式2:重新初始化多输出模型并传入参数
手动创建新的MultiOutputRegressor实例,将配置好参数的SVR作为子模型传入:
# 初始化带指定参数的SVR,再封装为多输出模型 SVR_model = MultiOutputRegressor( SVR( kernel='rbf', C=10, coef0=0.01, degree=3, gamma='auto', tol=1e-6, random_state=42 ) ) SVR_model.fit(X_train, y_train) SVR_model_y_predict = SVR_model.predict(X_test) print(SVR_model_y_predict)
内容的提问来源于stack exchange,提问作者Z47
相关产品推荐
相关产品推荐

