2017-01-26 24 views
7

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

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

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

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

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

ответ

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]]) 
0

Это трудно обеспечить точный ответ без каких-либо конкретных примеров кода. Если вы уже делаете перекрестную проверку, вы могли бы рассмотреть с указанием АУК в качестве параметра оптимизации:

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') 
+0

Привет Белый, спасибо за Ваш ответ. Я оптимизировал его, выбрав roc_auc и другие показатели, которые были мне интересны в то время (я также создал пользовательский счетчик для оптимизации LR +). Мое главное сомнение заключается в том, как выбрать один из пороговых значений, показанных точкой на кривой ROC, как пороговое значение, когда я вызываю pred()? Мой вопрос связан с (). Я не уверен, что это будет доступно для деревьев, поскольку они обычно не используют probas. Но как установить его для других методов? – Colis