Scikit Learn: árboles de decisión aleatorios

Este capítulo le ayudará a comprender los árboles de decisión aleatorios en Sklearn.

Algoritmos de árbol de decisión aleatorio

Como sabemos, un DT generalmente se entrena dividiendo recursivamente los datos, pero al ser propensos a sobreajustarse, se han transformado en bosques aleatorios al entrenar muchos árboles en varias submuestras de datos. lossklearn.ensemble módulo tiene los siguientes dos algoritmos basados ​​en árboles de decisión aleatorios:

El algoritmo de Random Forest

Para cada característica en consideración, calcula la combinación de característica / división localmente óptima. En el bosque aleatorio, cada árbol de decisión del conjunto se construye a partir de una muestra extraída con reemplazo del conjunto de entrenamiento y luego obtiene la predicción de cada uno de ellos y finalmente selecciona la mejor solución mediante votación. Se puede utilizar tanto para tareas de clasificación como de regresión.

Clasificación con bosque aleatorio

Para crear un clasificador de bosque aleatorio, el módulo Scikit-learn proporciona sklearn.ensemble.RandomForestClassifier. Al crear un clasificador de bosque aleatorio, los principales parámetros que utiliza este módulo son‘max_features’ y ‘n_estimators’.

Aquí, ‘max_features’es el tamaño de los subconjuntos aleatorios de características que se deben considerar al dividir un nodo. Si elegimos el valor de este parámetro a ninguno, entonces considerará todas las características en lugar de un subconjunto aleatorio. Por otra parte,n_estimatorsson el número de árboles en el bosque. Cuanto mayor sea el número de árboles, mejor será el resultado. Pero también llevará más tiempo calcular.

Ejemplo de implementación

En el siguiente ejemplo, estamos construyendo un clasificador de bosque aleatorio usando sklearn.ensemble.RandomForestClassifier y también comprobar su precisión también mediante el uso cross_val_score módulo.

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()

Salida

0.9997

Ejemplo

También podemos usar el conjunto de datos sklearn para construir un clasificador de bosque aleatorio. Como en el siguiente ejemplo, estamos usando un conjunto de datos de iris. También encontraremos su puntuación de precisión y matriz de confusión.

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)

Salida

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

Regresión con bosque aleatorio

Para crear una regresión de bosque aleatoria, el módulo Scikit-learn proporciona sklearn.ensemble.RandomForestRegressor. Al crear un regresor forestal aleatorio, utilizará los mismos parámetros que utilizasklearn.ensemble.RandomForestClassifier.

Ejemplo de implementación

En el siguiente ejemplo, estamos construyendo un regresor de bosque aleatorio usando sklearn.ensemble.RandomForestregressor y también predecir nuevos valores mediante el método predict ().

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)

Salida

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
)

Una vez ajustado, podemos predecir a partir del modelo de regresión de la siguiente manera:

print(RFregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))

Salida

[98.47729198]

Métodos extra-árboles

Para cada característica en consideración, selecciona un valor aleatorio para la división. El beneficio de utilizar métodos de árbol adicionales es que permite reducir un poco más la varianza del modelo. La desventaja de utilizar estos métodos es que aumenta ligeramente el sesgo.

Clasificación con método de árbol extra

Para crear un clasificador usando el método Extra-tree, el módulo Scikit-learn proporciona sklearn.ensemble.ExtraTreesClassifier. Utiliza los mismos parámetros que utilizasklearn.ensemble.RandomForestClassifier. La única diferencia está en la forma, discutida anteriormente, en que construyen árboles.

Ejemplo de implementación

En el siguiente ejemplo, estamos construyendo un clasificador de bosque aleatorio usando sklearn.ensemble.ExtraTreeClassifier y también comprobar su precisión mediante el uso cross_val_score módulo.

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()

Salida

1.0

Ejemplo

También podemos usar el conjunto de datos sklearn para construir un clasificador usando el método Extra-Tree. Como en el siguiente ejemplo, estamos usando un conjunto de datos 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())

Salida

0.7551435406698566

Regresión con el método de árbol extra

Para crear un Extra-Tree regresión, el módulo Scikit-learn proporciona sklearn.ensemble.ExtraTreesRegressor. Al crear un regresor forestal aleatorio, utilizará los mismos parámetros que utilizasklearn.ensemble.ExtraTreesClassifier.

Ejemplo de implementación

En el siguiente ejemplo, estamos aplicando sklearn.ensemble.ExtraTreesregressory en los mismos datos que usamos al crear un regresor forestal aleatorio. Veamos la diferencia en la salida.

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)

Salida

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)

Ejemplo

Una vez ajustado, podemos predecir a partir del modelo de regresión de la siguiente manera:

print(ETregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))

Salida

[85.50955817]