Uczyłem się o drzewach decyzyjnych i czuję, że do tej pory je rozumiałem i kryją się za nimi matematyka całkiem nieźle, z wyjątkiem jednej rzeczy: współczynnika wzmocnienia.
Jak rozumiem, współczynnik wzmocnienia jest zaimplementowany w celu ukarania funkcji, które mogą przyjmować DUŻO możliwych wartości.
Jeśli funkcja przyjmuje wiele możliwych wartości, staje się prawdopodobne, że jeśli podzielimy tę cechę, mogą istnieć wartości, które wskazują tylko jedną klasę, ale po prostu dlatego, że są tylko 1 lub 2 dane i tak wskazuje tę wartość dla tej funkcji.
Innymi słowy, jedynym powodem, dla którego uzyskalibyśmy niską entropię przy podziale na tej funkcji, jest to, że funkcja mogłaby przyjąć wiele wartości, a zatem wiele z tych wartości wskazywało konkretnie na jedną etykietę . Tak więc nasz algorytm drzewa decyzyjnego podzieliłby się na coś takiego jak „ID #” i błędnie obliczyłby, że uzyskaliśmy OGROMNY przyrost informacji.
Jednak wygląda to na problem tylko dlatego, że „ID #” to funkcja, której nie powinniśmy od początku dzielić. To znaczy, gdybyśmy mieli inną funkcję, która również miałaby wiele możliwych wartości, ale każda z tych wartości faktycznie DID implikuje jakąś etykietę dla tego punktu danych, czy zatem zastosowanie współczynnika wzmocnienia nie oznaczałoby, że faktycznie psujemy nasze drzewo decyzyjne, karając tak naprawdę bardzo dobry podział z mnóstwem zdobytych informacji?
Czy nie lepiej jest po prostu zidentyfikować, która funkcja nie będzie miała nic wspólnego z naszym etykietowaniem, ZANIM wprowadzimy dane treningowe do algorytmu?
IDK, po prostu nie zobacz, dlaczego współczynnik wzmocnienia byłby naprawdę przydatny …
Odpowiedź
Miałem te same wątpliwości, kiedy robiłem mój Master „Stopień”. Przede wszystkim nie należy umieszczać czegoś tak przypadkowego jak „identyfikatory”. W tym miejscu pojawia się wstępne przetwarzanie danych. Weźmy zbiór danych, który zawiera użytkowników i ich preferencje dotyczące gatunku filmowego na podstawie takich zmiennych, jak płeć, grupa wiekowa, ocena, bla, bla. Przy pomocy zdobywanych informacji dzielisz się na „Płeć „(zakładając, że ma największy przyrost informacji), a teraz zmienne„ Grupa wieku ”i„ Ocena ”mogą być równie ważne, a przy pomocy współczynnika zysku będzie to karać zmienną o bardziej wyraźnych wartościach, co pomoże nam zdecydować split na następnym poziomie.
Komentarze
- OKaaaay, super! Więc używamy współczynnika wzmocnienia tylko wtedy, gdy jesteśmy pomiędzy dzieleniem dwóch różnych możliwych funkcji Czy to po to, aby wybrać ten, który jest bardziej prawdopodobny dla danych testowych, aby mieć wcześniej widzianą wartość, ponieważ to jest klimat, który otrzymałem z przykładu ID, dlatego jest to zły podział, który miał tak dużą szansę na wzięcie na różnych wartościach (w tym przypadku żadna inna osoba nie będzie miała tego samego identyfikatora).
- To sprawia, że ALOT ma większy sens . Każde wyjaśnienie, które ' przeczytałem, używa identyfikatorów i sprawia, że zastanawiam się, dlaczego ktoś ma to w zbiorze danych? !!!! Dzięki Danny! ' podoba mi się twój post, ale nie ' nie mam jeszcze wystarczającej reputacji.
Odpowiedź
Pozyskiwanie informacji to jedna z heurystyk, która pomaga wybrać atrybuty do wyboru.
Jak wiesz, drzewa decyzyjne są skonstruowane -down rekurencyjny sposób dziel i rządź. Przykłady są dzielone rekurencyjnie na porcje na podstawie wybranych atrybutów.
W algorytmach ID3 używamy wybierania atrybutów z największym zyskiem informacyjnym.
Niech $ p_i $ będzie prawdopodobieństwem, że dowolna krotka w $ D $ należy do klasy $ C_i $ . Więc $ p_i = | C_ {i, d} | / | D | $ Oczekiwane informacje (entropia) potrzebne do sklasyfikowania krotki w $ D $ $$ Info (D) = – \ sum_ {i = 1} ^ {m} {p_i * \ log (p_i)} $$
Informacje potrzebne (po użyciu A do podzielenia D na części v) do sklasyfikowania D: $$ Info_A (D) = – \ sum_ {j = 1} ^ {v} {D_j / D * Info_j (D)} $$
Informacje uzyskane przez rozgałęzienie atrybutu A
$$ Gain (A) = Info (D) – Info_A (D) $$
W algorytmie C4.5 musimy podzielić różnicę informacji przez $ SplitInfo (A) $
$$ Gain (A) = (Info (D) – Info_A (D)) / SplitInfo (A) $$