Как выполнить стандартизацию данных в gridsearchcv?

Как выполнить стандартизацию данных в GridSearchCV?

Вот код. Понятия не имею, как это сделать.

import dataset
import warnings
warnings.filterwarnings("ignore")

import pandas as pd
dataset = pd.read_excel('../dataset/dataset_experiment1.xlsx')
X = dataset.iloc[:,1:-1].values
y = dataset.iloc[:,66].values

from sklearn.model_selection import GridSearchCV
#from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
stdizer = StandardScaler()

print('===Grid Search===')

print('logistic regression')
model = LogisticRegression()
parameter_grid = {'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']}
grid_search = GridSearchCV(model, param_grid=parameter_grid, cv=kfold, scoring = scoring3)
grid_search.fit(X, y)
print('Best score: {}'.format(grid_search.best_score_))
print('Best parameters: {}'.format(grid_search.best_params_))
print('\n')

Обновлять Это то, что я пытаюсь запустить, но получаю сообщение об ошибке:

print('logistic regression')
model = LogisticRegression()
pipeline = Pipeline([('scale', StandardScaler()), ('clf', model)])
parameter_grid = {'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']}
grid_search = GridSearchCV(pipeline, param_grid=parameter_grid, cv=kfold, scoring = scoring3)
grid_search.fit(X, y)
print('Best score: {}'.format(grid_search.best_score_))
print('Best parameters: {}'.format(grid_search.best_params_))
print('\n')
1
0
1 006
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте sklearn.pipeline.Pipeline

Демо:

from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = \
        train_test_split(X, y, test_size=0.33)

pipe = Pipeline([
    ('scale', StandardScaler()),
    ('clf', LogisticRegression())
])

param_grid = [
    {
        'clf__solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
        'clf__C': np.logspace(-3, 1, 5),
    },
]

grid = GridSearchCV(pipe, param_grid=param_grid, cv=3, n_jobs=-1, verbose=2)
grid.fit(X_train, y_train)

Консоль предоставляет ошибку: ValueError: недопустимый решатель параметров для конвейера оценки (memory = None, steps = [('scale', StandardScaler (copy = True, with_mean = True, with_std = True)), ('clf', LogisticRegression (C = 1.0, class_weight = None, dual = False, fit_intercept = True, intercept_scaling = 1, max_iter = 100, multi_class = 'ovr', n_jobs = 1, штраф = 'l2', random_state = None, solver = 'liblinear', tol = 0,0001, подробный = 0, warm_start = False))]). Проверьте список доступных параметров с estimator.get_params().keys()

Bose Sanamchai 11.04.2018 15:51

@BoseSanamchai, а что возвращает pipe.get_params().keys()?

MaxU 11.04.2018 15:54

Я обновляю вопрос кодом конвейера, который пытаюсь запустить. Не могли бы вы его изучить?

Bose Sanamchai 11.04.2018 16:27

@BoseSanamchai, обратите внимание, как я использовал param_grid или, что лучше, просто использовал свой код, чтобы понять, как он работает ...

MaxU 11.04.2018 16:55

если вы используете refit = True, вы можете использовать лучшие результаты модели из GridSearchCV. вы можете использовать cv_results, чтобы найти лучшую строку на основе рейтинга. Используя лучшую строку, можно извлечь параметры. Если ваш список функций становится большим, используйте RandomSearchCV для прогнозов.

 from sklearn.pipeline import Pipeline
 from sklearn.model_selection import train_test_split

 X_train, X_test, y_train, y_test =train_test_split(X, y, test_size=0.3)

 pipe = Pipeline([
     ('scale', StandardScaler()),
     ('clf', LogisticRegression())
 ])

 param_grid = [
    {
    'clf__solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
    'clf__C': np.logspace(-3, 1, 5),
    },
 ]

 grid_class=GridSearchCV(
    estimator=pipeline,
    param_grid=parameter_grid,
    scoring='accuracy',
    n_jobs=4, #use 4 cores
    cv=10, #10 folds
    refit=True,
    return_train_score=True)

    grid_class.fit(X_train,y_train)

    predictions=grid_class.predict(X_test)

    cv_results_df=pd.DataFrame(grid_class.cv_results_)

    best_row=cv_results_df[cv_results_df["rank_test_score"]==1]
 
    print(best_row)

    params_column = cv_results_df.loc[:, ['params']]
    print(params_column)

Другие вопросы по теме