Как установить пороговое значение для классификатора sklearn на основе результатов ROC?

Я обучил ExtraTreesClassifier (индекс Джини) с помощью scikit-learn, и он вполне соответствует моим потребностям. Не очень хорошая точность, но с использованием 10-кратной перекрестной проверки AUC составляет 0,95. Я хотел бы использовать этот классификатор в своей работе. Я совершенно новичок в ML, поэтому, пожалуйста, прости меня, если я спрошу у тебя что-то концептуально неправильное.

Я построил некоторые кривые ROC, и, похоже, у меня есть определенный порог, когда мой классификатор начинает работать хорошо. Я хотел бы установить это значение на подогнанном классификаторе, поэтому каждый раз, когда я буду вызывать прогнозирование, классификаторы используют этот порог, и я могу поверить в показатели FP и TP.

Я также пришел к этому посту ( порог по умолчанию для scikit .predict()), где говорится, что порог не является общей концепцией для классификаторов. Но поскольку в ExtraTreesClassifier есть метод предиката_процесса, а кривая ROC также связана с определением thresdholds, мне кажется, я должен быть доступен для его определения.

Я не нашел ни параметра, ни какого-либо класса / интерфейса для этого. Как я могу установить порог для него для обученного ExtraTreesClassifier (или любого другого), использующего scikit-learn?

Большое спасибо, Колис

2 ответа

Решение

Вот что я сделал:

model = SomeSklearnModel()
model.fit(X_train, y_train)
predict = model.predict(X_test)
predict_probabilities = model.predict_proba(X_test)
fpr, tpr, _ = roc_curve(y_test, predict_probabilities)

Однако меня раздражает, что прогнозирование выбирает порог, соответствующий 0,4% истинных положительных результатов (ложные положительные значения равны нулю). Кривая ROC показывает порог, который мне нравится больше для моей проблемы, где истинные положительные результаты составляют приблизительно 20% (ложные положительные результаты около 4%). Затем я отсканирую прогнозируемые свойства, чтобы определить, какое значение вероятности соответствует моей любимой точке ROC. В моем случае эта вероятность составляет 0,21. Затем я создаю свой собственный массив прогнозирования:

predict_mine = np.where(rf_predict_probabilities > 0.21, 1, 0)

и там вы идете:

confusion_matrix(y_test, predict_mine)

возвращает то, что я хотел:

array([[6927,  309],
       [ 621,  121]])

Трудно дать точный ответ без конкретных примеров кода. Если вы уже выполняете перекрестную проверку, вы можете указать AUC в качестве параметра для оптимизации:

shuffle = cross_validation.KFold(len(X_train), n_folds=10, shuffle=True)
scores = cross_val_score(classifier, X_train, y_train, cv=shuffle, scoring='roc_auc')
Другие вопросы по тегам