TypeError网格搜索

时间:2018-04-30 13:00:17

标签: python scikit-learn svm pca grid-search

我曾经创建循环来查找我的模型的最佳参数,这增加了编码中的错误,所以我决定使用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)

&#13;
&#13;
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)
&#13;
&#13;
&#13;

我根据答案更新了代码

1 个答案:

答案 0 :(得分:0)

您在SelectKBest中提供 <div ui-view=""></div> 作为参数。但根据documentation,如果您想传递'all',则需要将其指定为:

'all'

原因是它是一个关键字参数,应该用关键字指定。因为SelectKBest的第一个参数是评分函数的位置参数。所以当你没有指定SelectKBest(k='all') 时,'all'被认为是函数的输入,因此也被认为是错误。

更新

现在关于形状,原始param将不会更改。因此它将打印X。数据将动态更改,在我的电脑上(150,4)best_param_,因此最终形状为n_components=1,1来自PCA,4来自SelectKBest。