1.随机森林多分类模型
1.1 基本原理
随机森林(Random Forest)是一种基于决策树的集成学习方法,它通过将多个决策树进行组合,以投票或平均的方式得到最终的预测结果。在多分类问题中,随机森林通过构建多个决策树,每个决策树都对数据进行分类预测,最终通过多数投票的方式确定样本所属的类别。本文将对随机森林多分类模型的原理进行详细介绍,内容将分为数据准备、随机抽样、决策树构建、随机森林构建和模型评估等部分。
1.2 数据准备
随机森林模型的构建首先需要准备好用于训练和测试的数据集。数据集应包含特征和标签,其中特征是用于预测标签的变量,标签是我们要预测的变量。在多分类问题中,标签通常表示不同的类别。数据集应被分为训练集和测试集,通常是将数据集的70%用于训练,30%用于测试。这样可以确保模型在训练过程中学习到数据的特征,同时在测试集上评估模型的性能。
1.3 随机抽样
随机森林模型的核心思想之一是随机抽样。在每个决策树的训练过程中,我们随机选择一部分特征和样本进行训练,以减少过拟合的风险。这个过程被称为“随机抽样”。具体来说,随机抽样包括两个方面的随机性:
- 样本随机性:从原始数据集中随机选择一定数量的样本(有放回抽样),构建一棵决策树。这样,每棵决策树都是基于不同的样本子集进行训练的,从而增加了树之间的多样性。
- 特征随机性:在每个节点上,随机选择一部分特征子集,并基于这些特征进行最优划分。这个过程也被称为“特征袋外”(Feature Bagging)。通过随机选择特征子集,可以减少决策树之间的相关性,提高模型的泛化能力。
1.4 决策树构建
图1-1 决策树构建
在随机抽样之后,我们可以开始构建决策树。决策树是一种树形结构,其中每个节点代表一个特征,每个叶子节点代表一个类别。在构建决策树时,我们使用训练集中的数据来确定每个节点的最佳特征和最佳分割点。具体过程如下:
- 从根节点开始,选择一个特征作为当前节点的分裂特征。分裂特征的选择基于信息增益、基尼指数等准则,这些准则用于衡量特征对分类结果的影响程度。
- 根据选定的分裂特征,将训练集划分为两个或多个子集。每个子集对应于分裂特征的一个取值范围或类别。
- 对每个子集递归地执行步骤1和步骤2,直到满足停止条件(如树的最大深度、叶子节点中的最小样本数等)。在递归过程中,每个节点都基于其对应的训练子集进行最优划分。
- 当满足停止条件时,将当前节点作为叶子节点,并根据该节点对应的训练子集中样本的类别分布情况,确定该叶子节点的类别标签。对于多分类问题,通常选择样本数最多的类别作为叶子节点的类别标签。
1.5 随机森林构建
图1-2 随机森林构建
随机森林是由多个决策树组成的集成模型。在构建随机森林时,我们需要选择决策树的数量(即森林中树的数量)和每个决策树的最大深度等参数。这些参数的选择通常基于经验或交叉验证等方法来确定。具体来说,随机森林的构建过程如下:
- 重复执行随机抽样和决策树构建的过程,构建多棵决策树。每棵决策树都是基于不同的样本子集和特征子集进行训练的,从而保证了树之间的多样性。
- 当所有决策树都构建完成后,将它们组合成一个随机森林模型。在预测时,将待预测样本输入到随机森林中,每棵决策树都会给出一个预测结果(即样本所属的类别)。
- 最后,通过多数投票的方式确定待预测样本的最终类别。具体来说,对每个类别统计其在所有决策树中的预测次数(即投票数),并选择投票数最多的类别作为最终预测结果。
1.6 模型评估
为了评估随机森林模型的性能,我们可以使用测试集来计算模型的准确率、精确率、召回率和F1分数等指标。此外,我们还可以使用ROC曲线和AUC值等指标来评估模型的分类效果。如果模型的性能不够好,我们可以调整模型的参数(如决策树的数量、每个决策树的最大深度等)或增加更多的决策树来提高模型的性能。同时,随机森林模型还可以提供特征重要性评估。通过计算每个特征在随机森林中被用来划分节点的次数或平均信息增益等指标,我们可以评估特征对分类结果的重要性程度。这对于特征选择和模型优化非常有用。
综上,随机森林多分类模型通过构建多个基于随机抽样的决策树,并通过多数投票的方式确定样本所属的类别,从而实现了对多分类问题的有效预测。该模型具有泛化能力强、能够处理高维数据、对噪声和异常值不敏感等优点,在分类问题中得到了广泛应用。通过合理设置模型的参数和进行特征重要性评估,我们可以进一步提高模型的性能和解释性。
2.代码与运行结果
2.1 数据加载与预处理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 忽略Matplotlib的警告(可选)
import warnings
warnings.filterwarnings("ignore")
# 设置Matplotlib的字体属性
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于中文显示,你可以更改为其他支持中文的字体
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 加载数据
df = pd.read_excel('污染物浓度数据.xlsx')
# 将“质量等级”一列转换为数字
mapping = {'优': 1, '良': 2, '轻度污染': 3, '中度污染': 4, '重度污染': 5, '严重污染': 6}
df['质量等级'] = df['质量等级'].map(mapping).fillna(0) # 假设没有'严重污染'等级,用0填充非映射值
# 检测并处理缺失值
# 这里假设NaN表示缺失值
print(df.isnull().sum()) # 检测缺失值
# 可视化缺失值
import missingno as msno
msno.matrix(df)
# 删除包含缺失值的行(这里仅作为示例,实际中可能需要根据业务逻辑处理)
df = df.dropna()
# 检测重复值
print(df.duplicated().sum())
# 删除重复的行(如果有的话)
df = df.drop_duplicates()
运行结果:
图2-1
2.2 数据分布可视化
plt.figure(figsize=(20, 10))
for i, feature in enumerate(df.columns, 1):
plt.subplot(3, len(df.columns)-7, i)
sns.histplot(df[feature], kde=True, bins=30, label=feature,color='black')
plt.title(f'{feature}的数据分布', fontsize=20, color='y')
# 如果需要设置坐标轴标签的字体大小和颜色
plt.xlabel('X-axis Label', fontsize=15, color='blue') # 设置x轴标签的字体大小和颜色
plt.ylabel('Y-axis Label', fontsize=20, color='green') # 设置y轴标签的字体大小和颜色
# 还可以调整刻度线的长度、宽度等属性
plt.tick_params(axis='x', labelsize=20, colors='red', length=5, width=1) # 设置x轴刻度线、刻度标签的更多属性
plt.tick_params(axis='y', labelsize=20, colors='deepskyblue', length=5, width=1) # 设置y轴刻度线、刻度标签的更多属性
plt.tight_layout()
plt.show()
运行结果:
图2-2
2.3随机森林多分类模型建立与训练
2.3.1模型建立与训练
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
# 准备数据
X = df[['年','月','日','PM10', 'O3', 'SO2', 'PM2.5', 'NO2', 'CO', 'AQI']]
y = df['质量等级']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 拟合分类模型
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
# 评估模型
print(classification_report(y_test, y_pred))
# 打印混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(cm)
运行结果:
图2-3
由图2-3中模型评估报告可以看出准确率达到100%。
2.3.2 预测结果可视化
plt.figure(figsize=(7, 6))
sns.heatmap(df_cm, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()
运行结果:
图2-4
从图2-4的混淆矩阵也可以看出准确率达到100%。
plt.figure(figsize=(6,3))
plt.subplot(1, 2, 1)
sns.histplot(y_test, kde=True,color='blue', label='Truth')
plt.title('Distribution of Truth')
plt.xlabel('Quality Level')
plt.ylabel('Count')
plt.subplot(1, 2, 2)
sns.histplot(y_pred, kde=True, color='orange', label='Prediction')
plt.title('Distribution of Prediction')
plt.xlabel('Quality Level')
plt.ylabel('Count')
plt.tight_layout()
plt.show()
运行结果:
图2-5
2.3 分类预测
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
# 加载test.xls数据
test_df = pd.read_excel('test.xls')
# 预处理测试数据以匹配训练数据
X_test_actual = test_df[['年','月','日','PM10', 'O3', 'SO2', 'PM2.5', 'NO2', 'CO', 'AQI']]
# 使用模型进行预测
y_test_pred = clf.predict(X_test_actual)
print(y_test_pred)
sns.histplot(y_test_pred, kde=True, color='black', label='Prediction')
plt.title('Distribution of Prediction')
plt.xlabel('Quality Level')
plt.ylabel('Count')
plt.tight_layout()
plt.show()
运行结果:
图2-6