Aprendizaje automático (18): embolsado y bosque aleatorio

El texto completo tiene un total de más de 10,000 palabras y el tiempo de lectura esperado es de aproximadamente 30 a 40 minutos | Lleno de productos secos (con datos y códigos), ¡se recomienda recopilar!

El objetivo de este artículo: comprender qué es el aprendizaje conjunto, aclarar el proceso del algoritmo Bagging, familiarizarse con el principio del algoritmo de bosque aleatorio y la definición y uso de cada parámetro en Sklearn.

imagen-20230809101612439

Descarga de código y conjunto de datos haga clic aquí

I. Introducción

Entre los muchos algoritmos de aprendizaje automático, el bosque aleatorio es sin duda uno de los métodos más populares y aplicados con frecuencia. En las competiciones de aprendizaje automático, el bosque aleatorio es a menudo el primer algoritmo que se prueba en datos pequeños y medianos . El proceso de construcción del algoritmo de bosque aleatorio es muy simple. Se puede decir que si domina los diversos atributos y parámetros del árbol de decisión, La mayor parte del contenido de Random Forest es bastante fácil de entender . Si no está familiarizado con él, se recomienda leer estos dos artículos primero:

Aprendizaje automático (16): árbol de decisiones

Aprendizaje automático (17): Operación práctica_El proceso básico de implementación del árbol CART en Sklearn

Pero antes de comprender en profundidad el bosque aleatorio, primero debe comprender los conceptos relacionados del aprendizaje integrado.La razón es que el bosque aleatorio no es un algoritmo que existe de forma aislada, sino un representante típico de los métodos de aprendizaje integrado. Para comprender verdaderamente cómo funcionan los bosques aleatorios, sus fortalezas y limitaciones, primero se debe comprender el marco de aprendizaje conjunto detrás de ellos . Así como la estabilidad de un edificio proviene no sólo de su piedra angular, sino de la combinación razonable de la estructura general, el poder del bosque aleatorio también reside en el hecho de que combina el poder de múltiples árboles de decisión para formar un sistema más poderoso y robusto. modelo de predicción.

2. ¿Qué es el aprendizaje integrado?

2.1 Conceptos básicos

El llamado aprendizaje integrado, que es esencialmente una estrategia en el aprendizaje automático , toma decisiones o predicciones combinando múltiples algoritmos o modelos de aprendizaje. Es uno de los campos más avanzados, efectivos y dignos de investigación en el aprendizaje automático. El método entrena múltiples estimadores débiles (estimadores base) y combina sus resultados de alguna manera para resolver un problema. Entonces, la idea básica es combinar varios alumnos débiles para formar un alumno fuerte y, finalmente, combinar los resultados de varios modelos para obtener un mejor rendimiento de generalización que un solo modelo .

Desde la perspectiva de la escena industrial actual, la aplicación del aprendizaje conjunto también es muy extensa: en competencias de datos como Kaggle y Tianchi, siempre puede proporcionar puntajes de competencia altos como algoritmo reina. En muchos campos, como búsqueda, recomendación y publicidad, se puede utilizar como estándar de la industria y modelo de referencia, y actualmente es el único algoritmo que puede competir con los algoritmos de aprendizaje profundo, por lo que es muy necesario dominar sus principios y usos.

Si comprende el algoritmo de aprendizaje conjunto de manera popular: imagine que va a tomar una decisión importante, como comprar un automóvil nuevo. Puede pedirles la opinión de varios amigos o familiares, ya que cada uno puede ofrecerle consejos desde una perspectiva diferente. Algunas personas pueden prestar más atención a la eficiencia del combustible del vehículo, otras pueden prestar más atención a la comodidad del automóvil y otras pueden considerar el precio. Al combinar estas diferentes opiniones, podrá tomar una decisión más completa e informada.

El aprendizaje integrado es la verdad. En lugar de depender de un único modelo para hacer predicciones, pregunta a varios modelos (como varios amigos) y combina sus respuestas. De esta forma, se puede obtener una respuesta más precisa y estable, porque el método utiliza la "inteligencia colectiva" de múltiples modelos .

2.2 Campos principales

En el desarrollo del aprendizaje integrado, las ideas y métodos integrados han inspirado muchos trabajos de aprendizaje profundo y aprendizaje automático, y han logrado un gran éxito tanto en el mundo académico como en la industria. En general, el aprendizaje en conjunto se puede dividir en tres áreas principales de investigación:

  • Fusión de modelos

    La fusión de modelos originalmente se llamaba "combinación de clasificadores", este campo se centra principalmente en evaluadores fuertes , tratando de diseñar reglas poderosas para fusionar los resultados de clasificadores fuertes para obtener mejores resultados de fusión. Los medios en este campo incluyen principalmente el método de votación Votación, el método de apilamiento Apilamiento, el método mixto Combinación, etc., y el modelo que se fusionará debe ser un clasificador sólido . Las técnicas de fusión de modelos son uno de los medios más fiables para puntuar en las competiciones de aprendizaje automático/aprendizaje profundo. Como dice el refrán: cuando hayas probado todo y nada funcione, prueba la fusión de modelos.

  • Integración de clasificador débil

    La integración de clasificador débil se centra principalmente en la integración de algoritmos tradicionales de aprendizaje automático. Este campo cubre la mayoría de los algoritmos de integración y métodos de integración familiares, como el embolsado y el impulso. Este campo intenta diseñar potentes algoritmos conjuntos para convertir a múltiples alumnos débiles en alumnos fuertes .

  • Modelos expertos híbridos

    Los modelos expertos híbridos suelen aparecer en el campo del aprendizaje profundo (redes neuronales). En otros campos integrados, se capacita a diferentes alumnos para la misma tarea o incluso con los mismos datos, pero en el modelo experto mixto, una tarea compleja se descompone en varias subtareas relativamente simples y más pequeñas. Luego, los alumnos individuales (expertos) se capacitan para diferentes tareas. subtareas y los resultados de estos alumnos individuales se combinan para obtener el resultado final .

2.3 Por qué funciona el aprendizaje conjunto

El aprendizaje por conjuntos suele ser eficaz porque combina las predicciones de múltiples modelos para producir una predicción final . Este enfoque funciona bien por varias razones:

220

