конвейеры scikit-learn: нормализация после PCA приводит к нежелательным случайным результатам - PullRequest
0 голосов
/ 21 декабря 2018

Я запускаю конвейер, который нормализует входные данные, запускает PCA, нормализует коэффициенты PCA, прежде чем, наконец, запустит логистическую регрессию.

Однако я получаю переменные результаты по производимой мною путанице.

Я обнаружил, что если я уберу 3-й шаг ("normalise_pca"), мои результаты будут постоянными.

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

def exp2_classifier(X_train, y_train):

    estimators = [('robust_scaler', RobustScaler()), 
                  ('reduce_dim', PCA(random_state=0)), 
                  ('normalise_pca', PowerTransformer()), #I applied this as the distribution of the PCA factors were skew
                  ('clf', LogisticRegression(random_state=0, solver="liblinear"))] 
                #solver specified here to suppress warnings, it doesn't seem to effect gridSearch
    pipe = Pipeline(estimators)

    return pipe

exp2_eval = Evaluation().print_confusion_matrix
logit_grid = Experiment().run_experiment(asdp.data, "heavy_drinker", exp2_classifier, exp2_eval);

1 Ответ

0 голосов
/ 21 декабря 2018

Я не могу воспроизвести вашу ошибку.Я пробовал другой набор данных из sklearn, но получил последовательные результаты для нескольких прогоновСледовательно, отклонение не может быть связано с выходом normalize_pca

from sklearn import datasets
from sklearn.metrics import confusion_matrix
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import RobustScaler,PowerTransformer
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression

cancer = datasets.load_breast_cancer()
X = cancer.data
y = cancer.target

from sklearn.model_selection import train_test_split

X_train, X_eval, y_train, y_eval = train_test_split(X, y, test_size=0.2, random_state=42)

estimators = [('robust_scaler', RobustScaler()), 
              ('reduce_dim', PCA(random_state=0)), 
              ('normalise_pca', PowerTransformer()), #I applied this as the distribution of the PCA factors were skew
              ('clf', LogisticRegression(random_state=0, solver="liblinear"))] 
            #solver specified here to suppress warnings, it doesn't seem to effect gridSearch
pipe = Pipeline(estimators)

pipe.fit(X_train,y_train)

print('train data :')
print(confusion_matrix(y_train,pipe.predict(X_train)))
print('test data :')
print(confusion_matrix(y_eval,pipe.predict(X_eval)))

:

train data :
[[166   3]
 [  4 282]]
test data :
[[40  3]
 [ 3 68]]
...