Как установить пороговое значение для классификатора 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')