Si no tienes muy claros los conceptos relacionados con varianza, sesgo y error, te sugiero que leas primero este artículo:

Aprendizaje automático (7): diferencias y conexiones entre sesgo, error y varianza

Pero vale la pena señalar que, si bien el aprendizaje en conjunto funciona bien en muchos escenarios, no es una solución milagrosa. En algunos casos, los modelos individuales pueden funcionar tan bien o mejor que los modelos de conjunto. Además, los métodos de conjunto también aumentan la carga computacional, ya que es necesario entrenar y predecir múltiples modelos. Por lo tanto, las ganancias de rendimiento deben sopesarse con el costo computacional cuando se utilizan métodos de conjunto .

3. La relación entre el bosque aleatorio y el aprendizaje integrado

Como se mencionó anteriormente, existen tres áreas principales de investigación en el aprendizaje de conjuntos, a saber, la fusión de modelos, el conjunto de clasificadores débiles y el modelo experto mixto, y el bosque aleatorio se encuentra en el subcampo de conjunto de clasificadores débiles .

El conjunto de clasificadores débiles se centra en cómo integrar múltiples modelos (es decir, estudiantes débiles) cuyo rendimiento es ligeramente menor que el de las adivinanzas aleatorias (o ligeramente mejores) en un modelo más sólido y estable. Entre ellas, Bagging y Boosting son las dos tecnologías centrales en este subcampo.

El bosque aleatorio, específicamente, es una extensión de Bagging, que es una implementación específica del método Bagging basada en árboles de decisión . No se trata simplemente de un muestreo aleatorio de conjuntos de muestras mediante muestreo bootstrap, sino que además introduce una selección aleatoria de características sobre esta base para proporcionar diferentes subconjuntos de características para cada árbol de decisión construido. Mejore la diversidad de modelos y reduzca el riesgo de sobreajuste.

Por lo tanto, la relación entre el bosque aleatorio y el aprendizaje conjunto se puede resumir de la siguiente manera: el bosque aleatorio es un algoritmo específico basado en el método de ensacado y lo extiende en la tecnología de conjunto de clasificadores débiles, y utiliza el árbol de decisión como alumno base .

4. ¿Qué es el embolsado?

4.1 Idea central y proceso

Bagging es la abreviatura de "Bootstrap Aggregating", que es una técnica de aprendizaje integrada, específicamente un método de integración de clasificador débil. Citando un artículo sobre "Predictores de ensacado" de Leo Breiman [1996], Leo describe el ensacado como: "Los predictores de ensacado son un método para generar múltiples versiones de un predictor y utilizar estas versiones para obtener un predictor agregado" . Su idea central y sus pasos son los siguientes: sigue:

  • Paso 1: muestreo de arranque

El núcleo de Bagging es extraer repetidamente subconjuntos del conjunto de datos de entrenamiento mediante una técnica de muestreo aleatorio con reemplazo (también conocida como muestreo Bootstrap) . Por lo tanto, es posible que cada muestreo no obtenga exactamente el mismo subconjunto de datos.

imagen-20230807163925393

En el aprendizaje automático, el método bootstrap se refiere al muestreo y reemplazo aleatorios, lo que se denomina remuestreo. En Bagging, el muestreo Bootstrap se utiliza para crear múltiples subconjuntos de datos de entrenamiento diferentes y luego entrenar múltiples modelos. Este proceso debe centrarse en los siguientes detalles:

  1. Determinación del tamaño del conjunto de datos : en Bagging, el número de muestras generalmente se elige para que sea del mismo tamaño que el conjunto de datos original.
  2. Muestreo aleatorio con reemplazo : una muestra no se elimina del conjunto de datos original después de ser seleccionada, lo que significa que aún puede seleccionarse nuevamente en un muestreo posterior.
  3. Remuestreo : el proceso de muestreo aleatorio descrito anteriormente se repite hasta que el nuevo subconjunto de datos alcanza un tamaño predeterminado (generalmente el mismo tamaño que el conjunto de datos original).
  4. Muestreo múltiple : para entrenar múltiples modelos en Bagging, todo el proceso de muestreo de Bootstrap debe repetirse varias veces, generando así múltiples subconjuntos de datos.

Como se muestra arriba, cada población de muestra tiene diferentes partes y ninguna de ellas es igual.

  • Paso 2: entrenamiento independiente

Utilice cada subconjunto de datos para entrenar de forma independiente un modelo de aprendizaje (por ejemplo, árbol de decisiones, red neuronal, etc.). Dado que estos modelos se entrenan con diferentes subconjuntos de datos, el sesgo y la varianza de cada modelo serán diferentes.

  • Paso 3: Agregación de modelos

En la integración de Bagging, se establecen en paralelo múltiples evaluadores débiles (generalmente árboles de decisión, pero también otros algoritmos no lineales) y los resultados de múltiples evaluadores débiles se sintetizan para generar resultados. Cuando el objetivo del algoritmo de integración es una tarea de regresión, la salida del algoritmo de integración es el promedio de los resultados de salida del evaluador débil. Cuando el objetivo del algoritmo de integración es una tarea de clasificación, la salida del algoritmo de integración es el Resultado del evaluador débil: La minoría obedece a la mayoría.

4.2 Reproducir el proceso de Ensacado

Reproduzca el proceso de ensacado mencionado anteriormente: supongamos que hay 9 evaluadores débiles en un algoritmo de integración de ensacado, el código es el siguiente:

  • Paso 1: preparar datos simulados y realizar muestreo Bootstrap
# 创建一个简单的数据集
X, y = make_classification(n_samples=100, n_features=20, random_state=42)

# 设置Bagging参数
n_estimators = 9

# 细节1:在Bagging中,通常选择的样本数与原始数据集的大小相同
subset_size = len(X)
weak_learners = []

