2017-01-26 33 views
7

Wyszkoliłem ExtraTreesClassifier (indeks gini) za pomocą scikit-learn i odpowiada to moim potrzebom. Nie tak dobra dokładność, ale przy 10-krotnej walidacji krzyżowej, AUC wynosi 0,95. Chciałbym użyć tego klasyfikatora w mojej pracy. Jestem całkiem nowy w ML, więc proszę, wybacz mi, jeśli zadaję ci coś koncepcyjnie nie tak.Jak ustawić próg dla klasyfikatora sklearn na podstawie wyników ROC?

Wykreśliłem niektóre krzywe ROC, a przez to wydaje mi się, że mam określony próg, gdy mój klasyfikator zaczyna działać dobrze. Chciałbym ustawić tę wartość na dopasowanym klasyfikatorze, więc za każdym razem, gdy chciałbym przewidzieć, klasyfikatory stosują ten próg i mogę wierzyć w stawki FP i TP.

Przyszedłem również do tego posta (scikit .predict() default threshold), gdzie stwierdzono, że próg nie jest ogólną koncepcją klasyfikatorów. Ale ponieważ ExtraTreesClassifier ma metodę predict_proba, a krzywa ROC jest również związana z definicją thresdholds, wydaje mi się, że powinienem być dostępny, aby ją określić.

Nie znalazłem żadnego parametru ani klasy/interfejsu, który mógłby to zrobić. Jak mogę ustawić dla niego próg dla wyszkolonego ExtraTreesClassifier (lub innego) przy użyciu scikit-learn?

Wielkie dzięki, Colis

Odpowiedz

2

To co mam zrobić:

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) 

Jednak jestem zły, że przewidywania zdecyduje próg odpowiadający 0,4% prawdziwych pozytywów (fałszywe alarmy to zero). Krzywa ROC pokazuje próg, który mi się podoba lepiej w przypadku mojego problemu, w którym prawdziwe wyniki dodatnie wynoszą około 20% (fałszywie dodatnie około 4%). Następnie skanuję predykcyjność, aby znaleźć wartość prawdopodobieństwa odpowiadającą mojemu ulubionemu punktowi ROC. W moim przypadku prawdopodobieństwo to wynosi 0,21. Następnie tworzę własne przewidywania tablicę:

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

i tam idziesz:

confusion_matrix(y_test, predict_mine) 

powraca to, co chciałem:

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

Trudno podać dokładnej odpowiedzi bez żadnych konkretnych przykładów kodu. Jeśli już robi walidacji krzyżowej, można rozważyć określenie AUC jako parametr w celu optymalizacji:

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

Hi Biały, dzięki za odpowiedź. Zoptymalizowałem go, wybierając roc_auc i inne dane, które były w moim interesie w tym czasie (stworzyłem również niestandardowego klasyfikatora, aby zoptymalizować LR +). Moja główna wątpliwość polega na tym, jak wybrać jeden z progów wskazywanych przez punkt na krzywej ROC jako próg dla wywołania predict()? Moje pytanie jest powiązane z (). Nie jestem pewien, czy byłby on dostępny dla drzew, ponieważ zwykle nie używają probas. Ale jak ustawić go na inne metody? – Colis