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

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

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

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

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

Большое Спасибо, Колис!--1-->

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)

однако меня раздражает, что predict выбирает порог, соответствующий 0,4% истинных срабатываний (ложные срабатывания равны нулю). Кривая ROC показывает порог, который мне больше нравится для моей проблемы, где истинные положительные значения составляют приблизительно 20% (ложные положительные около 4%). Затем я сканирую predict_probabilities, чтобы найти, какое значение вероятности соответствует моей любимой точке 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')