Точность оценки RandomizedSearchCV не совпадает в случайном лесу - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь выполнить оптимизацию некоторых гиперпараметров для случайного леса , используя RandomizedSearchCV. Я установил метод оценки как средняя точность . rand_search.best_score_ составляет около 0,38 (разумный результат для моего набора данных), но когда я вычисляю тот же средний балл точности, используя rand_search.best_estimator_, результат близок к 1 (см. Ниже ).

clf = RandomForestClassifier()
randsearch = RandomizedSearchCV(clf,
                                scoring='average_precision',
                                param_distributions=parameters,
                                n_iter=1,
                                cv=StratifiedShuffleSplit(n_splits=10),
                                n_jobs=1, 
                                verbose=2)

randsearch.fit(X, y)
randomized_best_score = randsearch.best_score_

best_estimator_avg_precision = average_precision_score(y, 
                               randsearch.best_estimator_.predict(X))

best_estimator_avg_precision_probs = average_precision_score(y, 
                          randsearch.best_estimator_.predict_proba(X)[:, 1])

print(randomized_best_score)
print(best_estimator_avg_precision)
print(best_estimator_avg_precision_probs)

>>> randomized_best_score: 0.3836
>>> best_estimator_avg_precision: 0.983577210629
>>> best_estimator_avg_precision_probs: 1.0

Есть идеи, почему это может произойти? Что я делаю не так?

1 Ответ

0 голосов
/ 04 июля 2018

Здесь нужно отметить несколько вещей.

1) randsearch.best_score_ - это средний балл для тестовых сгибов по тренировочным данным, поэтому он не будет совпадать при использовании полных данных для вычисления балла.

2) RandomizedSearchCV будет обучаться на (подгонке) целых данных после нахождения наилучшей комбинации параметров (комбинации параметров, которые дали best_score_). Поэтому, когда вы набираете баллы по одним и тем же данным, ожидается, что они дадут более высокие результаты.

3) Когда вы указываете scoring='average_precision', внутренне оно преобразуется в следующее:

average_precision_scorer = make_scorer(average_precision_score,
                                       needs_threshold=True)

Параметр needs_threshold здесь равен True, это означает, что оценщику требуется вывод значения predict_proba() или decision_function() от оценщика. Так что ваш второй вывод best_estimator_avg_precision несопоставим.

А для вашего best_estimator_avg_precision_probs сделайте это, чтобы проверить, имеет ли это какое-либо значение: -

best_estimator_avg_precision_probs = average_precision_score(y, 
                      randsearch.best_estimator_.predict_proba(X))

Но, тем не менее, очки будут выше из-за пункта 2.

...