# Step 1:Bootstrap抽样
print("Step 1: Bootstrap sampling\n")
for i in range(n_estimators):
    # 细节2:有放回的随机抽样,参数 replace=True 指示这是一个有放回的抽样
    bootstrap_indices = np.random.choice(np.arange(X.shape[0]), size=subset_size, replace=True)
    X_bootstrap = X[bootstrap_indices]
    y_bootstrap = y[bootstrap_indices]
    
    print(f"Bootstrap sample {
      
      i + 1} contains {
      
      len(np.unique(bootstrap_indices))} unique instances out of {
      
      subset_size}.")
    
    # 打印每次抽取的X_bootstrap和y_bootstrap
    print(f"X_bootstrap {
      
      i + 1}:")
    print(X_bootstrap)
    print(f"y_bootstrap {
      
      i + 1}:")
    print(y_bootstrap)
    print('-' * 75)  # 分隔线,方便查看每个bootstrap样本的输出

Eche un vistazo a los resultados del muestreo:

imagen-20230807173656488

Solo de los dos primeros se puede ver que cada muestra es diferente y hay otro punto clave para explicar, consulte la figura a continuación:

221

Paso 2: entrenamiento independiente para probar la predicción de conjuntos

for i in range(n_estimators):
    # 细节2:有放回的随机抽样,参数 replace=True 指示这是一个有放回的抽样
    bootstrap_indices = np.random.choice(np.arange(X.shape[0]), size=subset_size, replace=True)
    X_bootstrap = X[bootstrap_indices]
    y_bootstrap = y[bootstrap_indices]
    
    print(f"Bootstrap sample {
      
      i + 1} contains {
      
      len(np.unique(bootstrap_indices))} unique instances out of {
      
      subset_size}.")
    
    # Step 2:独立训练
    tree = DecisionTreeClassifier()
    tree.fit(X_bootstrap, y_bootstrap)
    weak_learners.append(tree)

print("\nStep 2: Independent Training Completed.")

# 对于新的数据X_test进行预测
X_test, y_test = make_classification(n_samples=50, n_features=20, random_state=24)
predictions = []

for i, tree in enumerate(weak_learners):
    print(y_test)
    pred = tree.predict(X_test)
    print(pred)
    predictions.append(pred)
    
    # 打印每个weak_learner的准确率
    print(f"Weak Learner {
      
      i + 1} Accuracy: {
      
      accuracy_score(y_test, pred)*100:.2f}%")

Mira el resultado:

imagen-20230807174347586

9 conjuntos de datos de muestreo diferentes capacitarán a 9 evaluadores independientes y obtendrán diferentes resultados de predicción en la misma máquina de prueba y_test.

Paso 3: Agregación de modelos

La agregación de modelos en Bagging la realiza la minoría obedeciendo a la mayoría. Para los problemas de clasificación, a cada modelo se le dan sus predicciones y se selecciona la predicción más común como resultado final. Para los problemas de regresión, el resultado final se obtiene tomando el promedio de todas las predicciones del modelo. Este ejemplo es un problema de clasificación, por lo que se utiliza la estrategia de votación mayoritaria . Para cada ejemplo de prueba, observe las predicciones de todos los estimadores débiles y elija la clase con más votos como predicción final.

# Step 3:模型聚合
final_predictions = [Counter(row).most_common(1)[0][0] for row in predictions]
print("\nStep 3: Model Aggregation")
print(f"Aggregated Prediction Accuracy: {
      
      accuracy_score(y_test, final_predictions)*100:.2f}%")
print("\nIn model aggregation for classification tasks in Bagging, the predictions from all the weak learners are combined, and the final output is the class that gets the most votes among all weak learners.")

Mira el resultado:

imagen-20230807174855061

Los resultados muestran que después de la agregación de votos de todos los estudiantes débiles, la predicción final del conjunto Bagging es correcta en un 44% en el conjunto de datos de prueba. En otras palabras, predijo correctamente el 44% de las muestras de prueba.

Este código es sólo para demostrar la simulación manual del proceso de embolsado. En aplicaciones prácticas, puede utilizar directamente scikit-learn BaggingClassifiero BaggingRegressor, que han implementado este proceso de manera eficiente. El código completo es el siguiente:

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.metrics import accuracy_score
from collections import Counter

# 创建一个简单的数据集
X, y = make_classification(n_samples=100, n_features=20, random_state=42)

# 设置Bagging参数
n_estimators = 9

# 细节1:在Bagging中,通常选择的样本数与原始数据集的大小相同
subset_size = len(X)
weak_learners = []

# Step 1:Bootstrap抽样
print("Step 1: Bootstrap sampling\n")
for i in range(n_estimators):
    # 细节2:有放回的随机抽样,参数 replace=True 指示这是一个有放回的抽样
    bootstrap_indices = np.random.choice(np.arange(X.shape[0]), size=subset_size, replace=True)
    X_bootstrap = X[bootstrap_indices]
    y_bootstrap = y[bootstrap_indices]
    
    print(f"Bootstrap sample {
      
      i + 1} contains {
      
      len(np.unique(bootstrap_indices))} unique instances out of {
      
      subset_size}.")
    
    # Step 2:独立训练
    tree = DecisionTreeClassifier()
    tree.fit(X_bootstrap, y_bootstrap)
    weak_learners.append(tree)

print("\nStep 2: Independent Training Completed.")

# 对于新的数据X_test进行预测
X_test, y_test = make_classification(n_samples=50, n_features=20, random_state=24)
predictions = []

for i, tree in enumerate(weak_learners):
    pred = tree.predict(X_test)
    predictions.append(pred)
    
    # 打印每个weak_learner的准确率
    print(f"Weak Learner {
      
      i + 1} Accuracy: {
      
      accuracy_score(y_test, pred)*100:.2f}%")

predictions = np.array(predictions).T

# 打印每个weak_learner的预测结果
print("\nPredictions from each weak learner:")
for i, pred in enumerate(predictions):
    print(f"Weak Learner {
      
      i + 1}:")
    print(pred, "\n")

# Step 3:模型聚合
final_predictions = [Counter(row).most_common(1)[0][0] for row in predictions]
print("\nStep 3: Model Aggregation")
print(f"Aggregated Prediction Accuracy: {
      
      accuracy_score(y_test, final_predictions)*100:.2f}%")
print("\nIn model aggregation for classification tasks in Bagging, the predictions from all the weak learners are combined, and the final output is the class that gets the most votes among all weak learners.")

En sklearn, hay dos algoritmos de integración de Bagging, Random Forest (RandomForest) y Extreme Random Tree (ExtraTrees) , los cuales son algoritmos supervisados ​​con árboles de decisión como evaluadores débiles , utilizados para clasificación, regresión, clasificación y otras tareas.

