2016-08-10 3 views
1

Я пытаюсь использовать поиск сетки, чтобы выяснить, лучшее значение для n_components использовать в PCA:GridSearchCV не работает?

from sklearn.decomposition import PCA 
from sklearn.grid_search import GridSearchCV 
from sklearn.pipeline import Pipeline 
from sklearn.preprocessing import StandardScaler 
from sklearn.linear_model import LinearRegression 


pca = PCA() 
pipe_lr = Pipeline([('pca', pca), 
        ('regr', LinearRegression())]) 

param_grid = [{'pca__n_components': range(2, X.shape[1])}] 

gs = GridSearchCV(estimator=pipe_lr, 
        param_grid=param_grid, 
        cv=3) 
gs = gs.fit(X_train, y_train) 
print(gs.best_score_) 
print(gs.best_params_) 

for i in range(2, X.shape[1]): 
    pca.n_components = i 
    pipe_lr = pipe_lr.fit(X_train, y_train) 
    print i, pipe_lr.score(X_test, y_test) 

Однако результатами я вижу, являются очень странно (номер я получаю от цикла полностью отличаются от тех, от поиска сетки):

-0.232877626581 
{'pca__n_components': 2} 
2 0.0989156092429 
3 0.258170750388 
4 0.26328990417 
5 0.263620889601 
6 0.315725901097 
7 0.315477694958 
8 0.330445632512 
9 0.328779889242 
10 0.323594949214 
11 0.322914495543 
12 0.324050681182 
13 0.334970652728 
14 0.334333880177 
15 0.335040376094 
16 0.330876375034 
17 0.335395590901 
18 0.335132468578 
19 0.331201691511 
20 0.337244411372 
21 0.337130708041 
22 0.333092723232 
23 0.340707011134 
24 0.344046515328 
25 0.337869318771 
26 0.332590709621 
27 0.345343677247 
28 0.344728264973 
29 0.343084912122 
30 0.340332251028 
31 0.34
32 0.340290453979 
33 0.340349696151 
34 0.337021304382 
35 0.327271480372 
36 0.334423097757 
37 -5.09330041094e+21 
38 -5.06403949113e+21 

Согласно для цикла, лучшее значение для n_components должно быть около 28, но это даже не близко к тому, что я получаю от поиска сетки

Примечание: я не сделал t включает в себя шаги для настройки поезда и тестовых наборов, но я использовал train_test_split от sklearn.

ответ

5

GridSearchCV, выплевывает cross_validation оценка. Добавление cross_validation в цикл for может дать вам более близкий результат.

Кроме того, вы используете разные данные. Вы упомянули, что использовали train_test_split. В вашем цикле for вы получили оценки на X_test, y_test. В GridSearchCV вы получили средний балл на X_train, y_train. У вас могут быть выбросы в вашем тестовом наборе.

Я немного изменил ваш код и применил его к набору данных Boston.

from sklearn.decomposition import PCA 
from sklearn.grid_search import GridSearchCV 
from sklearn.pipeline import Pipeline 
from sklearn.preprocessing import StandardScaler 
from sklearn.linear_model import LinearRegression 
from sklearn.datasets import load_boston 
import numpy as np 
from sklearn.cross_validation import cross_val_score 


boston = load_boston() 
X = boston.data 
y = boston.target 

pca = PCA() 
pipe_lr = Pipeline([('pca', pca), 
        ('regr', LinearRegression())]) 

param_grid = {'pca__n_components': np.arange(2, X.shape[1])} 

gs = GridSearchCV(estimator=pipe_lr, 
        param_grid=param_grid, 
        cv=3) 
gs = gs.fit(X, y) 
print(gs.best_score_) 
print(gs.best_params_) 


all_scores = [] 
for i in range(2, X.shape[1]): 
    pca.n_components = i 
    scores = cross_val_score(pipe_lr,X,y,cv=3) 
    all_scores.append(np.mean(scores)) 
    print(i,np.mean(scores)) 

print('Best result:',all_scores.index(max(all_scores)),max(all_scores)) 

дает:

0.35544286032 
{'pca__n_components': 9} 
2 -0.419093097857 
3 -0.192078129541 
4 -0.24988282122 
5 -0.0909566048894 
6 0.197185975618 
7 0.173454370084 
8 0.276509863992 
9 0.355148081819 
10 -17.2280089182 
11 -0.291804450954 
12 -0.281263153468 
Best result: 7 0.355148081819 
Смежные вопросы