TypeError grid seach - PullRequest
       87

TypeError grid seach

0 голосов
/ 30 апреля 2018

Я использовал для создания цикла для нахождения лучших параметров для моей модели, что увеличивало мои ошибки в кодировании, поэтому я решил использовать 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 Ответ

0 голосов
/ 30 апреля 2018

Вы предоставляете 'all' в качестве параметра в SelectKBest. Но в соответствии с документацией , если вы хотите передать 'all', вам нужно указать его как:

SelectKBest(k='all')

Причина в том, что это ключевой аргумент, он должен быть указан с ключевым словом. Потому что первый аргумент SelectKBest - это позиционный аргумент для функции скоринга. Поэтому, если вы не укажете param, «все» будет считаться вводом для функции и, следовательно, ошибкой.

Обновление:

Теперь по поводу формы, исходная X не изменится. Так будет напечатано (150,4). Данные будут изменены на лету, и на моем компьютере best_param_ будет n_components=1, поэтому окончательная форма, которая переходит к svm, равна (150, 5), 1 из PCA и 4 из SelectKBest.

...