Además, también puede utilizar la idea de ensacado para integrar otros algoritmos, como utilizar la clase BaggingClassifier clasificada por el método de ensacado para integrar máquinas de vectores de soporte o regresión logística. La correspondencia es la siguiente:

  1. Clasificación de bosques aleatoria: RandmForestClassifier
  2. Regresión de bosque aleatoria: RandomForestRegressor
  3. Clasificación de árbol aleatorio extremo: ExtraTreesClassifier
  4. Regresión de árbol aleatoria extrema: ExtraTreesRegressor
  5. Clasificación de embolsado: BaggingClassifier
  6. El embolsado regresa a BaggingRegressor

Cinco, principio del bosque aleatorio

El bosque aleatorio es un método de aprendizaje integrado y su proceso de construcción se divide principalmente en tres pasos:

  1. Muestreo Bootstrap : muestreo con reemplazo para generar múltiples subconjuntos de datos
  2. Cree un árbol de decisiones : cree un árbol de decisiones para cada subconjunto de datos
  3. Predicción : en el caso de un problema de regresión, la predicción del bosque aleatorio es el promedio de las predicciones de todos los árboles de decisión, y en el caso de un problema de clasificación, cada árbol de decisión vota y la predicción del bosque aleatorio es la clase que recibió más votos.

En pocas palabras, el proceso de construcción del algoritmo de bosque aleatorio se puede describir de la siguiente manera: se muestrean aleatoriamente diferentes subconjuntos de los datos proporcionados para construir múltiples árboles de decisión diferentes, y los resultados de un único árbol de decisión se analizan de acuerdo con las reglas de Bagging. Integración (promedio para regresión, mayoría para clasificación) . Entonces, siempre que domine los diversos atributos y parámetros del árbol de decisión, la mayor parte del contenido del bosque aleatorio es bastante fácil de entender.

Los tres procesos anteriores no son difíciles de entender, pero cada proceso tendrá algunos pequeños detalles en uso . El siguiente es un caso práctico para descubrir a qué parámetros y detalles se debe prestar atención en el bosque aleatorio.

6. Ejemplo de modelado de bosque aleatorio en Sklearn

6.1 Resumen de parámetros

En sklearn, el bosque aleatorio se puede aplicar a las dos tareas principales de clasificación y regresión. Específicamente, hay dos clases principales, RandomForestClassifier y RandomForestRegressor.

222

De hecho, se puede ver claramente que los parámetros del regresor de bosque aleatorio y el clasificador son altamente consistentes y se pueden usar de la misma manera que llamar a otros algoritmos en sklearn, como la regresión logística y los árboles de decisión, para crear instancias. , ajuste y predicción en secuencia. /score para completar tareas relacionadas.

El índice de evaluación predeterminado para el bosque de regresión es R2 y el índice de evaluación predeterminado para el bosque de clasificación es precisión.

6.2 Ejemplo de modelado con regresión de bosque aleatoria

El bosque aleatorio tiene una gran cantidad de parámetros y todos los parámetros del bosque aleatorio implementados en Sklearn tienen valores predeterminados, por lo que incluso si no aprende ningún parámetro, puede llamar al algoritmo del bosque aleatorio para completar el modelado . El proceso es el siguiente:

  • Paso 1: Importe las bibliotecas necesarias
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.tree import DecisionTreeRegressor as DTR

# cross_val_score与cross_validate的区别就是:cross_validate能够输出训练集分数
from sklearn.model_selection import cross_validate, KFold
  • Paso 2: leer el conjunto de datos y verlo

El conjunto de datos proviene de la competencia de precios de la vivienda en Kaggle, dirección: https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques/overview

El conjunto de datos utilizado en este artículo ha completado el trabajo de preprocesamiento preliminar.

data = pd.read_csv("../../../../datasets/HousePrice/train_encode.csv", index_col=0)

Los datos son los siguientes:

imagen-20230808092018191

  • Paso 3: exploración inicial de datos

Después de leer los datos, eche un vistazo preliminar a los datos y comprenda los datos. El código es el siguiente:

X = data.iloc[:,:-1]
y = data.iloc[:,-1]

# # 数据的基本信息
# print("Basic Information:")
# print(data.info())

# 1. 数据的大小
print("1. Size of the data:")
print(data.shape)

# 2. 缺失值
print("\n2. Missing Values:")
print(data.isnull().sum())

# 3. x的数据描述
print("\n3. Descriptive statistics for features:")
print(X.describe().iloc[0])  # 打印第一行,即count

# 4. y的取值描述
print("\n4. Descriptive statistics for target variable:")
print(y.describe())

Mire la situación de los datos:

imagen-20230808092603634

  • Paso 4: utilice los parámetros predeterminados de RandomForestRegressor con modelado de validación cruzada
import time

def random_forest_cross_validation(X, y, n_estimators=100, cv=None):
    """
    使用随机森林回归器并应用交叉验证。
    
    参数:
    - X: 特征数据
    - y: 目标变量
    - n_estimators: 随机森林中的树的数量
    - cv: 交叉验证方法实例
    
    返回:
    - scores: 交叉验证的结果
    """
    
    # 创建随机森林回归器实例
    rf_regressor = RandomForestRegressor(n_estimators=n_estimators, random_state=42)
    
    # 记录开始时间
    start_time = time.time()

    # 使用交叉验证评估模型
    scores = cross_validate(rf_regressor,   # 评估器
                            X,              # 特征
                            y,              # 标签
                            cv=cv,          # 交叉验证参数
                            scoring=('neg_mean_squared_error'),  # 评估指标
                            return_train_score=True     # 返回训练分数
                           )
    
    # 记录结束时间,并计算训练时长
    end_time = time.time()
    elapsed_time = end_time - start_time

    # 打印训练时间
    print(f"总训练时间: {
      
      elapsed_time:.2f} 秒")
    
    return scores
  • Paso 5: Ejecute la función y analice el resultado.
# 定义交叉验证方式
cv = KFold(n_splits=5, shuffle=True, random_state=1412)

# 使用函数
scores = random_forest_cross_validation(X, y, cv=cv)

