2013-07-16 22 views
7

Pracuję nad identyfikacją punktów 3D za pomocą metody RandomForest z scikita. Jednym z problemów, które napotykam, jest to, że niektóre klasy są obecne częściej niż inne klasy. Oznacza to, że w procesie generowania prognoz od wyszkolonego klasyfikatora, jeśli klasyfikator nie jest pewny klasy punktowej, najprawdopodobniej założy, że należy do jednej ze wspólnych klas, a nie do mniej powszechnej klasy.Jak klasy wagowe w implementacji RandomForest

Widzę, że w dokumentacji scikit for random forests znajduje się parametr sample_weight w metodzie dopasowania. Z tego co mogę powiedzieć, że po prostu waży pewne ogólne próbki (powiedzmy, że mam 50 plików, z których ćwiczę, to waży pierwszą próbkę dwukrotnie więcej niż wszystko inne) niż klasy. To nie rozwiązuje problemu, ponieważ najmniej popularne klasy są tak rzadkie we wszystkich próbkach, które mam. To tylko natura tej konkretnej klasy.

Znalazłem kilka artykułów na temat zrównoważonych losowych lasów i losowych lasów. Ale nie widziałem nic o tym, jak używać tego w scikit. Mam nadzieję, że się mylę - czy istnieje sposób na wbudowanie klas wagowych? Czy powinienem napisać coś osobnego, co sztucznie wyrównuje wagę różnych klas w moich próbkach?

* EDIT, aby wyjaśnić moje zrozumienie sample_weight * Sample_weight według dokumentacji wydaje się odnosić do próbek, a nie kategorii wagowej. Więc jeśli mam pliki A, B i C oraz klas 1, 2 i 3 I powiedzmy:

A = [1 1 1 2] 
B = [2 2 1 1] 
C = [3 1 1 1] 

Patrząc powyżej mamy sytuację, bardzo uproszczoną, w której mamy bardzo niewielu z klasy 3 w porównaniu do pozostałe klasy. Moja sytuacja ma 8 klas i trenuje na milionach punktów, ale proporcje są wciąż niewiarygodnie przekręcone w stosunku do dwóch konkretnych klas.

Używając sample_weight, która przyjmuje tablicę o rozmiarze m (m będącą liczbą próbek), byłbym w stanie zważyć jak bardzo jeden z tych trzech plików działa. Tak więc rozumiem, że mogę zrobić sample_weight = [1 1 2], które sprawiłoby, że próbka C byłaby dwa razy silniejsza niż pozostałe dwie próbki. Ale to naprawdę nie pomaga, ponieważ moim problemem jest to, że klasa 3 jest bardzo rzadka (w danych rzeczywistych jest to 1k punktów na milion zamiast 1 na 12). Zwiększenie wagi danej próbki nie zwiększy wagi poszczególnych klas, chyba że sfałszuję niektóre dane, w których próba składa się prawie z samej klasy.

Znalazłem sklearn.preprocessing.balance_weights(y) w dokumentacji, ale nie mogę znaleźć nikogo, kto by z niego korzystał. Teoretycznie robi to, czego potrzebuję, ale nie widzę, jak mogę dopasować tablicę wag do mojego Losowego Lasu.

+4

Nie rozumiem: "To nie rozwiązuje problemu, ponieważ najmniej popularne klasy są tak rzadkie we wszystkich próbkach, które mam. To tylko charakter tej konkretnej klasy." Jeśli przykładamy wagę próbki do 'sample_weight = (1/n_samples_in_same_class)', która dałaby rozsądne wartości dla klas klas. – ogrisel

+0

sample_weight zgodnie z dokumentacją wydaje się odnosić się do próbek, a nie do masy klasowej. – Nahkki

+1

Tak, ale możesz przypisać tę samą masę próbki do wszystkich próbek tej samej klasy, a Ty skutecznie ważymy tak, jak gdybyś dostarczył wagi klas. Można symulować wagi klas, podając masę próbki, ale nie odwrotnie. – ogrisel

Odpowiedz

2

Zgaduję, że to dotyczy tylko nowszej wersji nauki naukowej, ale możesz teraz z niej korzystać.

rf = RandomForestClassifier(class_weight="balanced")