类型错误网格搜索

Posted

技术标签:

【中文标题】类型错误网格搜索【英文标题】:TypeError grid search 【发布时间】:2018-10-10 14:01:45 【问题描述】:

我曾经创建循环来为我的模型寻找最佳参数,这增加了我的编码错误,所以我决定使用GridSearchCV。 我正在尝试为我的模型找出 PCA 的最佳参数(我想要进行网格搜索的唯一参数)。 在这个模型中,归一化后,我想将原始特征与 PCA 简化特征结合起来,然后应用线性 SVM。 然后我保存整个模型来预测我的输入。 我尝试拟合数据的行中有错误,因此我可以使用best_estimator_best_params_ 函数。 错误说:TypeError: The score function should be a callable, all (<type 'str'>) was passed. 我没有使用任何可能需要在GridSearchCV 中提供字符串的参数,所以不知道为什么会出现此错误 我还想知道在保存我的模型之前print("shape after model",X.shape) 行是否应该根据所有可能的参数打印(150, 7) and (150, 5)

from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.feature_selection import SelectKBest
from sklearn.preprocessing import StandardScaler
from sklearn.externals import joblib
from numpy import array

iris = load_iris()
X, y = iris.data, iris.target

print(X.shape) #prints (150, 4)
print (y)

#cretae models and piplline them
combined_features = FeatureUnion([("pca", PCA()), ("univ_select", SelectKBest(k='all'))])
svm = SVC(kernel="linear")

pipeline = Pipeline([("scale", StandardScaler()),("features", combined_features), ("svm", svm)])

# Do grid search over n_components:
param_grid = dict(features__pca__n_components=[1,3])

grid_search = GridSearchCV(pipeline, param_grid=param_grid, cv=5, verbose=10)
grid_search.fit(X, y)
print("best parameters", grid_search.best_params_)

print("shape after model",X.shape) #should this print (150, 7) or (150, 5) based on best parameter?

#save the model
joblib.dump(grid_search.best_estimator_, 'model.pkl', compress = 1)

#new data to predict
Input=[ 2.9 , 4.  ,1.2  ,0.2]
Input= array(Input)

#use the saved model to predict the new data
modeltrain="model.pkl"
modeltrain_saved = joblib.load(modeltrain) 
model_predictions = modeltrain_saved.predict(Input.reshape(1, -1))
print(model_predictions)

我根据答案更新了代码

【问题讨论】:

【参考方案1】:

您在 SelectKBest 中提供 'all' 作为参数。但是根据documentation,如果要传递'all',则需要指定为:

SelectKBest(k='all')

原因是它是一个关键字参数,应该用关键字指定。因为 SelectKBest 的第一个参数是评分函数的位置参数。因此,当您未指定 param 时,“all”将被视为函数的输入,因此会出现错误。

更新:

现在关于形状,原来的X不会改变。所以它将打印(150,4)。数据将即时更改,在我的电脑上,best_param_n_components=1,所以去 svm 的最终形状是 (150, 5),1 来自 PCA,4 来自 SelectKBest。

【讨论】:

@Vivek_Kumar 另外,“features__pca__n_components”是 GridSearchCV 识别为 PCA 参数的关键字。如果不是,它如何不会错过另一个参数,例如我没有在 param_grid 中定义的 SVM 的 gamma?谢谢 @april 是 "features__pca__n_components" 是管道对象的关键字。 GridSearch 只是将关键字发送到管道。然后管道将根据创建管道时使用的名称来处理分配。 @Vivek_Kumar:我看到您在另一个帖子 (***.com/questions/49160206/…) 中回答了一个问题,但我无法回复,这与我在此处发布的内容有关。如果我将我的数据分成 75% 的训练数据和 25% 的测试数据,并在训练数据上执行 grid_search,在获得最佳参数后,我想计算我的模型在测试数据上的准确性。如果在测试数据上评估我的模型时,我使用与在训练数据上进行网格搜索相同数量的交叉验证是否重要? @april 不,您只需在测试数据上调用predict()score() 进行评估。您不对测试数据进行交叉验证。如果是这样,您将在每个折叠中做什么? @Vivek_Kumar:明白了,谢谢,我仍然有一个问题,即是否有必要将单独的看不见的数据作为我们的测试数据来评估我们的最终模型是否存在偏差。 grid_result.cv_results_ 还计算 mean_test_score 和 mean_train_score (对于所有可能的参数,不仅是最好的),所以考虑到在每次迭代中第 i 折叠是看不见的,我们仍然应该能够从 mean-test 和 mean-train 分数之间的差异中看出我们的模型是否存在偏见。

以上是关于类型错误网格搜索的主要内容,如果未能解决你的问题,请参考以下文章

优化 C、g 参数时 LIBSVM 中的网格搜索错误

执行 python scikit-learn 网格搜索方法时出现无效参数错误

网格存储配置抛出“未捕获的类型错误:无法读取未定义的属性‘缓冲’”

无法使用网格搜索检索 bestModel

使用管道进行岭回归网格搜索

使用类权重的网格搜索和 KerasClassifier