Scikit Learn - рандомизированные деревья решений
Эта глава поможет вам понять рандомизированные деревья решений в Sklearn.
Алгоритмы рандомизированного дерева решений
Поскольку мы знаем, что DT обычно обучается путем рекурсивного разделения данных, но, будучи склонным к переобучению, они были преобразованы в случайные леса путем обучения многих деревьев на различных подвыборках данных. Вsklearn.ensemble модуль имеет следующие два алгоритма, основанные на рандомизированных деревьях решений -
Алгоритм случайного леса
Для каждого рассматриваемого объекта вычисляется локально оптимальная комбинация признака / разделения. В случайном лесу каждое дерево решений в ансамбле строится из выборки, взятой с заменой из обучающего набора, затем получает прогноз от каждого из них и, наконец, выбирает лучшее решение посредством голосования. Его можно использовать как для задач классификации, так и для регрессии.
Классификация со случайным лесом
Для создания классификатора случайного леса модуль Scikit-learn предоставляет sklearn.ensemble.RandomForestClassifier. При построении классификатора случайного леса основными параметрами этого модуля являются:‘max_features’ и ‘n_estimators’.
Вот, ‘max_features’- это размер случайных подмножеств функций, которые следует учитывать при разделении узла. Если мы выберем для этого параметра значение «Нет», тогда будут учитываться все функции, а не случайное подмножество. С другой стороны,n_estimatorsколичество деревьев в лесу. Чем больше будет деревьев, тем лучше будет результат. Но это также займет больше времени.
Пример реализации
В следующем примере мы создаем классификатор случайного леса, используя sklearn.ensemble.RandomForestClassifier а также проверка его точности с помощью cross_val_score модуль.
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()
Вывод
0.9997
пример
Мы также можем использовать набор данных sklearn для создания классификатора случайного леса. Как и в следующем примере, мы используем набор данных радужной оболочки глаза. Мы также найдем его оценку точности и матрицу неточностей.
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)
Вывод
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
Регрессия со случайным лесом
Для создания случайной регрессии леса модуль Scikit-learn предоставляет sklearn.ensemble.RandomForestRegressor. При построении случайного регрессора леса он будет использовать те же параметры, что иsklearn.ensemble.RandomForestClassifier.
Пример реализации
В следующем примере мы создаем случайный регрессор леса, используя sklearn.ensemble.RandomForestregressor а также прогнозирование новых значений с помощью метода predic ().
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)
Вывод
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
)
После установки мы можем предсказать из регрессионной модели следующим образом:
print(RFregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))
Вывод
[98.47729198]
Методы Extra-Tree
Для каждой рассматриваемой функции он выбирает случайное значение для разделения. Преимущество использования дополнительных методов дерева состоит в том, что это позволяет немного уменьшить дисперсию модели. Недостаток использования этих методов в том, что это немного увеличивает смещение.
Классификация методом экстра-дерева
Для создания классификатора с использованием метода Extra-tree модуль Scikit-learn предоставляет sklearn.ensemble.ExtraTreesClassifier. Он использует те же параметры, что иsklearn.ensemble.RandomForestClassifier. Единственная разница в способе, о котором говорилось выше, они строят деревья.
Пример реализации
В следующем примере мы создаем классификатор случайного леса, используя sklearn.ensemble.ExtraTreeClassifier а также проверка его точности с помощью cross_val_score модуль.
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()
Вывод
1.0
пример
Мы также можем использовать набор данных sklearn для создания классификатора с использованием метода Extra-Tree. Как и в следующем примере, мы используем набор данных 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())
Вывод
0.7551435406698566
Регрессия с использованием метода экстра-дерева
Для создания Extra-Tree регрессии, модуль Scikit-learn предоставляет sklearn.ensemble.ExtraTreesRegressor. При построении случайного регрессора леса он будет использовать те же параметры, что иsklearn.ensemble.ExtraTreesClassifier.
Пример реализации
В следующем примере мы применяем sklearn.ensemble.ExtraTreesregressorи на тех же данных, которые мы использовали при создании случайного регрессора леса. Давайте посмотрим на разницу в выводе
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)
Вывод
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)
пример
После установки мы можем предсказать из регрессионной модели следующим образом:
print(ETregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))
Вывод
[85.50955817]