gridSearch in loop ** оценщик должен быть оценщиком, реализующим метод 'fit', 0 было передано ** ошибка - PullRequest
3 голосов
/ 06 октября 2019

Пожалуйста, извините за мой опыт программирования. Я пытаюсь сделать кучу регрессий с GridSearch. Я пытаюсь зациклить весь процесс, чтобы ускорить процесс, но мой код недостаточно хорош и не будет возражать против того, чтобы сделать его еще более эффективным. Вот мой код для этого:

classifiers=[Lasso(max_iter=700,random_state=42), Ridge(max_iter=700,random_state=42), ElasticNet(max_iter=700,random_state=42)]

for clf in range(len(classifiers)):
    grd=GridSearchCV(clf,parameters)

    name = clf.__class__.__name__

    print("="*25)
    print(name)

    if clf==0:
       parameters={'alpha':[0.0005,0.0006,0.06,0.5,0.0001,0.01,1,2,3,4,4.4,4]}

    elif clf==1:
         parameters = {'alpha':[1,2,3,5,10,11,2,13,14,15]}

    else:
       parameters ={'alpha':[0.06,0.5,0.0001,0.01,1,2,3,4,4.4,4,5]}

grd.fit(X_train,y_train)
pred=grid.predict(X_test)

Rs = r2_score(y_test, pred)
rmse=np.sqrt(mean_squared_error(y_test,pred))

print('The R-squared is {:.4}'.format(Rs))
print('The root mean squared is {:.4}'.format(rmse))

Точная ошибка, которую я имею, заключается в следующем:

Оценщик должен быть оценщиком, реализующим метод 'fit', 0 было передано. Объяснение также будет высоко оценено.

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

В вашем коде есть несколько ошибок:

  • Вы используете clf внутри объекта GridSearchCV, который является целым числом, а не классификатором из созданного вами списка.
  • Вам необходимо объявить переменную parameters перед переходом в GridSearchCV
  • Наконец, вам нужно переместить код fit, predict, r2_score и mean_absolute_error внутри телаиз цикла for, иначе он будет выполнять вычисления только для последнего классификатора.

Вот исправленный код (в качестве примера я использую набор данных Бостона):

from sklearn.linear_model import Lasso, Ridge, ElasticNet
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error
import numpy as np

random_state = 42

# Load boston dataset
boston = load_boston()
X, y = boston['data'], boston['target']
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    random_state=random_state)

classifiers=[Lasso(max_iter=700,random_state=random_state), 
             Ridge(max_iter=700,random_state=random_state),
             ElasticNet(max_iter=700,random_state=random_state)]

for clf in range(len(classifiers)):
    # First declare the variable parameters
    if clf==0:
       parameters={'alpha':[0.0005,0.0006,0.06,0.5,0.0001,0.01,1,2,3,4,4.4,4]}

    elif clf==1:
         parameters = {'alpha':[1,2,3,5,10,11,2,13,14,15]}

    else:
       parameters ={'alpha':[0.06,0.5,0.0001,0.01,1,2,3,4,4.4,4,5]}

    # Use clf as index to get the classifier
    current_clf = classifiers[clf]
    grid=GridSearchCV(current_clf, parameters)

    # This is the correct classifier name, previously it returned int
    name = current_clf.__class__.__name__

    print("="*25)
    print(name)

    # Moved the below code inside the for loop
    grid.fit(X_train,y_train)
    pred=grid.predict(X_test)

    Rs = r2_score(y_test, pred)
    rmse=np.sqrt(mean_squared_error(y_test,pred))

    print('The R-squared is {:.4}'.format(Rs))
    print('The root mean squared is {:.4}'.format(rmse))

Вы можете просмотреть рабочий код в блокноте Google Colab здесь .

0 голосов
/ 06 октября 2019

Вы передаете parameters в grd до того, как они будут определены.

Попробуйте определить grd после последнего оператора else, чтобы убедиться, что переменная parameters содержит значение, прежде чем передать егов классификатор.

...