随机森林案例介绍

本案例将使用随机森林算法来构建一个能够预测波士顿房屋价格的模型。随机森林是一种集成学习方法,通过组合多个决策树模型的预测结果,来进行分类或回归。它的优点包括可以处理高维数据、对异常值具有鲁棒性和可以估计变量重要性等。

算法原理

随机森林的原理基于决策树和装袋法(Bagging)。装袋法是一种集成学习技术,通过随机抽取原始数据的一个子集进行训练,并用这个子集训练的多个模型进行预测/分类。在随机抽取子集时,在模型训练过程中会引入随机性选择子集样本和特征。对于预测问题,随机森林将所有决策树的预测结果进行平均或投票,得到最终的预测结果。

随机森林算法的主要步骤如下:

  1. 从原始数据集中有放回地(自助采样)抽取N个样本,作为训练集。
  2. 对每个训练集,基于特征的随机子集创建一个决策树模型。
  3. 对于每个决策树,根据特定规则(如Gini系数)进行分裂,直到叶子节点上的样本属于同一类别或达到预定的树深度。
  4. 重复步骤1-3,构建多个决策树模型。
  5. 对于回归问题,将多个决策树的预测结果进行平均得到最终结果;对于分类问题,多数投票法决定最终结果。

公式推导

Gini系数

Gini系数可以用来衡量一个特征的纯度。对于给定的特征和阈值,Gini系数的计算如下:

$$
Gini(t) = 1- \sum_{i=1}^{c}(p(i|t))^2
$$

其中,$i$是当前的节点,$c$是类别的数量,$p(i|t)$是属于类别$i$的样本在节点t的比例。

随机森林预测

对于回归问题,随机森林预测的结果为所有决策树预测结果的平均。

$$
\hat{y} = \frac{1}{N}\sum_{i=1}^{N}y_i
$$

其中,$\hat{y}$是预测结果,N是决策树的数量,$y_i$是第i个决策树的预测结果。

对于分类问题,随机森林采用多数投票法来决定最终结果。

数据集

本案例使用波士顿房屋价格数据集,来进行随机森林模型的预测。数据集包含506个样本和13个特征,目标变量为房屋价格(连续值)。

计算步骤

  1. 载入数据集并进行划分为训练集和测试集。
  2. 建立随机森林模型,并进行训练。
  3. 使用模型进行预测,并计算预测性能指标。
  4. 可选:通过特征重要性分析,了解各个特征对于预测结果的重要性。

Python代码示例

# 导入所需的库
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt

# 载入数据集
from sklearn.datasets import load_boston
data = load_boston()
X = pd.DataFrame(data['data'], columns=data['feature_names'])  # 特征数据
y = data['target']  # 标签数据

# 数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 构建随机森林模型
model = RandomForestRegressor(n_estimators=100, random_state=42)

# 模型训练
model.fit(X_train, y_train)

# 模型预测
y_pred = model.predict(X_test)

# 计算模型性能指标
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print('均方误差(MSE):', mse)
print('决定系数(R2 Score):', r2)

# 特征重要性分析
importance = model.feature_importances_
indices = np.argsort(importance)[::-1]  # 重要性排序
features = X.columns

plt.figure()
plt.bar(range(X.shape[1]), importance[indices])
plt.xticks(range(X.shape[1]), features[indices], rotation=90)
plt.title("Feature Importance")
plt.show()

代码细节解释

  1. 使用load_boston函数从sklearn.datasets中载入波士顿房屋数据集。
  2. 利用train_test_split函数将数据集划分为训练集和测试集,比例为0.8:0.2。
  3. 创建RandomForestRegressor对象,并设置n_estimators参数为100,决定了随机森林中决策树的数量。
  4. 使用训练集数据调用fit方法来训练随机森林模型。
  5. 使用测试集数据调用predict方法进行预测。
  6. 使用mean_squared_errorr2_score分别计算均方误差和决定系数的值,作为衡量模型性能的指标。
  7. 利用feature_importances_属性获取随机森林模型中各个特征的重要性,通过绘制柱形图展示特征的重要性排名。

通过以上Python代码示例,我们可以利用随机森林算法对波士顿房屋价格数据集进行建模和预测,并通过特征重要性分析来了解各个特征对于价格的影响程度。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论(1)

  • cos大壮 2023年 12月 8日 下午7:01

    读取本地文件代码版本:

    import numpy as np
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.metrics import mean_squared_error, r2_score
    import matplotlib.pyplot as plt

    # 载入本地数据集
    file_path = ‘boston_housing.csv’ # 本地文件路径
    boston_df = pd.read_csv(file_path)

    # 分离特征和目标变量
    X = boston_df.drop(columns=boston_df.columns[-1])
    y = boston_df[boston_df.columns[-1]]

    # 数据集划分为训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    # 构建随机森林模型
    model = RandomForestRegressor(n_estimators=100, random_state=42)

    # 模型训练
    model.fit(X_train, y_train)

    # 模型预测
    y_pred = model.predict(X_test)

    # 计算模型性能指标
    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)

    print(‘均方误差(MSE):’, mse)
    print(‘决定系数(R2 Score):’, r2)

    # 特征重要性分析
    importance = model.feature_importances_
    indices = np.argsort(importance)[::-1] # 重要性排序
    features = X.columns

    plt.figure()
    plt.bar(range(X.shape[1]), importance[indices])
    plt.xticks(range(X.shape[1]), features[indices], rotation=90)
    plt.title(“Feature Importance”)
    plt.show()