2016-01-02 14 views
5

Próbuję wykonać klasyfikację wielowartościową z SVM. Mam prawie 8k funkcji, a także wektor y o długości prawie 400. Mam już binaryzowane wektory Y, więc nie używałem MultiLabelBinarizer(), ale kiedy używam go z surową formą moich danych Y, to wciąż daje to samo.Scikit-Learn: Label not x jest obecny we wszystkich przykładach szkoleniowych

Używam tego kodu:

X = np.genfromtxt('data_X', delimiter=";") 
Y = np.genfromtxt('data_y', delimiter=";") 
training_X = X[:2600,:] 
training_y = Y[:2600,:] 

test_sample = X[2600:2601,:] 
test_result = Y[2600:2601,:] 

classif = OneVsRestClassifier(SVC(kernel='rbf')) 
classif.fit(training_X, training_y) 
print(classif.predict(test_sample)) 
print(test_result) 

Wszakże procesu dopasowania, jeśli chodzi o części predykcji, to mówi Label not x is present in all training examples (x jest kilka różnych numerów w zakresie mojego y długości wektora, która wynosi 400) . Następnie podaje przewidywany wektor y, który jest zawsze wektorem zerowym o długości 400 (długość wektora y). Jestem nowy w nauce scikit, a także w uczeniu maszynowym. Nie mogłem wymyślić problemu tutaj. W czym problem i co należy zrobić, aby to naprawić? Dzięki.

Odpowiedz

10

Są 2 problemy:

1) Brakujące etykiety ostrzegawcze
2) Otrzymujesz wszystkie 0 dla przewidywań

ostrzeżenie oznacza, że ​​niektóre z twoich zajęciach brakuje danych treningowych. Jest to powszechny problem. Jeśli masz 400 klas, niektóre z nich muszą występować bardzo rzadko, a przy jakimkolwiek podziale danych niektóre klasy mogą nie być dostępne po jednej stronie podziału. Mogą również istnieć klasy, które w ogóle nie występują w twoich danych. Możesz spróbować Y.sum(axis=0).all() i jeśli jest to Fałsz, to niektóre klasy nie występują nawet w Y. To wszystko brzmi okropnie, ale realistycznie, nie będziesz w stanie poprawnie przewidzieć klas, które wystąpią 0, 1 lub bardzo małe i tak wiele razy, więc przewidywanie 0 dla nich jest prawdopodobnie najlepszym rozwiązaniem.

Jeśli chodzi o prognozy dla wszystkich 0, zwrócę uwagę, że przy 400 klasach prawdopodobnie wszystkie klasy występują znacznie rzadziej niż przez połowę czasu. Aby uzyskać najwyższą częstotliwość etykiet, możesz sprawdzić, Y.mean(axis=0).max(). Przy 400 klasach może to być tylko kilka procent. Jeśli tak, klasyfikator binarny, który musi przewidzieć 0-1 dla każdej klasy, prawdopodobnie wybierze 0 dla wszystkich klas we wszystkich instancjach. To naprawdę nie jest błąd, tylko dlatego, że wszystkie częstotliwości klasy są niskie.

Jeśli wiesz, że każda instancja ma etykietę dodatnią (przynajmniej jedną), możesz uzyskać wartości decyzji (clf.decision_function) i wybrać klasę o najwyższej dla każdej instancji. Będziesz jednak musiał napisać jakiś kod, żeby to zrobić.

Miałem kiedyś 10 najlepszych w konkursie Kaggle, który był podobny do tego. Był to problem wielowarstwowy z ~ 200 klasami, z których żadna nie występowała nawet z częstotliwością 10%, i potrzebowaliśmy przewidywań 0-1. W tym przypadku uzyskałem wartości decyzyjne i wziąłem najwyższą, plus wszystko, co było powyżej progu. Wybrałem próg, który działał najlepiej w zestawie wstrzymującym. Kod tego wpisu znajduje się na Github: Kaggle Greek Media code. Możesz na to spojrzeć.

Jeśli dotarłeś tak daleko, dziękuję za przeczytanie. Nadzieja, która pomaga.

+1

Cześć, dziękuję za odpowiedź z mnóstwem przydatnych rzeczy. Wypróbowałem 'Y.sum (axis = 0) .all()' i zwróciło True. Ponadto wypróbowałem 'Y.mean (axis = 0) .max()' i zwróciło '0.315981070258'. Czy nadal powinienem implementować 'clf.decision_function'? Czy możesz dokładniej o tym wiedzieć, jak go wdrożyć? Przykro mi, jestem bardzo nowy w tych sprawach, więc nie mogłem zrozumieć, co zrobić z 'decyzją_funkcyjną'. – malisit

+1

Mówię, że jeśli otrzymujesz wszystkie prognozy zera i wiesz, że tam powinny być jakieś 1, możesz spróbować uzyskać wartości decyzyjne zamiast tego i przewidywać 1, gdy jest powyżej pewnego progu.Twoje przewidywane etykiety to: '(próg_oceny> próg) .astype (float)'. Próg będzie mniejszy niż 0, ponieważ 0 jest progiem używanym przez klasyfikator i nie uzyskuje żadnych pozytywów. Ewentualnie, jeśli wiesz, że istnieje co najmniej jedna etykieta pozytywna na instancję, możesz wybrać etykietę, która ma najwyższy DV (nadal będzie ujemny). – Dthal

+0

Dzięki! Intuicja i kod podany na GitHub naprawdę pomogły. – malisit