文章目录
- 1.作者介绍
- 2.关于理论方面的知识介绍
- 2.1 背景介绍
- 2.1.1基本概念
- 2.1.2算法步骤
- 2.1.3优势
- 2.1.4劣势
- 2.1.5应用场景
- 2.1.6随机森林的重要变体
- 2.1.7相关理论
- 2.2随机森林算法架构
- 2.2.1 数据预处理与采样
- 2.2.2构建决策树
- 2.2.3决策树的训练
- 2.2.4集成模型
- 2.2.5 模型输出
- 2.3鲍鱼数据集介绍
- 3.关于实验过程的介绍,完整实验代码,测试结果
- 3.1数据集处理
- 3.1.1安装需要导入的模块:
- 3.1.2数据集划分
- 3.1.3训练参数设置
- 3.1.4运行代码输出结果
- 3.2问题分析
- 4. 附录(完整代码)
- 5.参考文献
1.作者介绍
郝浩,男,西安工程大学电子信息学院,2023级研究生
研究方向:输电线路绝缘子缺陷检测
电子邮件:2606801894@qq.com
孙思伟,男,西安工程大学电子信息学院,2023级研究生
研究方向:机器视觉与人工智能
电子邮件:sunsiwei0109@163.com
2.关于理论方面的知识介绍
2.1 背景介绍
随机森林(Random Forest)是一种集成学习方法,广泛应用于分类和回归任务。它是由Leo Breiman和Adele Cutler在2001年提出的,是基于决策树(Decision Tree)的组合模型。以下是随机森林算法的详细背景介绍:
2.1.1基本概念
随机森林通过构建多个决策树并结合其预测结果来提高模型的整体性能。它属于**Bagging(Bootstrap Aggregating)**方法的范畴。具体而言,随机森林通过以下两个主要步骤来创建多个不同的决策树:
Bootstrap采样:从原始训练集中有放回地随机抽取多个子集。
特征随机选择:在每个决策树的节点分裂时,随机选择一个特征子集进行最佳分裂,而不是使用所有特征。
2.1.2算法步骤
- 数据准备:从原始数据集创建多个Bootstrap样本,每个样本的大小与原始数据集相同。
- 构建决策树:对每个Bootstrap样本,构建一棵决策树。在构建过程中,节点的分裂仅在一个随机选择的特征子集上进行。
- 集成模型:将所有决策树的预测结果进行平均(回归任务)或投票(分类任务)以得到最终预测。
2.1.3优势
减少过拟合:单个决策树容易过拟合训练数据,而随机森林通过集成多个决策树来减少这种风险。
高准确性:由于结合了多个决策树的预测,随机森林通常比单个决策树更准确。
处理高维数据:随机选择特征使得它能有效处理高维数据集。
内置特征重要性评估:随机森林可以提供每个特征的重要性评分,有助于特征选择。
2.1.4劣势
计算开销较大:训练多个决策树和预测时的集成计算会耗费更多的资源。
解释性较差:相比单个决策树,随机森林的模型结构更为复杂,难以解释。
2.1.5应用场景
随机森林在许多领域有广泛的应用,包括但不限于:
金融领域:信用评分、股票市场预测
医疗领域:疾病预测、基因数据分析
市场营销:客户分类、销售预测
计算机视觉:图像分类、对象检测
2.1.6随机森林的重要变体
极端随机树(Extremely Randomized Trees, ExtraTrees):除了随机选择特征,还随机选择分裂点。
随机森林回归(Random Forest Regression):应用于回归任务。
2.1.7相关理论
Bagging:通过自助采样(Bootstrap)生成多个训练集,并对这些训练集分别训练模型,然后综合这些模型的预测结果。
决策树:一种树状结构的模型,利用特征的条件来进行数据分类或回归。
通过结合多个决策树,随机森林能够提高模型的泛化能力和稳定性,成为机器学习中非常重要且广泛应用的算法之一。
2.2随机森林算法架构
随机森林算法是一种集成学习方法,其架构由多棵独立的决策树组成。以下是随机森林算法的详细架构介绍:
2.2.1 数据预处理与采样
- 数据准备
原始数据集:包含特征(输入变量)和标签(输出变量)。 - Bootstrap采样
从原始数据集中有放回地随机抽取多个子集(Bootstrap样本),每个子集的大小与原始数据集相同。
2.2.2构建决策树
- 特征选择
在每个节点进行分裂时,从全部特征中随机选择一个特征子集(通常是总特征数的平方根)进行最佳分裂。 - 构建过程
对于每个Bootstrap样本,构建一棵决策树。
在构建过程中,使用特征子集来决定每个节点的分裂。
2.2.3决策树的训练
每棵决策树独立训练,不进行剪枝(Pruning),以确保每棵树的深度最大化,从而捕捉到训练数据中的更多模式。
2.2.4集成模型
- 集成预测
对于分类任务:每棵决策树进行投票预测,最终结果为投票数最多的类别。
对于回归任务:每棵决策树进行数值预测,最终结果为所有树预测值的平均值。
2.2.5 模型输出
最终模型由多棵决策树组成,集成了所有决策树的预测结果,从而提高整体模型的稳定性和准确性。
2.3鲍鱼数据集介绍
鲍鱼数据集可以从 UC Irvine 数据仓库中获得,其 URL:abalone.data。
此数据集数据以逗号分隔,没有列头。每个列的名字存在另外一个文件中。建立预测模型所需的数据包括性别、长度、直径、高度、整体重量、去壳后重量、脏器重量、壳的重量、环数。最后一列“环数”是十分耗时采获得的,需要锯开壳,然后在显微镜下观察得到。这是一个有监督机器学习方法通常需要的准备工作。基于一个已知答案的数据集构建预测模型,然后用这个预测模型预测不知道答案的数据。
本实验用Sklearn模块RandomForestRegressor类的对鲍鱼数据建立随机森林回归模型,然后用训练完成的模型测试一部分数据。
本示例采用鲍鱼数据集abalone.csv。本数据集有4178行9列。前8列表示特征,最后一列是鲍鱼的环数量,即是标签。部分数据如下表所示:
数据集应用场景:
鲍鱼数据集常用于以下机器学习任务:
回归分析:预测鲍鱼的年龄(环数)。
分类任务:将鲍鱼按年龄分组进行分类。
特征选择和工程:用于测试特征选择方法和工程技术。
算法评估:作为基准数据集评估机器学习算法的性能。
鲍鱼数据集因其简单且包含多种类型特征,成为机器学习入门和算法研究的理想选择。
3.关于实验过程的介绍,完整实验代码,测试结果
3.1数据集处理
3.1.1安装需要导入的模块:
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
3.1.2数据集划分
# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
3.1.3训练参数设置
# 初始化随机森林模型
rf = RandomForestRegressor(random_state=42)# 定义参数网格
param = {"n_estimators": [10, 20, 30, 40], "max_depth": [25, 35, 45]}# 初始化 GridSearchCV,减少折数
gc = GridSearchCV(rf, param_grid=param, cv=3)
3.1.4运行代码输出结果
C:\Software\anaconda3\envs\py310\python.exe D:\JupetyCode\machinelearning\鲍鱼年龄.py
Best Parameters: {'max_depth': 25, 'n_estimators': 40}
Best Score: 0.5344924150868674
Mean Squared Error: 5.25
R^2 Score: 0.52Actual Predicted Actual Age Predicted Age
866 9 12.075 10.5 13.575
1483 8 9.325 9.5 10.825
599 16 13.825 17.5 15.325
1702 9 10.650 10.5 12.150
670 14 13.075 15.5 14.575进程已结束,退出代码为 0
3.2问题分析
有时在自己找代码的时候,有些代码在加载数据集路径时提示需要csv格式的文件(也就是excel文件)此时我们需要把数据集data文件(word文件)格式转变,并且csv文件需要我们手动添加鲍鱼特征类别,如下图所示,否则代码运行时会识别不到特征类别。本文中直接用data文件即可。
4. 附录(完整代码)
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score# 模拟加载数据
abalone_data_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'
abalone_column_names = ['Sex', 'Length', 'Diameter', 'Height', 'Whole weight', 'Shucked weight', 'Viscera weight', 'Shell weight', 'Rings']
abalone = pd.read_csv(abalone_data_url, names=abalone_column_names)# 将 'Sex' 列的分类变量映射为数值变量
abalone["Sex"] = abalone["Sex"].map({"M": 0, "F": 1, "I": 2})# 分离特征和目标
X = abalone.drop("Rings", axis=1)
y = abalone["Rings"]# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 标准化特征值
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 初始化随机森林模型
rf = RandomForestRegressor(random_state=42)# 定义参数网格
param = {"n_estimators": [10, 20, 30, 40], "max_depth": [25, 35, 45]}# 初始化 GridSearchCV,减少折数
gc = GridSearchCV(rf, param_grid=param, cv=3)# 进行网格搜索
gc.fit(X_train, y_train)# 输出最佳参数和最佳得分
print(f"Best Parameters: {gc.best_params_}")
print(f"Best Score: {gc.best_score_}")# 使用最佳模型进行预测
best_model = gc.best_estimator_
y_pred = best_model.predict(X_test)# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)print(f"Mean Squared Error: {mse:.2f}")
print(f"R^2 Score: {r2:.2f}")# 查看预测结果和实际结果的对比
comparison = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})# 计算实际年龄和预测年龄
comparison['Actual Age'] = comparison['Actual'] + 1.5
comparison['Predicted Age'] = comparison['Predicted'] + 1.5# 打印对比结果
print(comparison.head())
5.参考文献
- Breiman, L. (2001). Random forests. Machine learning, 45(1), 5-32.
- Ho, T. K. (1995). Random decision forests. In Proceedings of the 3rd international conference on document analysis and recognition (Vol. 1, pp. 278-282). IEEE.