# 打印交叉验证结果
print("交叉验证均方误差得分:", scores['test_score'])
print("平均均方误差得分:", scores['test_score'].mean())

El resultado es el siguiente:

imagen-20230808100428692

Si analiza más a fondo las puntuaciones devueltas por el modelo, su formato es el siguiente:

223

Por lo tanto, para el análisis integral de los resultados de entrenamiento anteriores: el puntaje de entrenamiento es significativamente mejor que el puntaje de la prueba, lo que significa que el modelo tiene un sobreajuste en los datos de entrenamiento.

  • Paso 6: intente modelar con árboles de decisión
from sklearn.tree import DecisionTreeRegressor

def decision_tree_cross_validation(X, y, cv=None):
    """
    使用决策树回归器并应用交叉验证。
    
    参数:
    - X: 特征数据
    - y: 目标变量
    - cv: 交叉验证方法实例
    
    返回:
    - scores: 交叉验证的结果
    """
    
    # 创建决策树回归器实例
    dt_regressor = DecisionTreeRegressor(random_state=42)
    
    # 记录开始时间
    start_time = time.time()

    # 使用交叉验证评估模型
    scores = cross_validate(dt_regressor,   # 评估器
                            X,              # 特征
                            y,              # 标签
                            cv=cv,          # 交叉验证参数
                            scoring=('neg_mean_squared_error'),  # 评估指标
                            return_train_score=True     # 返回训练分数
                           )
    
    # 记录结束时间,并计算训练时长
    end_time = time.time()
    elapsed_time = end_time - start_time

    # 打印训练时间
    print(f"总训练时间: {
      
      elapsed_time:.2f} 秒")
    
    return scores

# 使用函数
scores_dt = decision_tree_cross_validation(X, y, cv=cv)

# 打印交叉验证结果
print("决策树交叉验证均方误差得分:", scores_dt['test_score'])
print("决策树平均均方误差得分:", scores_dt['test_score'].mean())

Mira los resultados:

imagen-20230808102029137

Análisis de los resultados: el error de entrenamiento es 0, lo que significa que el árbol de decisión ha logrado un ajuste perfecto en el conjunto de entrenamiento, mientras que el error de prueba varía de 1.33e+09 a 2.84e+09, lo que muestra que el módulo propuesto es un estado de súper sobreajuste .

  • Paso 7: análisis comparativo

Para el mismo conjunto de datos, los resultados obtenidos por el árbol de decisión y el bosque aleatorio bajo los parámetros predeterminados también son diferentes, los principales problemas son los siguientes:

  1. El error cuadrático medio del árbol de decisión en el conjunto de prueba ha aumentado en comparación con el modelo de bosque aleatorio (la diferencia entre el conjunto de entrenamiento y la puntuación de la prueba en la validación cruzada es mayor), por lo que el grado de sobreajuste del bosque no es tan alto como el del árbol de decisión, lo que muestra que los modelos de bosque aleatorio pueden ser más adecuados para esta tarea .

  2. En comparación con los bosques aleatorios, el tiempo de formación de los árboles de decisión se reduce significativamente. Esto se debe a que los árboles de decisión solo tienen un modelo para entrenar, mientras que los bosques aleatorios requieren que se entrenen múltiples árboles de decisión .

  • Paso 8: Calcule el RMSE del bosque aleatorio y el árbol de decisión

En el aprendizaje integrado, el indicador para medir el algoritmo de regresión es generalmente RMSE (error cuadrático medio), que es el resultado de MSE después de la raíz cuadrada . Las etiquetas de los datos reales suelen ser enormes y la cantidad de datos es enorme. MSE como resultado cuadrado amplificará el error en los datos reales (por ejemplo, obtenido en el resultado del bosque aleatorio, 7 ∗ 1 0 8 7*10^ 871 08 y otros resultados). Si se utiliza RMSE, el código de cálculo es el siguiente:

# 计算随机森林的RMSE
rf_train_rmse = np.sqrt(abs(scores["train_score"]))
rf_test_rmse = np.sqrt(abs(scores["test_score"]))

# 计算决策树的RMSE
dt_train_rmse = np.sqrt(abs(scores_dt["train_score"]))
dt_test_rmse = np.sqrt(abs(scores_dt["test_score"]))

print(f"随机森林训练数据的平均RMSE: {
      
      rf_train_rmse.mean():.2f}")
print(f"随机森林测试数据的平均RMSE: {
      
      rf_test_rmse.mean():.2f}")
print(f"决策树训练数据的平均RMSE: {
      
      dt_train_rmse.mean():.2f}")
print(f"决策树测试数据的平均RMSE: {
      
      dt_test_rmse.mean():.2f}")
  • Paso 9: dibuja la imagen
# 准备数据
models = [
    {
    
    "rmse_train": rf_train_rmse, "rmse_test": rf_test_rmse, "color": "green", "label": "RandomForest"},
    {
    
    "rmse_train": dt_train_rmse, "rmse_test": dt_test_rmse, "color": "orange", "label": "DecisionTree"}
]

xaxis = range(1,6)
plt.figure(figsize=(8,6), dpi=80)

# 使用循环绘制线条
for model in models:
    plt.plot(xaxis, model["rmse_train"], color=model["color"], label=f"{
      
      model['label']}Train")
    plt.plot(xaxis, model["rmse_test"], color=model["color"], linestyle="--", label=f"{
      
      model['label']}Test")

# 设置轴标题、图例和轴标签
plt.xticks([1,2,3,4,5])
plt.xlabel("CVcounts", fontsize=16)
plt.ylabel("RMSE", fontsize=16)
plt.legend()
plt.show()

La imagen es la siguiente:

imagen-20230808105217158

Abscisa: número de validaciones cruzadas, ordenada: valor RMSE

Como puede ver en la imagen, mientras que tanto el bosque aleatorio como los árboles de decisión muestran signos de sobreajuste, el bosque aleatorio se sobreajusta significativamente menos . En el conjunto de entrenamiento, el árbol de decisión ha alcanzado un ajuste perfecto y su RMSE es 0, mientras que el RMSE en el conjunto de entrenamiento del bosque aleatorio es de aproximadamente 10,000. Sin embargo, para el conjunto de pruebas, los bosques aleatorios tuvieron un desempeño significativamente mejor que los árboles de decisión. Esto valida la idea de que los bosques aleatorios tienen inherentemente mayores capacidades de generalización y un menor riesgo de sobreajuste que los árboles de decisión en comparación con configuraciones de parámetros específicos .

