Articles

Algorytm Random Forest z Pythonem i Scikit-Learn

Random forest jest rodzajem algorytmu uczenia maszynowego opartego na uczeniu zespołowym. Uczenie zespołowe jest typem uczenia, w którym łączy się różne typy algorytmów lub ten sam algorytm wiele razy, aby utworzyć bardziej wydajny model predykcyjny. Algorytm random forest łączy wiele algorytmów tego samego typu, np. wiele drzew decyzyjnych, w wyniku czego powstaje las drzew, stąd nazwa „Random Forest”. Algorytm lasu losowego może być używany zarówno do zadań regresji, jak i klasyfikacji.

Jak działa algorytm lasu losowego

Następujące kroki to podstawowe kroki związane z wykonywaniem algorytmu lasu losowego:

  1. Wybierz N losowych rekordów z zestawu danych.
  2. Zbuduj drzewo decyzyjne w oparciu o te N rekordów.
  3. Wybierz liczbę drzew, które chcesz w swoim algorytmie i powtórz kroki 1 i 2.
  4. W przypadku problemu regresji, dla nowego rekordu, każde drzewo w lesie przewiduje wartość dla Y (wyjście). Wartość końcowa może być obliczona poprzez przyjęcie średniej wszystkich wartości przewidywanych przez wszystkie drzewa w lesie. Lub, w przypadku problemu klasyfikacji, każde drzewo w lesie przewiduje kategorię, do której należy nowy rekord. Ostatecznie, nowy rekord jest przypisywany do kategorii, która wygrywa większością głosów.

Wady używania Random Forest

Jak z każdym algorytmem, istnieją zalety i wady jego używania. W następnych dwóch sekcjach przyjrzymy się zaletom i wadom używania losowego lasu do klasyfikacji i regresji.

  1. Algorytm losowego lasu nie jest stronniczy, ponieważ istnieje wiele drzew, a każde drzewo jest trenowane na podzbiorze danych. Zasadniczo algorytm lasu losowego opiera się na sile „tłumu”; dlatego ogólna stronniczość algorytmu jest zredukowana.
  2. Algorytm ten jest bardzo stabilny. Nawet jeśli nowy punkt danych zostanie wprowadzony do zbioru danych, nie ma to większego wpływu na ogólny algorytm, ponieważ nowe dane mogą wpłynąć na jedno drzewo, ale bardzo trudno jest wpłynąć na wszystkie drzewa.
  3. Algorytm random forest działa dobrze, gdy masz zarówno cechy kategoryczne, jak i liczbowe.
  4. Algorytm lasu losowego działa również dobrze, gdy dane mają brakujące wartości lub nie zostały dobrze przeskalowane (chociaż przeprowadziliśmy skalowanie cech w tym artykule tylko dla celów demonstracyjnych).

Wady korzystania z lasu losowego

  1. Poważną wadą lasów losowych jest ich złożoność. Wymagają one znacznie więcej zasobów obliczeniowych, ze względu na dużą liczbę drzew decyzyjnych połączonych razem.
  2. Dzięki swojej złożoności, wymagają znacznie więcej czasu na trening niż inne porównywalne algorytmy.

Przez resztę tego artykułu zobaczymy jak biblioteka Scikit-Learn Pythona może być użyta do implementacji algorytmu random forest do rozwiązywania problemów regresji, jak również klasyfikacji.

Część 1: Using Random Forest for Regression

W tej części przestudiujemy, jak można wykorzystać lasy losowe do rozwiązywania problemów regresji za pomocą Scikit-Learn. W następnej części rozwiążemy problem klasyfikacji za pomocą lasów losowych.

Zdefiniowanie problemu

Problem polega na przewidywaniu zużycia gazu (w milionach galonów) w 48 stanach USA na podstawie podatku od benzyny (w centach), dochodu na mieszkańca (w dolarach), utwardzonych autostrad (w milach) i odsetka ludności z prawem jazdy.

Rozwiązanie

Do rozwiązania tego problemu regresji wykorzystamy algorytm random forest za pomocą biblioteki Scikit-Learn Pythona. Aby rozwiązać ten problem, będziemy postępować zgodnie z tradycyjnym tokiem uczenia maszynowego. Wykonaj następujące kroki:

1. Importowanie bibliotek

Wykonaj poniższy kod, aby zaimportować niezbędne biblioteki:

import pandas as pdimport numpy as np
2. Importowanie zbioru danych

Zbiór danych dla tego problemu jest dostępny pod adresem:

https://drive.google.com/file/d/1mVmGNx6cbfvRHC_DvF12ZL3wGLSHD9f_/view

Na potrzeby tego tutoriala, zbiór danych został pobrany do folderu „Datasets” na dysku „D”. Będziesz musiał zmienić ścieżkę dostępu do pliku zgodnie z własnymi ustawieniami.

Wykonaj następujące polecenie, aby zaimportować zbiór danych:

dataset = pd.read_csv('D:\Datasets\petrol_consumption.csv')

Aby uzyskać widok wysokiego poziomu, jak wygląda zbiór danych, wykonaj następujące polecenie:

dataset.head()

.

Petrol_tax Średni_dochód Drogi utwardzone Ludność_licencji_kierowcy(%) Zużycie benzyny
0 9.0 3571 1976 0.525 541
1 9.0 4092 1250 0.572 524
2 9.0 3865 1586 0.580 561
3 7.5 4870 2351 0.529 414
4 8.0 4399 431 0.544 410

Widzimy, że wartości w naszym zbiorze danych nie są zbyt dobrze skalowane. Przeskalujemy je w dół przed treningiem algorytmu.

3. Przygotowanie danych do treningu

W tej części zostaną wykonane dwa zadania. Pierwszym zadaniem jest podzielenie danych na zbiory 'atrybutów' i 'etykiet'. Następnie dane wynikowe są dzielone na zbiory treningowe i testowe.

Następujący skrypt dzieli dane na atrybuty i etykiety:

X = dataset.iloc.valuesy = dataset.iloc.values

Na koniec podzielmy dane na zbiory treningowe i testowe:

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

4. Skalowanie cech

Wiemy, że nasz zbiór danych nie jest jeszcze skalowany wartościowo, na przykład pole Average_Income ma wartości z zakresu tysięcy, podczas gdy Petrol_tax ma wartości z zakresu dziesiątek. Dlatego korzystnie byłoby przeskalować nasze dane (choć, jak wspomnieliśmy wcześniej, ten krok nie jest aż tak istotny dla algorytmu lasów losowych). W tym celu wykorzystamy klasę Scikit-Learn StandardScaler. W tym celu wykonaj następujący kod:

# Feature Scalingfrom sklearn.preprocessing import StandardScalersc = StandardScaler()X_train = sc.fit_transform(X_train)X_test = sc.transform(X_test)
5. Trening algorytmu

Teraz, gdy już przeskalowaliśmy nasz zbiór danych, nadszedł czas, aby wytrenować nasz algorytm random forest do rozwiązania tego problemu regresji. Wykonaj następujący kod:

from sklearn.ensemble import RandomForestRegressorregressor = RandomForestRegressor(n_estimators=20, random_state=0)regressor.fit(X_train, y_train)y_pred = regressor.predict(X_test)

Klasa RandomForestRegressor z biblioteki sklearn.ensemble służy do rozwiązywania problemów regresji za pomocą random forest. Najważniejszym parametrem klasy RandomForestRegressor jest parametr n_estimators. Parametr ten definiuje liczbę drzew w lesie losowym. Zaczniemy od n_estimator=20 aby zobaczyć jak sprawuje się nasz algorytm. Szczegóły dotyczące wszystkich parametrów RandomForestRegressor można znaleźć tutaj.

6. Ocena algorytmu

Ostatnim i ostatnim krokiem rozwiązywania problemu uczenia maszynowego jest ocena wydajności algorytmu. W przypadku problemów z regresją, metryki używane do oceny algorytmu to średni błąd bezwzględny, średni błąd kwadratowy i pierwiastek średniego błędu kwadratowego. Wykonaj poniższy kod, aby znaleźć te wartości:

from sklearn import metricsprint('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

Wyjście będzie wyglądało mniej więcej tak:

Mean Absolute Error: 51.765Mean Squared Error: 4216.16675Root Mean Squared Error: 64.932016371

Przy 20 drzewach błąd średniokwadratowy wynosi 64,93, co jest większe niż 10 procent średniego zużycia benzyny, czyli 576,77. Może to świadczyć między innymi o tym, że nie użyliśmy wystarczającej liczby estymatorów (drzew).

Jeśli liczbę estymatorów zmienimy na 200, to wyniki będą następujące:

Mean Absolute Error: 47.9825Mean Squared Error: 3469.7007375Root Mean Squared Error: 58.9041657058

Następujący wykres przedstawia spadek wartości błędu średniokwadratowego (RMSE) w zależności od liczby estymatorów. Tutaj oś X zawiera liczbę estymatorów, natomiast oś Y zawiera wartość błędu średniokwadratowego.

RMSE vs liczba estymatorów

Można zauważyć, że wartości błędu maleją wraz ze wzrostem liczby estymatorów. Po 200 tempo spadku błędu maleje, więc dlatego 200 jest dobrą liczbą dla n_estimators. Możesz pobawić się z liczbą drzew i innymi parametrami, aby sprawdzić, czy możesz uzyskać lepsze wyniki na własną rękę.

Część 2: Użycie Random Forest do klasyfikacji

Problem Definicja

Zadaniem tutaj jest przewidzenie, czy banknot jest autentyczny, czy nie, w oparciu o cztery atrybuty i.tj. wariancji obrazu przekształconego falowo, skośności, entropii i kurtozie obrazu.

Rozwiązanie

Jest to problem klasyfikacji binarnej i użyjemy klasyfikatora lasu losowego do rozwiązania tego problemu. Kroki wykonywane w celu rozwiązania tego problemu będą podobne do kroków wykonywanych dla regresji.

1. Importowanie bibliotek
import pandas as pdimport numpy as np
2. Import Datasetu

Zbiór danych można pobrać z poniższego linku:

https://drive.google.com/file/d/13nw-uRXPY8XIZQxKRNZ3yYlho-CYm_Qt/view

Szczegółowe informacje o danych dostępne są pod poniższym linkiem:

https://archive.ics.uci.edu/ml/datasets/banknote+authentication

Następujący kod importuje zbiór danych:

dataset = pd.read_csv("D:/Datasets/bill_authentication.csv")

Aby uzyskać wysokopoziomowy widok zbioru danych, wykonaj następujące polecenie:

dataset.head()

.

Wariancja Kośność Kurtoza Entropia Klasa
0 3.62160 8.6661 -2.8073 -0.44699 0
1 4.54590 8.1674 -2.4586 -1.46210 0
2 3.86600 -2.6383 1.9242 0.10645 0
3 3.45660 9.5228 -4.0112 -3.59440 0
4 0.32924 -4.4552 4.5718 -0.98880 0

Tak jak w przypadku zbioru danych regresji, wartości w tym zbiorze danych nie są zbyt dobrze skalowane. Zbiór danych zostanie przeskalowany przed treningiem algorytmu.

3. Przygotowanie danych do treningu

Następujący kod dzieli dane na atrybuty i etykiety:

X = dataset.iloc.valuesy = dataset.iloc.values

Następujący kod dzieli dane na zbiory treningowe i testowe:

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
4. Skalowanie cech

Tak jak poprzednio, skalowanie cech działa w ten sam sposób:

# Feature Scalingfrom sklearn.preprocessing import StandardScalersc = StandardScaler()X_train = sc.fit_transform(X_train)X_test = sc.transform(X_test)
5. Trening algorytmu

I znowu, teraz, gdy mamy skalowany zbiór danych, możemy trenować nasze lasy losowe, aby rozwiązać ten problem klasyfikacji. W tym celu wykonaj następujący kod:

from sklearn.ensemble import RandomForestRegressorregressor = RandomForestRegressor(n_estimators=20, random_state=0)regressor.fit(X_train, y_train)y_pred = regressor.predict(X_test)

W przypadku regresji użyliśmy klasy RandomForestRegressor z biblioteki sklearn.ensemble. Do klasyfikacji wykorzystamy RandomForestClassifier klasę z biblioteki sklearn.ensemble. Klasa RandomForestClassifier również przyjmuje jako parametr n_estimators. Podobnie jak poprzednio, parametr ten określa liczbę drzew w naszym lesie losowym. Ponownie zaczniemy od 20 drzew. Szczegóły dotyczące wszystkich parametrów RandomForestClassifier znajdziesz tutaj.

6. Ocena algorytmu

W przypadku problemów z klasyfikacją, metryki używane do oceny algorytmu to dokładność, macierz konfuzji, precyzja, przywołanie i wartości F1. Wykonaj poniższy skrypt, aby znaleźć te wartości:

from sklearn.metrics import classification_report, confusion_matrix, accuracy_scoreprint(confusion_matrix(y_test,y_pred))print(classification_report(y_test,y_pred))print(accuracy_score(y_test, y_pred))

Wyjście będzie wyglądać następująco:

 1 117]] precision recall f1-score support 0 0.99 0.99 0.99 157 1 0.98 0.99 0.99 118 avg / total 0.99 0.99 0.99 2750.989090909091

Dokładność uzyskana przez nasz klasyfikator random forest z 20 drzewami wynosi 98,90%. Inaczej niż poprzednio, zmiana liczby estymatorów dla tego problemu nie poprawiła znacząco wyników, co widać na poniższym wykresie. Tutaj oś X zawiera liczbę estymatorów, podczas gdy oś Y pokazuje dokładność.

Dokładność vs liczba estymatorów

98,90% to całkiem dobra dokładność, więc nie ma większego sensu zwiększać liczby estymatorów. Widzimy, że zwiększenie liczby estymatorów nie poprawiło dokładności.

Aby poprawić dokładność, sugerowałbym pobawić się innymi parametrami klasy RandomForestClassifier i zobaczyć, czy można poprawić nasze wyniki.

Źródła

Chcesz dowiedzieć się więcej o Scikit-Learn i innych użytecznych algorytmach uczenia maszynowego, takich jak lasy losowe? Możesz sprawdzić niektóre bardziej szczegółowe zasoby, takie jak kurs online:

  • Data Science in Python, Pandas, Scikit-learn, Numpy, Matplotlib
  • Python for Data Science and Machine Learning Bootcamp
  • Machine Learning A-Z: Hands-On Python & R W Data Science

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *