Scikit Learn - Randomizowane drzewa decyzyjne
Ten rozdział pomoże ci zrozumieć losowe drzewa decyzyjne w Sklearn.
Randomizowane algorytmy drzew decyzyjnych
Ponieważ wiemy, że DT jest zwykle trenowany przez rekurencyjne dzielenie danych, ale jest podatny na nadmierne dopasowanie, został przekształcony w losowe lasy poprzez szkolenie wielu drzew w różnych podpróbkach danych. Pliksklearn.ensemble moduł posiada dwa algorytmy oparte o losowe drzewa decyzyjne -
Algorytm Random Forest
Dla każdego rozważanego elementu oblicza optymalną lokalnie kombinację cecha / podział. W Random forest każde drzewo decyzyjne w zespole jest budowane z próby pobranej z zamiennikiem ze zbioru uczącego, a następnie otrzymuje prognozę z każdego z nich i ostatecznie wybiera najlepsze rozwiązanie w drodze głosowania. Może być używany zarówno do zadań klasyfikacyjnych, jak i regresyjnych.
Klasyfikacja z losowym lasem
Aby utworzyć losowy klasyfikator lasu, moduł Scikit-learning zapewnia sklearn.ensemble.RandomForestClassifier. Podczas tworzenia losowego klasyfikatora lasu głównymi parametrami używanymi przez ten moduł są‘max_features’ i ‘n_estimators’.
Tutaj, ‘max_features’to rozmiar losowych podzbiorów cech, które należy wziąć pod uwagę podczas podziału węzła. Jeśli wybierzemy wartość tego parametru na none, wówczas uwzględni wszystkie cechy, a nie losowy podzbiór. Z drugiej strony,n_estimatorsto liczba drzew w lesie. Im większa liczba drzew, tym lepszy wynik. Ale obliczenie również zajmie więcej czasu.
Przykład realizacji
W poniższym przykładzie tworzymy losowy klasyfikator lasu przy użyciu sklearn.ensemble.RandomForestClassifier a także sprawdzanie jego dokładności również za pomocą cross_val_score moduł.
from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs
from sklearn.ensemble import RandomForestClassifier
X, y = make_blobs(n_samples = 10000, n_features = 10, centers = 100,random_state = 0) RFclf = RandomForestClassifier(n_estimators = 10,max_depth = None,min_samples_split = 2, random_state = 0)
scores = cross_val_score(RFclf, X, y, cv = 5)
scores.mean()
Wynik
0.9997
Przykład
Możemy również użyć zestawu danych sklearn do zbudowania klasyfikatora Random Forest. Jak w poniższym przykładzie używamy zestawu danych tęczówki. Znajdziemy również jego wynik dokładności i macierz pomyłki.
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
path = "https://archive.ics.uci.edu/ml/machine-learning-database
s/iris/iris.data"
headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
dataset = pd.read_csv(path, names = headernames)
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)
RFclf = RandomForestClassifier(n_estimators = 50)
RFclf.fit(X_train, y_train)
y_pred = RFclf.predict(X_test)
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)
Wynik
Confusion Matrix:
[[14 0 0]
[ 0 18 1]
[ 0 0 12]]
Classification Report:
precision recall f1-score support
Iris-setosa 1.00 1.00 1.00 14
Iris-versicolor 1.00 0.95 0.97 19
Iris-virginica 0.92 1.00 0.96 12
micro avg 0.98 0.98 0.98 45
macro avg 0.97 0.98 0.98 45
weighted avg 0.98 0.98 0.98 45
Accuracy: 0.9777777777777777
Regresja z losowym lasem
Moduł Scikit-learning umożliwia tworzenie losowej regresji lasu sklearn.ensemble.RandomForestRegressor. Podczas tworzenia losowego regresora leśnego użyje tych samych parametrów, które są używane przezsklearn.ensemble.RandomForestClassifier.
Przykład realizacji
W poniższym przykładzie tworzymy losowy regresor lasu przy użyciu sklearn.ensemble.RandomForestregressor a także przewidywanie nowych wartości za pomocą metody predykcji ().
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 10, n_informative = 2,random_state = 0, shuffle = False)
RFregr = RandomForestRegressor(max_depth = 10,random_state = 0,n_estimators = 100)
RFregr.fit(X, y)
Wynik
RandomForestRegressor(
bootstrap = True, criterion = 'mse', max_depth = 10,
max_features = 'auto', max_leaf_nodes = None,
min_impurity_decrease = 0.0, min_impurity_split = None,
min_samples_leaf = 1, min_samples_split = 2,
min_weight_fraction_leaf = 0.0, n_estimators = 100, n_jobs = None,
oob_score = False, random_state = 0, verbose = 0, warm_start = False
)
Po dopasowaniu możemy przewidzieć na podstawie modelu regresji w następujący sposób -
print(RFregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))
Wynik
[98.47729198]
Metody dodatkowego drzewa
Dla każdej rozpatrywanej funkcji wybiera losową wartość podziału. Zaletą korzystania z dodatkowych metod drzewiastych jest to, że pozwala to nieco bardziej zredukować wariancję modelu. Wadą stosowania tych metod jest to, że nieznacznie zwiększa to odchylenie.
Klasyfikacja metodą Extra-Tree
Do tworzenia klasyfikatora przy użyciu metody Extra-tree zapewnia moduł Scikit-learn sklearn.ensemble.ExtraTreesClassifier. Używa tych samych parametrów, które są używane przezsklearn.ensemble.RandomForestClassifier. Jedyna różnica polega na tym, że omawiany powyżej sposób buduje drzewa.
Przykład realizacji
W poniższym przykładzie tworzymy losowy klasyfikator lasu przy użyciu sklearn.ensemble.ExtraTreeClassifier a także sprawdzanie jego dokładności za pomocą cross_val_score moduł.
from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs
from sklearn.ensemble import ExtraTreesClassifier
X, y = make_blobs(n_samples = 10000, n_features = 10, centers=100,random_state = 0)
ETclf = ExtraTreesClassifier(n_estimators = 10,max_depth = None,min_samples_split = 10, random_state = 0)
scores = cross_val_score(ETclf, X, y, cv = 5)
scores.mean()
Wynik
1.0
Przykład
Możemy również użyć zestawu danych sklearn do zbudowania klasyfikatora przy użyciu metody Extra-Tree. Jak w poniższym przykładzie używamy zestawu danych Pima-Indian.
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import ExtraTreesClassifier
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = KFold(n_splits=10, random_state=seed)
num_trees = 150
max_features = 5
ETclf = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)
results = cross_val_score(ETclf, X, Y, cv=kfold)
print(results.mean())
Wynik
0.7551435406698566
Regresja metodą dodatkowego drzewa
Do tworzenia Extra-Tree regresji, zapewnia moduł Scikit-learning sklearn.ensemble.ExtraTreesRegressor. Podczas tworzenia losowego regresora leśnego użyje tych samych parametrów, które są używane przezsklearn.ensemble.ExtraTreesClassifier.
Przykład realizacji
W poniższym przykładzie stosujemy sklearn.ensemble.ExtraTreesregressori na tych samych danych, które wykorzystaliśmy podczas tworzenia losowego regresora lasu. Zobaczmy różnicę w danych wyjściowych
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 10, n_informative = 2,random_state = 0, shuffle = False)
ETregr = ExtraTreesRegressor(max_depth = 10,random_state = 0,n_estimators = 100)
ETregr.fit(X, y)
Wynik
ExtraTreesRegressor(bootstrap = False, criterion = 'mse', max_depth = 10,
max_features = 'auto', max_leaf_nodes = None,
min_impurity_decrease = 0.0, min_impurity_split = None,
min_samples_leaf = 1, min_samples_split = 2,
min_weight_fraction_leaf = 0.0, n_estimators = 100, n_jobs = None,
oob_score = False, random_state = 0, verbose = 0, warm_start = False)
Przykład
Po dopasowaniu możemy przewidzieć na podstawie modelu regresji w następujący sposób -
print(ETregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))
Wynik
[85.50955817]