Aunque los bosques aleatorios superan a los árboles de decisión, sufren de sobreajuste, lo que generalmente significa que el modelo puede haber capturado parte del ruido en los datos de entrenamiento en lugar de solo los patrones subyacentes. Por lo tanto, es necesario considerar ajustar algunos parámetros del bosque aleatorio (por ejemplo, reducir la profundidad del árbol, aumentar el número mínimo de hojas de muestra, etc.) para reducir el sobreajuste.

7. Explicación detallada de los parámetros del bosque aleatorio en Sklearn.

El número de parámetros del regresor de bosque aleatorio es todavía relativamente grande. Para facilitar la comprensión, los parámetros se pueden clasificar según su utilidad y función, de la siguiente manera:

224

De acuerdo con esta regla de clasificación, al ajustar los parámetros, primero puede determinar el tamaño y el rendimiento del modelo, luego ajustar la estructura y profundidad del árbol, luego optimizar la selección de muestras y características y, finalmente, considerar otros parámetros.

7.1 Tamaño y rendimiento del modelo

227

  • Parámetro 1: n_estimadores

El parámetro n_estimators representa el número de estimadores débiles (generalmente árboles de decisión) en el bosque aleatorio y el valor predeterminado es 100 en sklearn, que es el único parámetro requerido.

Para un árbol de decisión único, la complejidad del modelo está determinada por la estructura del árbol (profundidad del árbol, ancho del árbol, número de hojas del árbol, etc.) y la cantidad de datos (tamaño de la muestra, cantidad de características), mientras que para los bosques aleatorios, La complejidad del modelo está determinada por La cantidad de árboles en el bosque está determinada por la estructura del árbol y la cantidad de datos. Cuantos más árboles haya, más complejo será el modelo . Por lo tanto, al ajustar n_estimators, es necesario lograr un equilibrio entre el efecto del modelo y la dificultad del entrenamiento . Al mismo tiempo, también es necesario utilizar validación cruzada para vigilar el sobreajuste del modelo.

7.2 Estructura y profundidad del árbol

La precisión de la predicción y la estabilidad de los bosques aleatorios se ven afectadas principalmente por los estimadores débiles (generalmente árboles de decisión) que los componen . La estructura, profundidad y diversidad de cada árbol tendrán un efecto directo en la eficiencia del bosque aleatorio, su capacidad de generalizar y si se adapta excesivamente. Cuanto mayor sea la complejidad de un solo árbol, la complejidad computacional general del bosque aleatorio también aumentará, lo que aumentará el tiempo de cálculo y correrá el riesgo de sobreajuste . Por lo tanto, ajustar y optimizar adecuadamente cada árbol es la clave para garantizar que el bosque aleatorio funcione bien. En resumen, ajustar la estructura de cada estimador débil es fundamental, ya que tanto su complejidad como su rendimiento predictivo afectan globalmente los resultados forestales aleatorios .

225

Estos parámetros del bosque aleatorio DecisionTreeRegressorson exactamente los mismos que en la clase de árbol de decisión y se utilizan para podar el árbol de decisión y controlar la estructura de un único evaluador débil. Los parámetros en los que hay que centrarse son los siguientes:

  • Parámetro 1: criterio

En los bosques aleatorios, criterionlos parámetros se utilizan para determinar cómo se dividen las características para construir la estructura del árbol . Especifica el método para medir la calidad de la segmentación. criterionExisten parámetros tanto para clasificadores de bosques aleatorios como para regresores, pero los criterios utilizados son ligeramente diferentes. En el árbol de clasificación de bosques aleatorios ( RandomForestClassifier), el índice de medición es el coeficiente de Gini o entropía de la información, que ya se mencionó en el artículo anterior, por lo que no lo repetiré aquí, si no lo tienes claro, lee esto. artículo:

Aprendizaje automático (16): árbol de decisiones

Concéntrese en el árbol de regresor del bosque aleatorio ( RandomForestRegressor), el criterio en el árbol de regresión puede elegir **"squared_error" (error cuadrado), "absolute_error" (error absoluto) y "poisson" (desviación de Poisson) **. Para cualquier muestra iidije ,yi y_iyyoes la etiqueta real, yi ^ \hat{y_i}yyo^Para predecir la etiqueta, la expresión de cada criterio es:

  • Error cuadrático (MSE, error cuadrático medio)

MSE es una de las funciones de pérdida de regresión más utilizadas, que intenta minimizar la diferencia al cuadrado entre los valores reales y predichos. Esto también significa que los errores grandes se penalizan más, ya que el cuadrado del error aumenta la brecha.
MSE = ∑ ( yi − yi ^ ) 2 (1) MSE = \sum{(y_i - \hat{y_i})^2} \tag{1}MSE=( yyoyyo^)2( 1 )

  • Error absoluto (MAE, error absoluto medio)

MAE aplica el mismo peso a todos los errores, independientemente de su magnitud. Esto hace que el modelo sea más robusto frente a valores atípicos, ya que no penaliza errores grandes como lo hace MSE.
MAE = ∑ ∣ yi − yi ^ ∣ (2) MAE = \sum{|y_i - \hat{y_i}|} \tag{2}MAE _ _=yyoyyo^( 2 )

  • Desviación de Poisson

La desviación de Poisson se utiliza comúnmente para datos de recuento y para modelar datos distribuidos por Poisson. Esta es una buena opción cuando la variable objetivo representa recuentos o frecuencias. Mide la diferencia entre los recuentos observados y previstos.
P oisson = 2 ∑ ( yilog ( yiyi ^ ) − ( yi − yi ^ ) ) (3) Poisson = 2\sum{(y_ilog(\frac{y_i}{\hat{y_i}})-(y_i - \hat {y_i}))} \etiqueta{3}veneno _ _ _ _=2( yyoiniciar sesión ( _yyo^yyo)( yyoyyo^))( 3 )

