sklearn机器学习实战——随机森林回归与特征重要性分析全过程(附完整代码和结果图)

sklearn机器学习实战------随机森林回归与特征重要性分析全过程(附完整代码和结果图)

关于作者

作者:小白熊

作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。

联系邮箱 :xbx3144@163.com

科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~

1 引言

随机森林(Random Forest)是一种流行的集成学习方法,广泛应用于分类与回归任务中。其通过构建多个决策树,并将这些树的预测结果进行平均(对于回归任务)或投票(对于分类任务)来提升模型的准确性和稳健性。本文旨在通过加州房价数据集,介绍随机森林回归模型的完整训练过程,包含数据预处理、模型训练、模型评价、特征重要性分析等内容。

2 随机森林的理论基础

随机森林是一种基于决策树的集成学习算法。其主要思想是在训练过程中,通过随机选择特征子集来构建多个决策树,并利用这些树的结果进行投票或取均值。具体而言,随机森林的核心机制可以归纳为以下几点:

  • 多样性:每棵决策树在训练时,都会使用数据的一个随机子集,且每次分裂时使用的特征是随机选择的,这就使得不同的树有不同的决策结构,从而提高了模型的多样性和泛化能力。
  • 降低方差:单个决策树往往对训练数据过拟合,但通过集成大量的决策树,随机森林能够有效地降低方差,改善模型的泛化能力。
  • 高鲁棒性:由于随机森林通过集成多棵树的决策结果,避免了单一模型对某些噪声数据的过度敏感性,具备更高的鲁棒性。

3 数据集介绍

本文使用的加州房价数据集来自于sklearn库中的fetch_california_housing()函数。该数据集包含加州不同地区的房屋特征与对应的房价中位数,特征包括人口密度、平均房间数、区域收入等。本文通过该数据集构建随机森林回归模型,并预测房价。

python 复制代码
# 加载加州房价数据集
from sklearn.datasets import fetch_california_housing
data = fetch_california_housing()

4 数据预处理

在机器学习任务中,数据的预处理是非常关键的一步。包括处理缺失值、数据标准化以及数据集划分。

4.1 缺失值检测

需要检测数据集是否存在缺失值。本文使用isnull().sum()方法检查每个特征中的缺失值情况。代码如下:

python 复制代码
missing_values = df.isnull().sum()
print("缺失值检测结果:\n", missing_values)

如果数据集存在缺失值则需要进行填补操作。

4.2 数据标准化

由于数据中的各个特征可能具有不同的量纲,因此我们需要对数据进行标准化处理。标准化的目的是将不同量纲的特征转化为均值为0、方差为1的数据,从而消除量纲对模型的影响。本文使用StandardScaler()进行数据标准化:

python 复制代码
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

4.3 数据集划分

为了评估模型的性能,需要将数据集划分为训练集和验证集,验证集用于测试模型的泛化能力。本文使用train_test_split函数将数据集按8:2的比例进行划分:

python 复制代码
X_train, X_val, y_train, y_val = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

5 模型构建与训练

随机森林回归模型通过sklearn库中的RandomForestRegressor()函数进行构建。在本文中,我们设置决策树的数量为100,随机数种子为42,模型的构建和训练代码如下:

python 复制代码
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)

这里,n_estimators表示随机森林中决策树的数量,random_state为随机数种子,用于保证结果的可重复性。

6 十折交叉验证

为了确保模型的稳健性,本文采用了十折交叉验证(KFold Cross Validation)。十折交叉验证通过将数据分为10份,每次使用9份数据进行训练,1份数据进行验证,如此循环10次,取平均结果。代码如下:

python 复制代码
from sklearn.model_selection import KFold, cross_val_score
kf = KFold(n_splits=10, shuffle=True, random_state=42)
cv_scores = cross_val_score(rf_model, X_train, y_train, cv=kf, scoring='neg_mean_squared_error')
print(f"十折交叉验证MSE: {np.mean(-cv_scores)}")

通过交叉验证,我们能够避免因数据划分带来的偶然性影响,确保模型性能的稳定性。

7 模型评估

在验证集上,我们计算以下四个常用的回归评估指标:

  • MSE(均方误差):衡量模型预测值与真实值之间的平均平方误差。
  • MAE(平均绝对误差):衡量预测值与真实值之间的平均绝对差距。
  • RMSE(均方根误差):MSE的平方根,表示模型的平均误差大小。
  • R²(决定系数) :衡量模型的解释能力,取值范围为0到1,值越接近1表示模型越优。

计算代码如下:

python 复制代码
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

y_val_pred = rf_model.predict(X_val)
mse_val = mean_squared_error(y_val, y_val_pred)
mae_val = mean_absolute_error(y_val, y_val_pred)
rmse_val = np.sqrt(mse_val)
r2_val = r2_score(y_val, y_val_pred)

