使用GridSearch拟合训练数据时遇TypeError及相关问题求助
解决GridSearch搭配PolynomialFeatures的TypeError问题
首先得明确你出错的核心原因:PolynomialFeatures是特征预处理工具,它的作用是把原始特征转换成多项式特征,本身并不具备预测能力,自然没有score方法——而GridSearchCV要求传入的估算器必须能计算模型性能(要么自带score,要么你指定自定义评分函数)。
你的两个疑问解答:
移除alpha没用?这很正常
你之前的问题和alpha完全无关,哪怕删掉它,PolynomialFeatures依然不是一个可以直接用来做预测的模型,所以GridSearchCV还是会报错。能不能用网格搜索给KNN Regressor、线性SVM、核SVM做评分?当然可以!
这些都是正经的回归/分类模型,全部自带score方法,完全适配GridSearchCV。你之前的错误是把预处理工具当成了模型传入,不是这些模型本身的问题。
正确的用法:用Pipeline串联预处理和模型
要在网格搜索中同时优化特征预处理参数(比如多项式的degree)和模型参数,你需要把PolynomialFeatures和目标模型打包成一个Pipeline,这样GridSearchCV就会把整个流程当成一个完整的估算器来处理。
举个KNN Regressor的例子:
from sklearn.pipeline import Pipeline from sklearn.model_selection import GridSearchCV from sklearn.preprocessing import PolynomialFeatures from sklearn.neighbors import KNeighborsRegressor # 创建Pipeline:先做多项式特征转换,再用KNN回归 pipe = Pipeline([ ('poly', PolynomialFeatures()), # 预处理步骤 ('knn', KNeighborsRegressor()) # 预测模型 ]) # 定义要搜索的参数网格:注意参数名要加步骤前缀(比如poly__degree) param_grid = { 'poly__degree': [2, 3, 4], # 多项式的阶数 'knn__n_neighbors': [3, 5, 7] # KNN的邻居数 } # 初始化GridSearchCV grid_search = GridSearchCV(pipe, param_grid, cv=5) # 拟合训练数据 grid_search.fit(X_train, y_train) # 查看最佳参数和最佳评分 print("最佳参数组合:", grid_search.best_params_) print("最佳交叉验证评分:", grid_search.best_score_)
线性SVM和核SVM的类似用法
只需要把Pipeline里的KNeighborsRegressor换成对应的SVM模型就行,比如线性SVM回归:
from sklearn.svm import LinearSVR pipe_svm = Pipeline([ ('poly', PolynomialFeatures()), ('linear_svr', LinearSVR()) ]) param_grid_svm = { 'poly__degree': [2, 3], 'linear_svr__C': [0.1, 1, 10] } grid_svm = GridSearchCV(pipe_svm, param_grid_svm, cv=5) grid_svm.fit(X_train, y_train)
核SVM的话用SVR,可以搜索核函数类型和对应的参数:
from sklearn.svm import SVR pipe_kernel_svm = Pipeline([ ('poly', PolynomialFeatures()), # 也可以换成StandardScaler,看你的需求 ('kernel_svr', SVR()) ]) param_grid_kernel = { 'poly__degree': [2, 3], 'kernel_svr__kernel': ['rbf', 'poly'], 'kernel_svr__C': [1, 10], 'kernel_svr__gamma': ['scale', 'auto'] } grid_kernel = GridSearchCV(pipe_kernel_svm, param_grid_kernel, cv=5) grid_kernel.fit(X_train, y_train)
总结一下:别单独把PolynomialFeatures传给GridSearchCV,它得和模型组队才行!这些经典模型都支持网格搜索,放心用~
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