En general: como criterio de ramificación, el error al cuadrado es más sensible que el error absoluto (similar a cómo la entropía es más sensible que el coeficiente de Gini) , y el error al cuadrado es computacionalmente mucho más rápido que el error absoluto. La desviación de Poisson es adecuada para un escenario especial: cuando las etiquetas que se van a predecir son todas números enteros positivos, se puede considerar que la distribución de las etiquetas es similar a la distribución de Poisson.

Escenario: Tasa de llegada de pasajeros a una estación de autobuses de la ciudad

Suponga que es un planificador de transporte para una ciudad y desea predecir la cantidad de llegadas de pasajeros a una parada de autobús específica en un período de tiempo específico (por ejemplo, cada hora). Este es un problema de conteo típico, ya que se predice un número entero no negativo (es decir, el número de pasajeros que llegan).

Tienes datos de los últimos meses que muestran el número de pasajeros que llegan a cada parada por hora. Se observan algunos patrones regulares en el número de llegadas (por ejemplo, las horas pico de la mañana y la tarde tienen más llegadas que otras horas), pero también cierta aleatoriedad.

En este caso, el número de pasajeros que llegan puede seguir una distribución de Poisson, que es una distribución típica que describe el número de eventos independientes que ocurren en un período de tiempo determinado.

Para predecir el número de llegadas futuras de pasajeros, se puede utilizar un modelo de regresión forestal aleatoria y elegir la desviación de Poisson como función de pérdida. De esta manera, el modelo tiene en cuenta la naturaleza de Poisson de los datos, lo que potencialmente proporciona predicciones más precisas que otras funciones de pérdida.

Este es sólo un ejemplo del uso del sesgo de Poisson; de hecho, cualquier problema en el que desee predecir recuentos, especialmente si esos recuentos tienen cierta aleatoriedad, el sesgo de Poisson puede ser una opción adecuada.

Las predicciones de números enteros positivos son muy comunes en aplicaciones prácticas, como predecir clics, predecir números de facturación/clientes, predecir ventas, etc.

De hecho, en aplicaciones prácticas, el único indicador para seleccionar el criterio es el resultado final de la validación cruzada; no importa cómo lo explique la teoría, solo se toma el criterio que hace que el resultado de predicción del bosque aleatorio sea el mejor .

  • Parámetro 2: profundidad máxima

Este parámetro se utiliza para controlar la profundidad del árbol, el valor predeterminado es Ninguno. Desde la perspectiva de la estructura del árbol, es el parámetro que tiene el mayor impacto en la capacidad anti-sobreajuste del bosque aleatorio, por lo que cuando el bosque aleatorio muestra sobreajuste, será muy efectivo elegir una profundidad máxima pequeña .

  • Parámetro 3: max_leaf_nodes y min_sample_split

Un método de ramificación más fino que max_profundidad, pero limitando el número de hojas y ramas, puede lograr tanto un ajuste fino como una poda drástica. El valor predeterminado de max_leaf_nodes es Ninguno, es decir, el número de hojas no está limitado. El valor predeterminado de min_sample_split es 2, lo que equivale a ramas ilimitadas.

  • Parámetro 4: min_impurity_decrease

El método de reducción de ramas más refinado puede reducir las hojas correspondientes según el grado de reducción de impurezas. El valor predeterminado es 0, por lo que es un parámetro bastante amplio.

7.3 Datos de entrenamiento para el modelo.

Cuando el árbol de decisión se ramifica, encontrará el nodo con la mayor disminución en el grado de impureza de características para la ramificación. Por lo tanto, en principio, siempre que los datos sean consistentes y el árbol de decisión no se reduzca, la estructura de la decisión El árbol debe ser completamente igual . Para el algoritmo de conjunto, no tiene sentido promediar los resultados de múltiples árboles de decisión idénticos, por lo que cada árbol en el algoritmo de conjunto debe ser un árbol diferente, por lo que el bosque aleatorio utiliza el algoritmo Bagging y se basa en datos de muestreo aleatorio para lograrlo.

El bosque aleatorio tomará muestras aleatorias de diferentes subconjuntos de los datos proporcionados para construir múltiples árboles de decisión diferentes y, finalmente, integrará los resultados de muchos árboles de decisión de acuerdo con las reglas de Bagging. Los parámetros relevantes son los siguientes:

226

  • Parámetro 1: arranque

El parámetro bootstrap se utiliza para controlar si se utiliza el muestreo bootstrap para crear los datos de entrenamiento para cada árbol. La entrada es un valor booleano .

  • Si bootstrap = True (el valor predeterminado), para cada árbol entrenado, se extraen muestras de los datos originales utilizando un método de muestreo bootstrap.

  • Si bootstrap=False, cada árbol se entrena utilizando el conjunto de datos original completo.

En el bosque aleatorio, se refiere específicamente a la técnica de muestreo aleatorio con reemplazo.El proceso específico es el siguiente:

Supongamos que hay un conjunto de entrenamiento original que contiene m muestras y que se muestrea aleatoriamente. Se toma una muestra cada vez y la muestra se , es decir, la muestra aún se puede recolectar en el siguiente muestreo, de modo que un conjunto de autoservicio compuesto de muestras max_samplesfinalmente se obtiene .max_samples

RF3

En términos generales, max_samples es igual a m (práctica de la industria), es decir, el tamaño del conjunto de datos de muestreo es consistente con el conjunto de datos original, pero si el conjunto de datos original es demasiado grande o demasiado pequeño, el tamaño también se puede ajustar. max_sampleslibremente . Debido al muestreo aleatorio, cada conjunto de autoayuda es diferente del conjunto de datos original y también diferente de otros conjuntos de muestreo. De esta manera, puede crear libremente conjuntos de autoayuda diferentes e inagotables, y utilizar estos conjuntos de autoayuda para entrenar clasificadores débiles, y los clasificadores débiles, naturalmente, serán diferentes.

Sin embargo, el muestreo con reemplazo tiene sus propios problemas. Debido al reemplazo, algunas muestras pueden aparecer varias veces en el mismo conjunto de arranque, mientras que otras pueden ignorarse. Cuando el número de muestras es lo suficientemente grande y el conjunto de datos original es lo suficientemente grande , el conjunto de arranque contendrá en promedio aproximadamente el 63% de los datos completos. Este número tiene una base matemática. Porque en el muestreo max_samples, la probabilidad de que una muestra se incluya en un conjunto de autoayuda es:

