RandomizedSearchCV не возвращает баллов - PullRequest
0 голосов
/ 17 июня 2020

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

Это контролируемый стиль обучения и задача обучения классификации, предсказывающая / классифицирующая двоичную цель (1/0).

Это моя модель:

# Random Forest
RF = RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=None, 
                            min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
                            max_features='auto', max_leaf_nodes=None, random_state=1337)

И здесь я настраиваю конвейер и пытаюсь получить оценку, но это, вероятно, не работает.

pipeline_RF = Pipeline(steps=[
        ('preprocessor', preprocessor),
        #('pca', pca),
        ('rf', RF)                          
])

print("\n------------ Randomized Search (Random Forest) ------------")

param_distributions = {
    'rf__n_estimators':  np.random.randint(1, 200, 10),
    'rf__max_depth': np.random.randint(1, 100, 10),
    'rf__min_samples_split': np.linspace(0.1, 1.0, 10, endpoint=True),      
    'rf__min_samples_leaf':  np.linspace(0.1, 0.5, 5, endpoint=True),
    'rf__criterion': ['entropy'],
    'rf__max_features': ['auto']
}

rscv = RandomizedSearchCV(pipeline_RF, param_distributions=param_distributions, cv = StratifiedKFold(n_splits=5), 
                          scoring="recall", n_iter=2, refit=True, n_jobs=-1, random_state=1337, return_train_score=True, verbose=10)

rscv.fit(X_train, y_train)
print("\nBest parameter (CV score=%0.3f):" % rscv.best_score_)
print("\Best Hyperparameters: ", rscv.best_params_)

y_pred = rscv.best_estimator_.predict(X_test)
print("\nPrecision, Recall, F1 and Support: ", precision_recall_fscore_support(y_test, y_pred, average='binary'))

Сообщение об ошибке следующее, но мне не очень помогает:

------------ Randomized Search (Random Forest) ------------
Fitting 5 folds for each of 2 candidates, totalling 10 fits

[Parallel(n_jobs=-1)]: Using backend LokyBackend with 2 concurrent workers.
[Parallel(n_jobs=-1)]: Done   1 tasks      | elapsed:    4.4s
[Parallel(n_jobs=-1)]: Done   4 tasks      | elapsed:    8.1s
[Parallel(n_jobs=-1)]: Done  10 out of  10 | elapsed:   18.4s finished


Best parameter (CV score=0.000):
\Best Hyperparameters:  {'rf__n_estimators': 135, 'rf__min_samples_split': 0.30000000000000004, 'rf__min_samples_leaf': 0.30000000000000004, 'rf__max_features': 'auto', 'rf__max_depth': 51, 'rf__criterion': 'entropy'}

Precision, Recall, F1 and Support:  (0.0, 0.0, 0.0, None)

/usr/local/lib/python3.6/dist-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))

Похоже, он установил гиперпараметры (хотя они кажутся одинаковыми каждый раз, когда я запускаю его).

Кто-нибудь знает, как это исправить?

1 Ответ

1 голос
/ 18 июня 2020

Как Дезернаут уже отмечал в комментариях, ваша модель просто не может предсказать класс меньшинства. С другой стороны, ваш код в порядке. Вы можете проверить это следующим образом:

Основываясь на вашем ответном комментарии BenReiniger, я создал фиктивный набор данных для воспроизведения вашей ситуации:

from sklearn.datasets import make_classification

X, y = make_classification(n_samples=(32893+4176), n_classes=2, weights=[0.88, 0.12])
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.2, random_state=42)

Этот набор данных имеет тот же дисбаланс классов и образец размер как ваш. Когда вы запустите свой код для этого набора данных, вы получите такое же предупреждение. Итак, почему это так? Давайте проверим результат y_pred как pandas фрейм данных:

print(pd.DataFrame(y_pred).astype('category').describe())

# output
count   7414
unique     1
top        0
freq    7414

Как видите, модель предсказала только один класс. В таком случае оценка точности для положительного класса, определенного как tp / (tp + fp), не определена, поскольку используется деление на ноль. Вот почему ваше предупреждение сообщает вам:

Use `zero_division` parameter to control this behavior.

Вы должны иметь возможность проверить это на своем собственном наборе данных. Кроме того, если вы используете другую функцию оценки, например accuracy_score, вы сможете увидеть, что ваш код работает без предупреждений или ошибок и возвращает оценку, как ожидалось. Некоторые метрики просто не определены, если модель не предсказывает какой-либо положительный класс.

Это должно прояснить ситуацию. В заключение, ваш код в порядке. Но ваша модель недостаточно хорошо обучена для задачи прогнозирования, и вам необходимо правильно справиться с дисбалансом классов.

...