Почему я получаю разные значения с pipline и без pipline в sklearn в python - PullRequest
2 голосов
/ 14 апреля 2019

Я использую recursive feature elimination with cross-validation (rfecv) с GridSearchCV с RandomForest классификатором следующим образом с использованием конвейера и без использования конвейера .

Мой код с конвейером выглядит следующим образом.

X = df[my_features_all]
y = df['gold_standard']

#get development and testing sets
x_train, x_test, y_train, y_test = train_test_split(X, y, random_state=0)

from sklearn.pipeline import Pipeline

#cross validation setting
k_fold = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
#this is the classifier used for feature selection
clf_featr_sele = RandomForestClassifier(random_state = 42, class_weight="balanced")
rfecv = RFECV(estimator=clf_featr_sele, step=1, cv=k_fold, scoring='roc_auc')

param_grid = {'n_estimators': [200, 500],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [3,4,5]
    }

#you can have different classifier for your final classifier
clf = RandomForestClassifier(random_state = 42, class_weight="balanced")
CV_rfc = GridSearchCV(estimator=clf, param_grid=param_grid, cv= k_fold, scoring = 'roc_auc', verbose=10, n_jobs = 5)

pipeline  = Pipeline([('feature_sele',rfecv),('clf_cv',CV_rfc)])

pipeline.fit(x_train, y_train)

Результат (с конвейером):

Optimal features: 29
Best hyperparameters: {'max_depth': 3, 'max_features': 'auto', 'n_estimators': 500}
Best score: 0.714763

Мой код без конвейера выглядит следующим образом.

X = df[my_features_all]
y = df['gold_standard']

#get development and testing sets
x_train, x_test, y_train, y_test = train_test_split(X, y, random_state=0)

#cross validation setting
k_fold = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)

clf = RandomForestClassifier(random_state = 42, class_weight="balanced")

rfecv = RFECV(estimator=clf, step=1, cv=k_fold, scoring='roc_auc')

param_grid = {'estimator__n_estimators': [200, 500],
    'estimator__max_features': ['auto', 'sqrt', 'log2'],
    'estimator__max_depth' : [3,4,5]
    }

CV_rfc = GridSearchCV(estimator=rfecv, param_grid=param_grid, cv= k_fold, scoring = 'roc_auc', verbose=10, n_jobs = 5)
CV_rfc.fit(x_train, y_train)

Результат (без конвейера):

Optimal features: 4
Best hyperparameters: {'max_depth': 3, 'max_features': 'auto', 'n_estimators': 500}
Best score: 0.756835

Хотя концепция обоих подходов схожа, я получаю разные результаты и разные выбранные функции (как показано выше в разделах результатов). Тем не менее, я получаю те же значения гиперпараметра.

Мне просто интересно, почему это различие происходит. Какой подход (без использования конвейера или с использованием конвейера?) Наиболее подходит для выполнения вышеупомянутой задачи?

Я с удовольствием предоставлю более подробную информацию, если это необходимо.

1 Ответ

1 голос
/ 14 апреля 2019

В случае с конвейером

Выбор характеристик (RFECV) выполняется с базовой моделью (RandomForestClassifier(random_state = 42, class_weight="balanced")) перед применением grid_searchCV к окончательной оценке.

В случае без конвейера,

Для каждой комбинации гиперпараметра для выбора функции используется соответствующая оценка (RFECV).Следовательно, это займет много времени.

...