Wyobraź sobie, że miałbyś kupować samochód, czy chodziłbyś tylko do sklepu i kupowałbyś ten podstawowy, który po prostu widzisz? Nie, prawda? Zawsze konsultujesz się z kilkoma osobami wokół siebie, bierzesz ich opinie, dodajesz do nich swoje badania, a następnie wybierasz ostateczną decyzję. Weźmy łatwiejszy scenariusz: czy za każdym razem, gdy wybierasz film, pyta się znajomych o recenzje na jego temat (chyba, że poza tym, oczywiście, wystawia jedną z ulubionych aktorek)?
Czy kiedykolwiek zastanawiałeś się, dlaczego przed wyjazdem na film lub przed zakupem samochodu możemy zapytać wiele osób o ich opinie lub recenzje, a może być również, przed planowaniem wakacji? To dlatego, że recenzja jednej osoby może być również tendencyjna zgodnie z jej preferencjami, jednak gdy zapytamy kilka osób, staramy się pozbyć uprzedzeń, które jedna osoba może zapewnić. Jedna osoba może mieć naprawdę silną niechęć do wybranego miejsca, ze względu na jej doświadczenie w tym miejscu; jednak dziesięć osób może mieć bardzo silne preferencje dla równoważnego miejsca, ponieważ muszą mieć tam wspaniałe doświadczenie. Z tego wnioskujemy, że ta jedna osoba była bardziej wyjątkowym przypadkiem, a jej doświadczenie może być również jednym z przypadków.
Innym przykładem, z którym jestem pewna, że wszyscy ludzie się zetknęli, są rozmowy w każdej firmie czy uczelni. Często musimy przechodzić wiele rund wywiadów. chociaż pytania zadawane w wielu rundach wywiadów są podobne, jeśli nie takie same – firmy wciąż to wybierają. Uzasadnieniem jest to, że muszą posiadać opinie wielu liderów rekrutacyjnych. Jeśli wielu liderów zetknie się z kandydatem, to prawdopodobieństwo, że zostanie on zatrudniony w uczciwy sposób, jest wysokie.
W świecie analityki i data science jest to często nazywane “ensembling”. Ensembling może być “rodzajem nadzorowanej techniki uczenia się, w której wiele modeli jest szkolonych w oparciu o zestaw danych szkoleniowych, a ich indywidualne wyniki są łączone przez pewne zasady w celu uzyskania ostatecznych wyników”.
Przerwijmy powyższą definicję i spójrzmy na nią krok po kroku.
Kiedy mówimy, że wiele modeli jest szkolonych na zbiorze danych, ten sam model z różnymi hiper-parametrami lub różne modele są często szkolone na zbiorze danych szkoleniowych. Obserwacje szkoleniowe mogą się nieznacznie różnić podczas próbkowania, jednak ogólna populacja pozostaje równoważna.
“Dane wyjściowe są łączone przez jakąś regułę” – może istnieć wiele reguł, według których dane wyjściowe są łączone. Najczęściej spotykane są typowe (w kategoriach danych liczbowych) lub głosowanie (w kategoriach danych kategorycznych). Kiedy różne modele dają nam liczbowe wyjście, po prostu bierzemy typowe z wszystkich wyjść i używamy typowego, ponieważ wynik jest typowy. Tylko w przypadku wyjścia kategorycznego, użyjemy głosu – wyjście występujące maksymalnie wiele razy jest wyjściem końcowym. Istnieją też inne złożone metody wyprowadzania danych wyjściowych, ale nie są one objęte zakresem tego tekstu.
Random Forest jest jednym z tak potężnych algorytmów uczenia maszynowego, który działa poprzez tworzenie wielu drzew decyzyjnych, a następnie łączenie danych wyjściowych generowanych przez każde z wybranych drzew. Drzewo decyzyjne może być modelem klasyfikacyjnym, który działa na zasadzie przyrostu danych w każdym węźle. Dla wszystkich punktów informacyjnych drzewo decyzyjne będzie próbowało klasyfikować punkty danych w każdym z węzłów i sprawdzać przyrost informacji w każdym z nich. Następnie będzie klasyfikować w węźle, w którym przyrost informacji jest maksymalny. Drzewa decyzyjne są bardzo proste i proste do poznania modeli; potrzebują jednak bardzo małej mocy predykcyjnej. W rzeczywistości są one nazywane słabymi uczniami.
Random Forest działa na równorzędnych słabych uczących się. Łączy w sobie wydajność wielu drzew decyzyjnych, po czym w końcu tworzy własną wydajność. Random Forest działa na równoważnej zasadzie jak Decision Tress; jednak nie wybiera wszystkich punktów informacyjnych i zmiennych w każdym z drzew. Wybiera losowo punkty danych i zmienne w każdym z drzew, które tworzy, a następnie łączy dane wyjściowe na górze. Eliminuje to stronniczość, jaką model drzewa wyboru może wprowadzić do systemu. Zobaczymy to w następnej części, gdy weźmiemy przykładowy zestaw danych i porównamy dokładność Lasu Losowego i Drzewa Decyzyjnego.
Weźmy teraz małe studium przypadku i sprawdźmy, czy można zaimplementować wiele modeli Lasów Losowych o różnych hiperparametrach i porównajmy jeden z modeli Lasów Losowych z modelem drzewa decyzyjnego. (Jestem pewien, że przyjmiecie w tej kwestii prawdę – nawet bez wdrożenia modelu, powiemy intuicyjnie, że Random Forest da nam lepsze wyniki niż Decision Tree). Zbiór danych pochodzi ze strony internetowej UCI i można go znaleźć pod tym linkiem. Informacja zawiera 7 zmiennych – sześć objaśniających (Cena zakupu, Konserwacja, NumDoors, NumPersons, BootSpace, Bezpieczeństwo) oraz jedną zmienną odpowiedzi (Warunek). Zmienne te są objaśniające i dotyczą atrybutów samochodów, dlatego też zmienną odpowiedzi jest “Akceptowalność samochodu”. Wszystkie zmienne mają charakter kategoryczny i mają 3-4 poziomy czynników w każdym z nich.
Rozpocznijmy wdrażanie kodu R i przewidujmy zmienne objaśniające akceptowalność samochodów, które są obsługiwane przez zmienne objaśniające.
# Źródło danych: https://archive.ics.uci.edu/ml/machine-learning-databases/car/
install.packages(“randomForest”)
biblioteka (randomForest)
1
2
3
4
5
6
7
8
# Load the dataset and explore
data1 <- read.csv(file.choose(), header = TRUE)
głowa (dane1)
str(dane1)
streszczenie(dane1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
> head(data1)
BuyingPrice Maintenance NumDoors NumPersons BootSpace Safety Condition
1 vhigh vhigh 2 2 małe niskie uncc
2 vhigh vhigh 2 2 small med unacc
3 vhigh vhigh 2 2 małe wysokie unacc
4 vhigh vhigh 2 2 med low unacc
5 vhigh vhigh 2 2 med med unacc
6 vhigh vhigh 2 2 med high unacc
> str(dane1)
data.frame”: 1728 obs. z 7 zmiennych:
$ BuyingPrice: Czynnik w/ 4 poziomy “wysoki”, “niski”, “med”,…: 4 4 4 4 4 4 4 4 4 4 …
$ Konserwacja: Czynnik z/ 4 poziomy “wysoki”, “niski”, “średni”,…: 4 4 4 4 4 4 4 4 4 4 …
$ NumDoors : Współczynnik w/ 4 poziomy “2”, “3”, “4”, “5more”: 1 1 1 1 1 1 1 1 1 1 …
$ NumPersons … $ NumPersons : Czynnik z/ 3 poziomy “2”, “4”, “więcej”: 1 1 1 1 1 1 1 1 1 2 …
$ BootSpace : Współczynnik w/ 3 poziomy “duży”, “med”, “mały”: 3 3 3 2 2 2 1 1 1 3 …
$ Bezpieczeństwo : Współczynnik w/ 3 poziomy “wysoki”, “niski”, “średni”: 2 3 1 2 3 1 2 3 1 2 …
$ Stan : Współczynnik w/ 4 poziomy “acc”, “dobry”, “niecc”,…: 3 3 3 3 3 3 3 3 3 3 …
> podsumowanie(dane1)
BuyingPrice Maintenance NumDoors NumPersons BootSpace Safety Condition
wysoka :432 wysoka :432 2 :432 2 :576 duża :576 wysoka:576 wg : 384
niski :432 niski :432 3 :432 4 :576 med :576 niski :576 dobry : 69
med :432 med :432 4 :432 more:576 small:576 med :576 unacc:1210
vhigh:432 vhigh:432 5more:432 vgood: 65
Teraz podzielimy zbiór danych na pociąg i walidację ustawioną w stosunku 70:30. Możemy również stworzyć zestaw danych testowych, ale na razie będziemy tylko trzymać zestaw treningu i walidacji.
1
2
3
4
5
6
7
8
# Podziel się na Pociąg i Zestawy Walidacyjne
# Zestaw treningowy: Zestaw do walidacji = 70 : 30 (losowo)
set.seed(100)
pociąg <- próbka(nrow(data1), 0,7*nrow(data1), zastąp = FALSE)
TrainSet <- data1[pociąg,]
ValidSet <- data1[-pociąg,]
streszczenie (TrainSet)
streszczenie(ValidSet)
1
2
3
4
5
6
7
8
9
10
11
12
> podsumowanie (TrainSet)
BuyingPrice Maintenance NumDoors NumPersons BootSpace Safety Condition
wysoki :313 wysoki :287 2 :305 2 :406 duży :416 wysoki :396 wysoki :264
niski :292 niski :317 3 :300 4 :399 med :383 niski :412 dobry : 52
med :305 med :303 4 :295 more:404 small:410 med :401 unacc:856
vhigh:299 vhigh:302 5more:309 vgood: 37
> podsumowanie(ValidSet)
BuyingPrice Maintenance NumDoors NumPersons BootSpace Safety Condition
wysoki :119 wysoki :145 2 :127 2 :170 duży :160 wysoki:180 acc :120
niskie :140 niskie :115 3 :132 4 :177 med :193 niskie :164 dobre : 17
med :127 med :129 4 :137 więcej:172 mały:166 med :175 uncc:354
vhigh:133 vhigh:130 5more:123 vgood: 28
WITAM!
Tutaj znajdziesz codzienne wiadomości i tutoriale na temat R, napisane przez setki blogerów.
Jest wiele sposobów, aby śledzić nas –
Przez e-mail:
Twój e-mail tutaj
Na Facebooku:
Jeśli sam jesteś blogerem R, zachęcamy do dodania własnego kanału treści R na tej stronie (nieanglojęzyczni blogerzy R powinni dodać siebie – tutaj).
PRACE RSS DLA R-USŁUGODAWCÓW
Wykładowca nauk statystycznych i nauk o danych
Starszy specjalista ds. danych badawczych
Stanowisko naukowca ds. danych w zakresie opracowywania oprogramowania i narzędzi z dziedziny genomiki, dużych zbiorów danych i medycyny precyzyjnej
Data Consultant 1 @ Cheney, Washington, Stany Zjednoczone
Senior Scientist, Translational Informatics @ Vancouver, BC, Kanada
PUNKTY PREZENTACYJNE
Szkolenia z zakresu data science w Berlinie i Hamburgu
Praca ze Statystyką Kanady Dane w R, Część 4: Kanadyjskie Dane Spisu Powszechnego – Tworzenie Pakietu Spisu Powszechnego
SMC w sprawie wybuchu epidemii nCoV w latach 2019-2020
rWind znów działa!
Warsztaty Dataviz w RStudio::conf
Lepiej: R dla absolutnie początkujących
Co i kim jest społeczność informatyczna? Jaki jest jej udział?
Jak oblicza się przyrost informacji?
Lasso Regression (domowej roboty)
Strojenie hiperparametru i #TidyWtorek konsumpcja żywności
rstudio::conf 2020 Videoklipy
Start w R markdown
RStudio 1.3 Podgląd: Konfiguracja i ustawienia
Efektywne zarządzanie danymi w zakresie R
Skupione próby randomizowane i efekt projektowy
INNE MIEJSCA
blogi SAS
Praca dla R-userów
Jak wdrożyć Lasy Przypadkowe w R
9 stycznia 2018 r.
Przez Perceptive Analytics
Podziel się
[Ten artykuł został po raz pierwszy opublikowany na R-posts.com, i uprzejmie przyczynił się do R-blogerów]. (Możesz zgłosić problem z treścią na tej stronie tutaj).
Chcesz podzielić się swoją treścią na R-bloggerach? Kliknij tutaj, jeśli masz blog, lub tutaj, jeśli nie masz.
Podziel się .
Tweet
Wyobraź sobie, że miałbyś kupić samochód, czy po prostu poszedłbyś do sklepu i kupiłbyś ten pierwszy, który zobaczysz? Nie, prawda? Zazwyczaj konsultujesz się z kilkoma osobami dookoła siebie, bierzesz ich opinię, dodajesz do niej swoje badania, a następnie idziesz na ostateczną decyzję. Przyjmijmy prostszy scenariusz: czy za każdym razem, gdy idziesz do kina, pytasz swoich przyjaciół o recenzje na temat filmu (chyba, że poza tym, oczywiście, wystawiasz jedną z ulubionych aktorek)?
Czy kiedykolwiek zastanawiałeś się, dlaczego pytamy wiele osób o ich opinie lub recenzje przed wyjazdem na film lub przed zakupem samochodu, lub może być, przed planowaniem wakacji? To dlatego, że recenzje jednej osoby mogą być tendencyjne zgodnie z jej preferencjami; jednak kiedy pytamy o wiele osób, staramy się usunąć tendencje, które może zapewnić jedna osoba. Jedna osoba może mieć bardzo silną niechęć do konkretnego miejsca, ze względu na swoje doświadczenie w tym miejscu; jednak dziesięć innych osób może mieć bardzo silne preferencje dla tego samego miejsca, ponieważ miały tam wspaniałe doświadczenia. Z tego możemy wywnioskować, że ta jedna osoba była bardziej wyjątkowym przypadkiem, a jej doświadczenie może być jednym z nich.
Innym przykładem, z którym jestem pewna, że wszyscy się zetknęliśmy, jest rozmowa kwalifikacyjna w dowolnej firmie lub uczelni. Często musimy przechodzić przez wiele rund wywiadów. Mimo, że pytania zadawane w wielu rundach są podobne, jeśli nie takie same, to jednak firmy nadal się na nie decydują. Powodem jest to, że chcą mieć opinie od wielu liderów rekrutacji. Jeśli wielu liderów wyzerowuje się na kandydata, to prawdopodobieństwo, że okaże się on dobrym kandydatem jest wysokie.
W świecie analityki i data science nazywa się to “ensembling”. Ensembling jest “rodzajem nadzorowanej techniki uczenia się, w której wiele modeli jest szkolonych w oparciu o zestaw danych szkoleniowych, a ich indywidualne wyniki są łączone przez jakąś zasadę w celu uzyskania efektu końcowego”.
Przerwijmy powyższą definicję i spójrzmy na nią krok po kroku.
Kiedy mówimy, że wiele modeli jest szkolonych na zbiorze danych, ten sam model z różnymi hiper-parametrami lub różne modele mogą być szkolone na zbiorze danych szkoleniowych. Obserwacje szkoleniowe mogą się nieznacznie różnić podczas próbkowania, jednak ogólna populacja pozostaje taka sama.
“Dane wyjściowe są łączone przez jakąś regułę” – może istnieć wiele reguł, według których dane wyjściowe są łączone. Najczęstsze z nich to średnia (w kategoriach danych liczbowych) lub głosowanie (w kategoriach danych kategorycznych). Kiedy różne modele dają nam liczbowe wyjście, możemy po prostu wziąć średnią wszystkich wyjść i użyć średniej jako wyniku. W przypadku wyjścia kategorycznego, możemy użyć głosu – wyjście występujące maksymalnie wiele razy jest wyjściem końcowym. Istnieją również inne złożone metody wyprowadzania danych wyjściowych, ale nie są one objęte zakresem tego artykułu.
Random Forest jest jednym z tak potężnych algorytmów uczenia maszynowego, który działa poprzez tworzenie wielu drzew decyzyjnych, a następnie łączenie danych wyjściowych generowanych przez każde z nich. Drzewo decyzyjne jest modelem klasyfikacyjnym, który pracuje nad koncepcją zdobywania informacji w każdym węźle. Dla wszystkich punktów danych drzewo decyzyjne będzie próbowało klasyfikować punkty danych w każdym z węzłów i sprawdzać przyrost informacji w każdym z węzłów. Następnie będzie klasyfikować w węźle, w którym przyrost informacji jest maksymalny. Następnie będzie śledzić ten proces aż do wyczerpania wszystkich węzłów lub braku dalszego przyrostu informacji. Drzewa decyzyjne są bardzo prostymi i łatwymi do zrozumienia modelami; mają jednak bardzo niską moc predykcyjną. W rzeczywistości są one nazywane słabymi uczącymi się.
Random Forest działa na tych samych słabych uczących się. Łączy w sobie wyniki wielu drzew decyzyjnych, a następnie w końcu tworzy własne wyniki. Random Forest działa na tej samej zasadzie co Decision Tress; jednak nie wybiera wszystkich punktów danych i zmiennych w każdym z drzew. Wybiera losowo punkty danych i zmienne w każdym z drzew, które tworzy, a następnie łączy dane wyjściowe na końcu. Eliminuje to stronniczość, jaką model drzewa decyzyjnego może wprowadzić do systemu. Ponadto, znacznie poprawia on zdolność przewidywania. Zobaczymy to w następnej części, kiedy weźmiemy przykładowy zestaw danych i porównamy dokładność Lasu Losowego i Drzewa Decyzyjnego.
Weźmy teraz małe studium przypadku i spróbujmy zaimplementować wiele modeli Lasów Sandomowych o różnych hiperparametrach i porównajmy jeden z modeli Lasów Sandomowych z modelem drzewa decyzyjnego. (Jestem pewien, że zgodzicie się ze mną w tej kwestii – nawet bez wdrożenia modelu, możemy intuicyjnie powiedzieć, że Random Forest da nam lepsze wyniki niż Decision Tree). Zbiór danych pochodzi ze strony internetowej UCI i można go znaleźć na tym linku. Dane zawierają 7 zmiennych – sześć objaśniających (Cena zakupu, Konserwacja, NumDoors, NumPersons, BootSpace, Bezpieczeństwo) oraz jedną zmienną odpowiedzi (Warunek). Zmienne te są objaśniające i odnoszą się do atrybutów samochodów, a zmienną odpowiedzi jest “Akceptowalność samochodu”. Wszystkie zmienne mają charakter kategoryczny i mają 3-4 poziomy czynników w każdym z nich.
Zacznijmy wdrażanie kodu R i przewidujmy akceptowalność samochodów w oparciu o zmienne objaśniające.
1
2
3
4
# Źródło danych: https://archive.ics.uci.edu/ml/machine-learning-databases/car/
install.packages(“randomForest”)
biblioteka (randomForest)
1
2
3
4
5
6
7
8
# Load the dataset and explore
data1 <- read.csv(file.choose(), header = TRUE)
głowa (dane1)
str(dane1)
streszczenie(dane1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
> head(data1)
BuyingPrice Maintenance NumDoors NumPersons BootSpace Safety Condition
1 vhigh vhigh 2 2 małe niskie uncc
2 vhigh vhigh 2 2 small med unacc
3 vhigh vhigh 2 2 małe wysokie unacc
4 vhigh vhigh 2 2 med low unacc
5 vhigh vhigh 2 2 med med unacc
6 vhigh vhigh 2 2 med high unacc
> str(dane1)
data.frame”: 1728 obs. z 7 zmiennych:
$ BuyingPrice: Czynnik w/ 4 poziomy “wysoki”, “niski”, “med”,…: 4 4 4 4 4 4 4 4 4 4 …
$ Konserwacja: Czynnik z/ 4 poziomy “wysoki”, “niski”, “średni”,…: 4 4 4 4 4 4 4 4 4 4 …
$ NumDoors : Współczynnik w/ 4 poziomy “2”, “3”, “4”, “5more”: 1 1 1 1 1 1 1 1 1 1 …
$ NumPersons … $ NumPersons : Czynnik z/ 3 poziomy “2”, “4”, “więcej”: 1 1 1 1 1 1 1 1 1 2 …
$ BootSpace : Współczynnik w/ 3 poziomy “duży”, “med”, “mały”: 3 3 3 2 2 2 1 1 1 3 …
$ Bezpieczeństwo : Współczynnik w/ 3 poziomy “wysoki”, “niski”, “średni”: 2 3 1 2 3 1 2 3 1 2 …
$ Stan : Współczynnik w/ 4 poziomy “acc”, “dobry”, “niecc”,…: 3 3 3 3 3 3 3 3 3 3 …
> podsumowanie(dane1)
BuyingPrice Maintenance NumDoors NumPersons BootSpace Safety Condition
wysoka :432 wysoka :432 2 :432 2 :576 duża :576 wysoka:576 wg : 384
niski :432 niski :432 3 :432 4 :576 med :576 niski :576 dobry : 69
med :432 med :432 4 :432 more:576 small:576 med :576 unacc:1210
vhigh:432 vhigh:432 5more:432 vgood: 65
Teraz podzielimy zbiór danych na pociąg i walidację ustawioną w stosunku 70:30. Możemy również stworzyć zestaw danych testowych, ale na razie będziemy tylko trzymać zestaw treningu i walidacji.
1
2
3
4
5
6
7
8
# Podziel się na Pociąg i Zestawy Walidacyjne
# Zestaw treningowy: Zestaw do walidacji = 70 : 30 (losowo)
set.seed(100)
pociąg <- próbka(nrow(data1), 0,7*nrow(data1), zastąp = FALSE)
TrainSet <- data1[pociąg,]
ValidSet <- data1[-pociąg,]
streszczenie (TrainSet)
streszczenie(ValidSet)
1
2
3
4
5
6
7
8
9
10
11
12
> podsumowanie (TrainSet)
BuyingPrice Maintenance NumDoors NumPersons BootSpace Safety Condition
wysoki :313 wysoki :287 2 :305 2 :406 duży :416 wysoki :396 wysoki :264
niski :292 niski :317 3 :300 4 :399 med :383 niski :412 dobry : 52
med :305 med :303 4 :295 more:404 small:410 med :401 unacc:856
vhigh:299 vhigh:302 5more:309 vgood: 37
> podsumowanie(ValidSet)
BuyingPrice Maintenance NumDoors NumPersons BootSpace Safety Condition
wysoki :119 wysoki :145 2 :127 2 :170 duży :160 wysoki:180 acc :120
niskie :140 niskie :115 3 :132 4 :177 med :193 niskie :164 dobre : 17
med :127 med :129 4 :137 więcej:172 mały:166 med :175 uncc:354
vhigh:133 vhigh:130 5more:123 vgood: 28
Teraz stworzymy model Random Forest z domyślnymi parametrami, a następnie dostroimy go poprzez zmianę ‘mtry’. Możemy dostroić model lasu losowego poprzez zmianę liczby drzew (ntree) oraz liczby zmiennych losowo wybranych na każdym etapie (mtry). Zgodnie z opisem pakietu Random Forest:
Drzewo Ntree: Liczba drzew, które mają rosnąć. Liczba ta nie powinna być ustawiona na zbyt małą, aby zapewnić, że każdy rząd wejściowy będzie przewidywany co najmniej kilka razy.
Mtry: Liczba zmiennych losowo wybranych jako kandydatów przy każdym podziale. Zauważ, że domyślne wartości są różne dla klasyfikacji (sqrt(p) gdzie p jest liczbą zmiennych w x) i regresji (p/3)
# Stwórz model Random Forest z domyślnymi parametrami
model1 <- randomForest(Condition ~ ., data = TrainSet, importance = TRUE)
model1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> model 1
Zadzwoń:
randomForest(wzór = Stan ~ ., data = TrainSet, znaczenie = TRUE)
Rodzaj lasu losowego: klasyfikacja
Liczba drzew: 500
Liczba zmiennych wypróbowanych przy każdym podziale: 2
OOB oszacowanie poziomu błędu: 3.64%
Matryca dezorientacyjna:
acc good unacc vgood class.error
acc 253 7 4 0 0,04166667
dobry 3 44 1 4 0,15384615
niecc 18 1 837 0 0,02219626
towarowy 6 0 0 31 0,16216216
Domyślnie liczba drzew wynosi 500, a liczba zmiennych wypróbowanych w każdym podziale wynosi w tym przypadku 2. Wskaźnik błędów wynosi 3,6%.
1
2
3
# Fine tuning parameters of Random Forest model
model2 <- randomForest(Condition ~ ., data = TrainSet, ntree = 500, mtry = 6, importance = TRUE)
model2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> model 2
Zadzwoń:
randomForest(wzór = Stan ~ ., data = TrainSet, ntree = 500, mtry = 6, znaczenie = TRUE)
Rodzaj lasu losowego: klasyfikacja
Liczba drzew: 500
Liczba zmiennych wypróbowanych przy każdym podziale: 6
Oszacowanie poziomu błędu OOB: 2,32%.
Matryca dezorientacyjna:
acc good unacc vgood class.error
acc 254 4 6 0 0,03787879
dobry 3 47 1 1 0,09615385
niecc 10 1 845 0 0,01285047
towarowy 1 1 0 35 0,05405405
Kiedy zwiększyliśmy mtry do 6 z 2, wskaźnik błędu spadł z 3,6% do 2,32%. Będziemy teraz najpierw przewidywać na podstawie danych o pociągach, a następnie przewidywać na podstawie danych o walidacji.
1
2
3
4
# Predicting on train set
predTrain <- przewidzieć(model2, TrainSet, typ = “klasa”)
# Sprawdzanie dokładności klasyfikacji
tabela(predTrain, TrainSet$Condition)
1
2
3
4
5
6
7
> table(predTrain, TrainSet$Condition)
predTrain acc good unacc vgood
acc 264 0 0 0
dobry 0 52 0 0 0
uncc 0 0 856 0
Dobra 0 0 0 37
1
2
3
4
5
# Predicting on Validation set
predValid <- predict(model2, ValidSet, typ = “klasa”)
# Sprawdzanie dokładności klasyfikacji
mean(predValid == Warunek ValidSet$Condition)
tabela(predValid,ValidSet$Condition)
1
2
3
4
5
6
7
8
9
> mean(predValid == Warunek ValidSet$Condition)
[1] 0.9884393
> tabela(predValid,ValidSet$Condition)
predValid acc good unacc vgood
acc 117 0 2 0
dobry 1 16 0 0
niecc 1 0 352 0
Dobra 1 1 0 28
W przypadku przewidywań dotyczących zbioru danych o pociągach nie ma żadnej błędnej klasyfikacji; natomiast w przypadku zbioru danych dotyczących walidacji, 6 punktów danych jest błędnie sklasyfikowanych, a dokładność wynosi 98,84%. Możemy również użyć funkcji do sprawdzenia ważnych zmiennych. Poniższe funkcje pokazują spadek średniej dokładności dla każdej ze zmiennych.
1
2
3
# Aby sprawdzić ważne zmienne
znaczenie(model2)
varImpPlot(model2)
1
2
3
4
5
6
7
8
> znaczenie(model2)
acc good unacc vgood meanDecreaseAccuracy meanDecreaseGini
Cena nabycia 143 90534 80 38431 101 06518 66 75835 188 10368 71 15110
Utrzymanie 130,61956 77,28036 98,23423 43,18839 171,86195 90,08217
Numery drzwi 32.20910 16.14126 34.46697 19.06670 49.35935 32.45190
NumeryPersons 142.90425 51.76713 178.96850 49.06676 214.55381 125.13812
BootSpace 85.36372 60.34130 74.32042 50.24880 132.20780 72.22591
Bezpieczeństwo 179,91767 93,56347 207,03434 90,73874 275,92450 149,74474
1
2
> varImpPlot(model2)
<img data-attachment-id=”419″ data-permalink=”http://r-posts.com/how-to-implement-random-forests-in-r/1-3/” data-orig-file=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/1.png?fit=1191%2C900″ data-orig-size=”1191,900″ data-comments-opened=”1″ data-image-title=”1″ data-image-description=”” data-medium-file=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/1.png?fit=397%2C300″ data-large-file=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/1.png?fit=450%2C340″ src=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/1.png? resize=450%2C340″ alt=”Perceptive Analytics” width=”450″ height=”340″ class=”alignnone sizee-large wp-image-419 jetpack-lazy-image” data-recalc-dims=”1″ data-lazy-sizes=”(max-width: 450px) 100vw, 450px” data-lazy-src=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/1.png? resize=450%2C340&is-pending-load=1″ srcset=”data:image/gif;base64,R0lGODlhAQABAIAAAAAAP///yH5BAEAAAAAAAAAAAAAIBRAA7″><noscript><img data-attachment-id=”419″ data-permalink=”http://r-posts.com/how-to-implement-random-forests-in-r/1-3/” data-orig-file=”https://i2.wp.com/r-posts. com/wp-content/uploads/2018/01/1.png? fit=1191%2C900″ data-orig-size=”1191,900″ data-comments-opened=”1″ data-image-meta=”{“aperture”: “0”, “credit”:”, “camera”:”, “caption”:”, “created_timestamp”: “0”, “copyright”: “”, “focal_length”: “0”, “iso”: “0”, “shutter_speed”: “0”, “title”:”, “orientation”: “0”}” data-image-title=”1″ data-image-description=””” data-medium-file=”https://i2. wp.com/r-posts.com/wp-content/uploads/2018/01/1.png?fit=397%2C300″ data-large-file=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/1.png?fit=450%2C340″ src=”https://i2.wp.com/r-posts. com/wp-content/uploads/2018/01/1.png?resize=450%2C340″ alt=”Perceptive Analytics” width=”450″ height=”340″ class=”alignnone sizee-large wp-image-419″ srcset_temp=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/1.png?resize=450%2C340 450w, https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/1.png?resize=397%2C300 397w, https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/1.png?resize=768%2C580 768w, https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/1.png?w=1191 1191w” sizes=”(max-width: 450px) 100vw, 450px” data-recalc-dims=”1″ /></noscript>.
Teraz użyjemy pętli “dla” i sprawdzimy różne wartości mtry.
1
2
3
4
5
6
7
8
9
10
11
12
# Using For loop to identify the right mtry for model
a=c()
i=5
dla (i w 3:8) {\i1}
model3 <- randomForest(Condition ~ ., data = TrainSet, ntree = 500, mtry = i, importance = TRUE)
predValid <- predict(model3, ValidSet, typ = “klasa”)
a[i-2] = średnia (predValid == Warunek ValidSet$Condition)
}
a
działka(3:8,a)
1
2
3
4
5
> a
[1] 0.9749518 0.9884393 0.9845857 0.9884393 0.9884393 0.9903661
>
> działka(3:8,a)
<img data-attachment-id=”420″ data-permalink=”http://r-posts.com/how-to-implement-random-forests-in-r/2-3/” data-orig-file=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/2.png?fit=1191%2C900″ data-orig-size=”1191,900″ data-comments-opened=”1″ data-image-title=”2″ data-image-description=”” data-medium-file=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/2.png?fit=397%2C300″ data-large-file=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/2.png?fit=450%2C340″ src=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/2.png? resize=450%2C340″ alt=”Perceptive Analytics” width=”450″ height=”340″ class=”alignnone sizee-large wp-image-420 jetpack-lazy-image” data-recalc-dims=”1″ data-lazy-sizes=”(max-width: 450px) 100vw, 450px” data-lazy-src=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/2.png? resize=450%2C340&is-pending-load=1″ srcset=”data:image/gif;base64,R0lGODlhAQABAIAAAAAAP///yH5BAEAAAAAAAAAAAAAIBRAA7″><noscript><img data-attachment-id=”420″ data-permalink=”http://r-posts.com/how-to-implement-random-forests-in-r/2-3/” data-orig-file=”https://i2.wp.com/r-posts. com/wp-content/uploads/2018/01/2.png? fit=1191%2C900″ data-orig-size=”1191,900″ data-comments-opened=”1″ data-image-meta=”{“aperture”: “0”, “credit”:”, “camera”:”, “caption”:”, “created_timestamp”: “0”, “copyright”: “”, “focal_length”: “0”, “iso”: “0”, “shutter_speed”: “0”, “title”:”, “orientation”: “0”}” data-image-title=”2″ data-image-description=””” data-medium-file=”https://i2. wp.com/r-posts.com/wp-content/uploads/2018/01/2.png?fit=397%2C300″ data-large-file=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/2.png?fit=450%2C340″ src=”https://i2.wp.com/r-posts. com/wp-content/uploads/2018/01/2.png?resize=450%2C340″ alt=”Perceptive Analytics” width=”450″ height=”340″ class=”alignnone sizee-large wp-image-420″ srcset_temp=”https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/2.png?resize=450%2C340 450w, https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/2.png?resize=397%2C300 397w, https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/2.png?resize=768%2C580 768w, https://i2.wp.com/r-posts.com/wp-content/uploads/2018/01/2.png?w=1191 1191w” sizes=”(max-width: 450px) 100vw, 450px” data-recalc-dims=”1″ /></noscript>.
Z powyższego wykresu widać, że dokładność zmniejszyła się, gdy wzrosła z 4 do 5, a następnie wzrosła z 5 do 6. Maksymalna dokładność jest na poziomie 8.
Teraz, widzieliśmy implementację Random Forest i zrozumieliśmy wagę modelu. Porównajmy ten model z drzewem decyzyjnym i zobaczmy, jak wypadają drzewa decyzyjne w porównaniu z lasem losowym.
1
2
3
4
5
6
7
8
9
# Porównaj z Drzewem Decyzji
install.packages(“rpart”)
install.packages(“caret”)
install.packages(“e1071”)
biblioteka(rpart)
biblioteka(caret)
biblioteka(e1071)
1
2
3
4
5
6
7
# Porównamy model 1 z Random Forest z modelem Decision Tree
model_dt = pociąg (stan ~ ., data = TrainSet, metoda = “rpart”)
model_dt_1 = przewidywanie(model_dt, dane = TrainSet)
tabela(model_dt_1, TrainSet$Condition)
mean(model_dt_1 == TrainSet$Condition)
1
2
3
4
5
6
7
8
9
10
> table(model_dt_1, TrainSet$Condition)
model_dt_1 acc good unacc vgood
acc 241 52 132 37
dobry 0 0 0 0 0
uncc 23 0 724 0
Dobry towar 0 0 0 0 0
>
> mean(model_dt_1 == TrainSet$Condition)
[1] 0.7981803
Na zestawie danych szkoleniowych dokładność wynosi około 79,8% i jest wiele błędnych klasyfikacji. Teraz, spójrz na zestaw danych walidacyjnych.
1
2
3
4
5
# Running on Validation Set
model_dt_vs = predict(model_dt, newdata = ValidSet)
table(model_dt_vs, ValidSet$Condition)
mean(model_dt_vs == Warunek ValidSet$Condition)
1
2
3
4
5
6
7
8
9
10
> table(model_dt_vs, ValidSet$Condition)
model_dt_vs acc good unacc vgood
acc 107 17 58 28
dobry 0 0 0 0 0
niecc 13 0 296 0
Dobry towar 0 0 0 0 0
>
> mean(model_dt_vs == Warunek ValidSet$Condition)
[1] 0.7764933
Dokładność zbioru danych dotyczących walidacji uległa dalszemu obniżeniu do 77,6%.