Как работает cross_val_score и gridsearchCV? - PullRequest
0 голосов
/ 31 мая 2018

Я новичок в python, и я пытался выяснить, как работают gridsearchCV и cross_val_score.

Поиск шансов приводит к созданию своего рода эксперимента проверки, но все же я не понимаю, что я делаюнеправильно.

Чтобы попытаться упростить, я использую gridsearchCV - самый простой из возможных способов и попытаюсь проверить и понять, что происходит:

Вот оно:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, RobustScaler, QuantileTransformer
from sklearn.feature_selection import SelectKBest, f_regression, RFECV
from sklearn.decomposition import PCA
from sklearn.linear_model import RidgeCV,Ridge, LinearRegression
from sklearn.pipeline import Pipeline, make_pipeline
from sklearn.model_selection import GridSearchCV,KFold,TimeSeriesSplit,PredefinedSplit,cross_val_score
from sklearn.metrics import mean_squared_error,make_scorer,r2_score,mean_absolute_error,mean_squared_error
from math import sqrt

Я создаю объект перекрестной проверки (для gridsearchCV и cross_val_score) и набор данных train / test для конвейера и простой линейной регрессии.Я проверил, что два набора данных идентичны:

train_indices = np.full((15,), -1, dtype=int)
test_indices = np.full((6,), 0, dtype=int)
test_fold = np.append(train_indices, test_indices)
kf = PredefinedSplit(test_fold)

for train_index, test_index in kf.split(X):
    print('TRAIN:', train_index, 'TEST:', test_index)
    X_train_kf = X[train_index]
    X_test_kf = X[test_index]

train_data = list(range(0,15))
test_data = list(range(15,21))

X_train, y_train=X[train_data,:],y[train_data]
X_test, y_test=X[test_data,:],y[test_data]

Вот что я делаю:

создаю экземпляр простой линейной модели и использую ее с ручным набором данных

lr=LinearRegression()
lm=lr.fit(X,y)
lmscore_train=lm.score(X_train,y_train) 

-> r2 = 0.4686662249071524

lmscore_test=lm.score(X_test,y_test)

-> r2 0.6264021467338086

Теперь я пытаюсь сделать то же самое, используя конвейер:

pipe_steps = ([('est', LinearRegression())])
pipe=Pipeline(pipe_steps)
p=pipe.fit(X,y)
pscore_train=p.score(X_train,y_train) 

-> r2 = 0.4686662249071524

pscore_test=p.score(X_test,y_test)

-> r2 0.6264021467338086

LinearRegression и конвейер соответствуют идеально

Теперь я пытаюсь сделать то же самое, используя cross_val_score, используя предопределенный split kf

cv_scores = cross_val_score(lm, X, y, cv=kf)  

-> r2 = -1.234474757883921470e + 01?!?!(это должен быть результат теста)

Теперь давайте попробуем gridsearchCV

scoring = {'r_squared':'r2'}
grid_parameters = [{}] 
gridsearch=GridSearchCV(p, grid_parameters, verbose=3,cv=kf,scoring=scoring,return_train_score='true',refit='r_squared')
gs=gridsearch.fit(X,y)
results=gs.cv_results_

из cv_results_ Я получаю еще раз ->mean_test_r_squared->r2->-1.234474757883921292e+01

Итак, cross_val_score и gridsearch вконец матча друг с другом, но счет полностью не совпадает и отличается от того, что должно быть.

Не могли бы вы помочь мне решить эту головоломку?

1 Ответ

0 голосов
/ 01 июня 2018

cross_val_score и GridSearchCV сначала разбивают данные, обучают модель только на данных поезда, а затем оценивают на тестовых данных.

Здесь вы тренируетесь на полных данных, а затем получаете баллы на тестовых данных.Следовательно, вы не соответствуете результатам cross_val_score.

Вместо этого:

lm=lr.fit(X,y)

Попробуйте:

lm=lr.fit(X_train, y_train)

То же самое для конвейера:

Вместо p=pipe.fit(X,y), сделайте следующее:

p=pipe.fit(X_train, y_train)

Вы можете посмотреть мои ответы для более подробного описания: -

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...