scikit-learn .predict () domyślny próg


Pracuję nad problemem klasyfikacji z niezrównoważonymi klasami (5% 1). Chcę przewidzieć klasę, a nie prawdopodobieństwo.
Czy w przypadku problemu z klasyfikacją binarną domyślną wartością scikit jest
0.5
classifier.predict ()
?
Jeśli nie, jaka jest metoda domyślna? Jeśli tak, jak mogę to zmienić?
W scikit niektóre klasyfikatory mają opcję
class_weight = 'auto'
, ale nie wszystkie mają. Czy przy
class_weight = 'auto'
.predict ()
użyje rzeczywistej części populacji jako progu?
Jak byś to zrobił w klasyfikatorze takim jak
MultinomialNB
, który nie obsługuje
class_weight
? Oprócz korzystania z funkcji
Predict_proba ()
, a następnie samodzielnego obliczania klas.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

czy scikit
classifier.predict ()
używa domyślnie 0.5?

W klasyfikatorach probabilistycznych tak. Jest to jedyny rozsądny próg z matematycznego punktu widzenia, jak wyjaśnili inni.

Jak byś to zrobił w klasyfikatorze takim jak MultinomialNB, który nie obsługuje
class_weight
?

Możesz ustawić wartość na
class_prior
, czyli wcześniejsze prawdopodobieństwo P (

y
) dla każdej klasy

y
... To skutecznie przesuwa granice podejmowania decyzji. Na przykład.
# minimal dataset
>>> X = [[1, 0], [1, 0], [0, 1]]
>>> y = [0, 0, 1]
# use empirical prior, learned from y
>>> MultinomialNB().fit(X,y).predict([1,1])
array([0])
# use custom prior to make 1 more likely
>>> MultinomialNB(class_prior=[.1, .9]).fit(X,y).predict([1,1])
array([1])
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Próg można ustawić za pomocą
clf.predict_proba ()
na przykład:
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(random_state = 2)
clf.fit(X_train,y_train)
# y_pred = clf.predict(X_test) # default threshold is 0.5
y_pred = (clf.predict_proba(X_test)[:,1] >= 0.3).astype(bool) # set threshold as 0.3
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Próg w nauce scikit wynosi 0,5 dla klasyfikacji binarnej i niezależnie od tego, która klasa ma najwyższe prawdopodobieństwo klasyfikacji wieloklasowej. W wielu problemach znacznie lepszy wynik można uzyskać dostosowując próg. Należy to jednak robić ostrożnie i NIE na niezgodnych danych testowych, ale poprzez porównanie krzyżowe z danymi uczącymi. Jeśli dokonasz jakichkolwiek korekt progów w danych testowych, po prostu przezbrajasz dane testowe.
Większość metod ustawiania progów opiera się na

wydajność odbiornika (ROC)
https://en.wikipedia.org/wiki/ ... istic
i

statystyki J.
https://en.wikipedia.org/wiki/ ... istic
Youdena, ale można to również zrobić innymi metodami, takimi jak wyszukiwanie za pomocą algorytmu genetycznego.
Oto artykuł w recenzowanym czasopiśmie opisujący to w medycynie:
http://www.ncbi.nlm.nih.gov/pm ... 15362
http://www.ncbi.nlm.nih.gov/pm ... 5362/
/
O ile wiem, w Pythonie nie ma pakietu do tego, ale znalezienie go za pomocą wyszukiwania brute force w Pythonie jest stosunkowo łatwe (ale nieefektywne).
To jakiś kod R, który to robi.
## load data
DD73OP <- read.table("/my_probabilites.txt", header=T, quote="\"")library("pROC")
# No smoothing
roc_OP <- roc(DD73OP$tc, DD73OP$prob)
auc_OP <- auc(roc_OP)
auc_OP
Area under the curve: 0.8909
plot(roc_OP)# Best threshold
# Method: Youden
#Youden's J statistic (Youden, 1950) is employed. The optimal cut-off is the threshold that maximizes the distance to the identity (diagonal) line. Can be shortened to "y".
#The optimality criterion is:
#max(sensitivities + specificities)
coords(roc_OP, "best", ret=c("threshold", "specificity", "sensitivity"), best.method="youden")
#threshold specificity sensitivity
#0.7276835 0.9092466 0.7559022
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wydaje się, że masz tutaj mylące pojęcia. Próg nie jest pojęciem dla „klasyfikatora ogólnego” - większość podstawowych podejść opiera się na jakimś niestandardowym progu, ale większość istniejących metod tworzy złożone reguły klasyfikacji, których nie można (lub przynajmniej nie należy) uznać za próg.
Po pierwsze, nikt nie może odpowiedzieć na twoje pytanie o domyślny próg klasyfikatora scikit, ponieważ nie ma czegoś takiego.
Ważenie drugiej klasy nie jest progiem, jest to zdolność klasyfikatora do radzenia sobie z niezrównoważonymi klasami i jest czymś, co zależy od konkretnego klasyfikatora. Na przykład - w przypadku SVM jest to sposób ważenia słabych zmiennych w problemie optymalizacji lub, jeśli wolisz, górnych granic wartości mnożników Lagrange'a związanych z określonymi klasami. Ustawienie tej wartości na „auto” oznacza użycie domyślnej heurystyki, ale znowu - nie można tego po prostu przełożyć na jakąś wartość progową.
Z drugiej strony naiwny Bayes

bezpośrednio

szacuje prawdopodobieństwo wykonania zajęć ze zbioru uczącego. Nazywa się to „poprzednia klasa” i można ją ustawić w konstruktorze za pomocą zmiennej „class_prior”.
Z dokumentacji:

Prawdopodobieństwa a priori klas. Jeśli zostało to określone, przeory nie są korygowane zgodnie z danymi.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Na wypadek, gdyby ktoś odwiedził ten wątek w nadziei na gotową do użycia funkcję (python 2.7). W tym przykładzie przycinanie ma na celu odzwierciedlenie relacji między zdarzeniami a innymi elementami w oryginalnym zbiorze danych

df
, podczas

y_prob

może być wynikiem metody .predict_proba (przy założeniu warstwowego podziału pociągu/testu).
def predict_with_cutoff(colname, y_prob, df):
n_events = df[colname].values
event_rate = sum(n_events)/float(df.shape[0]) * 100
threshold = np.percentile(y_prob[:, 1], 100 - event_rate)
print "Cutoff/threshold at: " + str(threshold)
y_pred = [1 if x >= threshold else 0 for x in y_prob[:, 1]]
return y_pred

Nie krępuj się krytykować/modyfikować. miejmy nadzieję, że pomaga to w rzadkich przypadkach, gdy równoważenie klas nie wchodzi w grę, a sam zbiór danych jest wysoce niezrównoważony.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się