print(f"MSE (验证集): {mse_val}")
print(f"MAE (验证集): {mae_val}")
print(f"RMSE (验证集): {rmse_val}")
print(f"R² (验证集): {r2_val}")

通过这些评价指标,我们可以综合评估模型的预测效果:

并利用回归图进行模型可视化:

python 复制代码
# 绘制回归图
plt.figure(figsize=(10,6))
sns.regplot(x=y_val, y=y_val_pred, scatter_kws={'s':10}, line_kws={'color':'red'})
plt.xlabel("真实值")
plt.ylabel("预测值")
plt.title("验证集-回归图")
plt.show()

8 特征重要性分析

特征重要性反映了每个特征对模型预测结果的贡献度。通过随机森林的feature_importances_属性,我们可以获得每个特征的重要性分数,并进行可视化分析:

python 复制代码
importances = rf_model.feature_importances_
indices = np.argsort(importances)[::-1]

# 可视化特征重要性
plt.figure(figsize=(10, 6))
sns.barplot(x=importances[indices], y=np.array(data.feature_names)[indices])
plt.title('Feature Importances in Random Forest Model')
plt.show()

通过特征重要性分析,我们可以发现哪些特征对房价预测有较大影响:

9 完整代码

python 复制代码
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.datasets import fetch_california_housing
import matplotlib.pyplot as plt
import seaborn as sns
import warnings

warnings.filterwarnings("ignore")

# 设置中文字体为SimHei
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# 加载加州房价数据集
data = fetch_california_housing()

# 数据转换
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = data.target

# 检测缺失值
missing_values = df.isnull().sum()
print("缺失值检测结果:\n", missing_values)

# 数据提取
X = df.drop('Target', axis=1)
y = df['Target']

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

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

# 十折交叉验证
kf = KFold(n_splits=10, shuffle=True, random_state=42)
cv_scores = cross_val_score(rf_model, X_train, y_train, cv=kf, scoring='neg_mean_squared_error')
print(f"十折交叉验证MSE: {np.mean(-cv_scores)}")

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

# 模型预测
y_val_pred = rf_model.predict(X_val)

# 计算评价指标
mse_val = mean_squared_error(y_val, y_val_pred)
mae_val = mean_absolute_error(y_val, y_val_pred)
rmse_val = np.sqrt(mse_val)
r2_val = r2_score(y_val, y_val_pred)

print(f"MSE (验证集): {mse_val}")
print(f"MAE (验证集): {mae_val}")
print(f"RMSE (验证集): {rmse_val}")
print(f"R^2 (验证集): {r2_val}")

# 绘制回归图
plt.figure(figsize=(10,6))
sns.regplot(x=y_val, y=y_val_pred, scatter_kws={'s':10}, line_kws={'color':'red'})
plt.xlabel("真实值")
plt.ylabel("预测值")
plt.title("验证集-回归图")
plt.show()


# 特征重要性分析
importances = rf_model.feature_importances_
indices = np.argsort(importances)[::-1]

# 可视化特征重要性
plt.figure(figsize=(10, 6))
sns.barplot(x=importances[indices], y=np.array(data.feature_names)[indices])
plt.title('随机森林特征重要性分析')
plt.show()

结束语

本文通过加州房价数据集,详细介绍了如何使用随机森林回归进行预测。首先进行数据预处理和标准化,然后构建了随机森林回归模型,并使用十折交叉验证评估了模型的性能,最终通过多种评估指标对模型进行评价。此外,我们还分析了各个特征的重要性,进一步解释了模型的决策依据。随机森林凭借其鲁棒性与优秀的泛化能力,在回归任务中表现出了良好的预测效果。希望文章对你有所帮助!如果有任何疑问或建议,欢迎在评论区留言!

相关推荐
Eward-an几秒前
AI视觉赋能汽车零部件质检:迁移科技Epic Eye系统落地案例(技术深度解析)
人工智能·科技·汽车
wuxuand2 分钟前
2026时序分类综述A Comprehensive Review of Time Series Classification
人工智能·深度学习·分类·数据挖掘
bubiyoushang8886 分钟前
基于PSO的列车速度优化MATLAB实现
开发语言·人工智能·matlab
LX5677712 分钟前
AI培训成本高、风险大,怎么控制?
人工智能
lisw0515 分钟前
当前AI科学基本问题的梳理与评价!
人工智能·深度学习·机器学习
骇客野人15 分钟前
机器学习线性回归算法是入门机器学习理解人工智能模型很好示例
人工智能·算法·机器学习
aiguangyuan17 分钟前
多模态AI实战:CLIP模型原理与代码深度剖析
人工智能·python·机器学习·nlp
大强同学19 分钟前
ai-pair:多智能体协同干活
人工智能·ai编程
十铭忘21 分钟前
GAN(生成对抗网络)和博弈论发展历史与研究者
人工智能·神经网络·生成对抗网络
大力财经22 分钟前
百度“养虾”,一场AI入口闪电战
人工智能·百度