1 − ( 1 − 1 m ) max _ muestras (4) 1-(1-\frac{1}{m})^{max\_samples} \tag{4}1( 1metro1)ma x _ muestras muestras _ _( 4 )

Para cualquier muestra, la probabilidad de extraer la muestra en un muestreo es:
1 m (5) \frac{1}{m} \tag{5}metro1( 5 )
La probabilidad de no extraer la muestra en un muestreo es:
1 − 1 m (6) 1-\frac{1}{m} \tag{6}1metro1( 6 )
Un total demax_samplesveces de muestreo, la probabilidad de que la muestra no se extraiga una vez es
( 1 − 1 m ) max _ samples (7) (1-\frac{1}{m})^{max\_samples} \ etiqueta {7}( 1metro1)ma x _ muestras muestras _ _( 7 )
Por lo tanto, 1 menos la probabilidad es la probabilidad de que una muestra se extraiga en un determinado conjunto de arranque durante el muestreo. Cuando m es exactamente igual a la fórmula, la fórmula se puede modificar como: 1 − ( 1 − 1max_samplesm
) metro ( 8) 1-(1-\frac{1}{m})^{m} \tag{8}1( 1metro1)metro( 8 )
Este es un problema de límite clásico, que puede conocerse a partir de la regla de L'Hôpital: cuando m es lo suficientemente grande (cerca del límite), esta probabilidad converge a 1-(1/e), donde e es una constante de naturaleza, la probabilidad global es aproximadamente igual a 0,632. Por lo tanto,aproximadamente el 37% de los datos de entrenamiento se desperdiciarán sin participar en el modelado, y estos datos se denominan datos fuera de la bolsa (abreviado como oob). Cuando se utilizan bosques aleatorios, los datos disponibles a menudo se utilizan como conjunto de validación.

  • Parámetro 2: oob_score

La premisa para utilizar el parámetro oob_score es: boostrap=True

oob_score controla si se utilizan datos fuera de bolsa para la verificación . La entrada es un valor booleano y el valor predeterminado es Falso. Si desea utilizar datos fuera de bolsa para la verificación, simplemente cámbielo a Verdadero.

  • Parámetro 3: max_samples

max_samples indica el tamaño del conjunto de arranque , puede ingresar un número entero, un número de punto flotante o Ninguno, y el valor predeterminado es Ninguno.

Si usa datos fuera de bolsa, puede usar otro atributo importante del bosque aleatorio: oob_score_para ver los resultados de las pruebas en datos fuera de bolsa, oob_score_el índice de evaluación de salida está predeterminado en R2 y no admite modificaciones.

  • Parámetro 4: max_features

El uso de max_features en el bosque aleatorio es exactamente el mismo que en el árbol de decisión, como sigue:

  1. Ingrese un número entero, lo que indica que las características max_features se extraen aleatoriamente para cada rama
  2. Ingrese un número de punto flotante, lo que indica que las características redondas (max_features * n_features) se extraen cada vez que se realiza una rama.
  3. Ingrese "auto" o Ninguno, lo que indica que todas las funciones n_features se utilizan para cada rama
  4. Ingrese "sqrt" para usar sqrt(n_features) para cada rama
  5. Ingrese "log2" para usar log2(n_features) para cada rama

No importa cómo se muestreen los datos, lo que se puede controlar son solo los datos cuando se construye un solo árbol . Cuando la cantidad total de datos es limitada, cuanto mayor sea la cantidad de datos utilizados por un solo árbol, más similares serán los datos utilizados por cada árbol y más similar será la estructura de cada árbol. difícil de ejercer y el modelo será fácil de sobreajustar. Por lo tanto, cuando la cantidad de datos es suficiente, la cantidad de datos utilizados por un solo árbol tiende a reducirse.

detalles de la siguiente manera:

  1. Ingrese un número entero, lo que indica que las características max_features se extraen aleatoriamente para cada rama
  2. Ingrese un número de punto flotante, lo que indica que las características redondas (max_features * n_features) se extraen cada vez que se realiza una rama.
  3. Ingrese "auto" o Ninguno, lo que indica que todas las funciones n_features se utilizan para cada rama
  4. Ingrese "sqrt" para usar sqrt(n_features) para cada rama
  5. Ingrese "log2" para usar log2(n_features) para cada rama

No importa cómo se muestreen los datos, lo que se puede controlar son solo los datos cuando se construye un solo árbol . Cuando la cantidad total de datos es limitada, cuanto mayor sea la cantidad de datos utilizados por un solo árbol, más similares serán los datos utilizados por cada árbol y más similar será la estructura de cada árbol. difícil de ejercer y el modelo será fácil de sobreajustar. Por lo tanto, cuando la cantidad de datos es suficiente, la cantidad de datos utilizados por un solo árbol tiende a reducirse.

8. Resumen

Este artículo proporciona una mirada en profundidad al aprendizaje conjunto y su aplicación a bosques aleatorios. Se explican los conceptos básicos del aprendizaje en conjunto, sus ventajas y por qué funciona. El bosque aleatorio, como método de aprendizaje integrado, está estrechamente relacionado con el embolsado, y su idea central y su proceso de implementación se explican en el artículo. También muestra en detalle cómo usar un bosque aleatorio para modelar en Sklearn e interpreta sus parámetros clave, con la esperanza de ayudarlo a usar un bosque aleatorio para modelar datos de manera más efectiva.

Finalmente, ¡gracias por leer este artículo! Si sientes que has ganado algo, no olvides darle me gusta, marcarlo y seguirme, esta es la motivación para mi creación continua. Si tiene alguna pregunta o sugerencia, puede dejar un mensaje en el área de comentarios, haré todo lo posible para responder y aceptar sus comentarios. Si hay un tema en particular que le gustaría conocer, hágamelo saber y estaré encantado de escribir un artículo al respecto. ¡Gracias por su apoyo y esperamos crecer con usted!

Traducción: [Breiman, L. (1996). Predictores de embolsado. Aprendizaje automático, 24(2), 123-140]( Predictores de embolsado (springer.com) )

Supongo que te gusta

Origin blog.csdn.net/Lvbaby_/article/details/132182610
Recomendado
Clasificación