首页 > 其他分享 >【机器学习(三)】分类和回归任务-随机森林-Sentosa_DSML社区版

【机器学习(三)】分类和回归任务-随机森林-Sentosa_DSML社区版

时间:2024-09-11 13:54:11浏览次数:3  
标签:模型 test 随机 Sentosa DSML 森林

文章目录

一、算法概念

什么是随机森林?
  随机森林是一种常用的机器学习算法,它将多个决策树的输出组合起来以得出一个结果,可以处理分类和回归问题。
在这里插入图片描述
  虽然决策树是常见的监督学习算法,但它们容易出现偏差和过度拟合等问题。然而,当多棵决策树在随机森林算法中形成一个整体时,它们会预测更准确的结果,尤其是当各个树彼此不相关时。
  集成学习(ensemble learning)是一种通过组合多个基学习器(模型)来提高整体预测性能的方法。它通过集成多个学习器形成一个强学习器,从而提高模型的泛化能力和准确性。集成学习的核心思想是利用不同模型的组合弥补单一模型的缺点。集成学习可以分为两大类,一类是序列化方法:个体学习器之间存在强依赖关系,必须串行生成,例如boosting;一类是并行化方法:个体学习器之间不存在强依赖关系、可以同时生成,例如bagging(也称为bootstrap聚合)。bagging 方法中,会替换地选择训练集中的随机数据样本,这意味着可以多次选择单个数据点。生成多个数据样本后,将独立训练这些模型,并且根据任务类型(即回归或分类),这些预测的平均值或大多数会得出更准确的估计值。这种方法通常用于减少嘈杂数据集中的方差。
  随机森林算法是bagging方法的扩展,因为它同时利用bagging和特征随机性来创建不相关的决策树森林。特征随机性也称为特征bagging或“随机子空间方法”(链接位于ibm.com之外),可生成随机的特征子集,从而确保决策树之间的相关性较低。这是决策树和随机森林之间的一个关键区别。决策树会考虑所有可能的特征分割,而随机森林只会选择这些特征的一个子集,通过考虑数据中的所有潜在变异性,我们可以降低过度拟合、偏差和整体方差的风险,从而得到更精确的预测。算法如下:
在这里插入图片描述

二、算法原理

  随机森林算法有三个主要超参数,需要在训练之前设置。

  • 节点大小:每棵树分裂到叶节点之前的最小样本数,控制树的深度。
  • 树的数量:随机森林中包含的决策树的数量,更多的树通常能够提高模型的稳定性和准确性。
  • 采样的特征数量:每次分裂时随机选择的特征数量,这决定了每棵树的多样性。

  随机森林由多棵决策树组成,每棵树通过在训练集中有放回地抽取样本来构建。由于抽取样本时存在放回的情况,同一个样本可能会被多次选中(称为引导样本)。在每次抽取时,大约三分之一的数据不会被选为训练样本,这部分数据被称为袋外样本(OOB)。袋外样本可以用于评估模型的性能,而不需要额外划分测试集,随机森林的误差近似为训练过程中的袋外误差。

  每棵树都是基于不同的引导样本构建的,因此每个引导样本会随机遗漏大约三分之一的观察值。这些遗漏的观察值即为该树的OOB样本。寻找能降低OOB误差的模型参数是模型选择和参数调整的关键环节之一。在随机森林算法中,预测变量子集的大小决定了树的最终深度,因此是模型调优过程中需要调整的重要参数。随机森林在回归和分类任务中的预测方式有所不同:

  • 回归任务:通过对所有决策树的预测结果进行平均,得到最终的预测值。
  • 分类任务:通过多数投票法,选择所有决策树中预测次数最多的类别作为最终结果。

  最后,随机森林通过袋外样本来评估模型性能,这相当于一种交叉验证,不需要额外的数据集,从而更高效地利用了数据。
随机森林是基于决策树的集成,每棵树都取决于随机变量的集合。对于表示实值输入或预测变量的p维随机向量:
在这里插入图片描述
  其中,随机变量Y表示要预测的目标变量,也叫响应变量。它可以是连续的(比如房价、气温)或者离散的(比如分类任务中的类别标签)。我们假设未知的联合分布。目标是找到一个预测函数f(X)来预测Y。该预测函数由损失函数确定,并定义为最小化损失的期望值:
在这里插入图片描述
  随机森林通过多个决策树的集成预测,目的是通过最小化某个损失函数来寻找最优的预测函数f(X),使其能够对未知的目标变量Y进行准确预测。

(一)定义

  正如本节前面提到的,随机森林使用树 ( h j ( X , Θ j ) ) ( h_j(X, \Theta_j) ) (hj​(X,Θj​)) 作为基础学习器。对于训练数据 D = { ( x 1 , y 1 ) , … , ( x N , y N ) } D = \{(x_1, y_1), \dots , (x_N, y_N)\} D={(x1​,y1​),…,(xN​,yN​)},其中 x i = ( x i , 1 , … , x i , p ) T x_i = (x_{i,1}, \dots , x_{i,p})^T xi​=(xi,1​,…,xi,p​)T 表示第 p p p个预测变量, y i y_i yi​表示响应变量。对于特定的参数实现 θ j \theta_j θj​,拟合的树可以表示为 h ^ j ( x , θ j , D ) \hat{h}_j(x, \theta_j, D) h^j​(x,θj​,D)。实际上,随机森林中的随机因素 θ j \theta_j θj​并未被显式考虑,而是通过两种方式隐式地注入了随机性。
  首先,与装袋法类似,每棵树都是通过从原始数据中独立抽取的引导样本来训练的。自举抽样过程中的随机性构成了 θ j \theta_j θj​ 的一部分。其次,在节点分割时,最佳分割是基于每个节点上独立随机选择的 m m m个预测变量子集,而不是基于全部 p p p个变量。这种对预测变量进行采样的随机化构成了 θ j \theta_j θj​的剩余部分。
这些树在生成时不经过修剪。最初,Breiman建议树的生长应持续到终端节点完全纯净(用于分类任务),或每个终端节点的数据点数量少于预设阈值(用于回归任务)。也可以通过控制终端节点的最大数量来限制树的复杂度。
如果响应变量是分类类型,随机森林通过未加权投票组合树的结果;如果响应变量是连续值(回归任务),则通过未加权平均的方式结合各棵树的结果。算法过程如下:
在这里插入图片描述
  算法中,在新节点时分类任务的预测值为:
             f ^ ( x ) = 1 J ∑ j = 1 J h ^ j ( x ) \hat{f}(x) = \frac{1}{J} \sum_{j=1}^{J} \hat{h}_j(x) f^​(x)=J1​∑j=1J​h^j​(x)
  回归任务的预测值为:
          f ^ ( x ) = arg ⁡ max ⁡ y ∑ j = 1 J I ( h ^ j ( x ) = y ) \hat{f}(x) = \arg\max_y \sum_{j=1}^{J} I\left( \hat{h}_j(x) = y \right) f^​(x)=argmaxy​∑j=1J​I(h^j​(x)=y)
  其中 h ^ j ( x ) \hat{h}_j(x) h^j​(x)是使用第j棵树对x处响应变量的预测

(二)袋外数据

  当从数据集中抽取引导样本(Bootstrap sample)时,有些数据点不会被选择进入这个引导样本,这些未被选中的数据点称为“袋外数据”(Out-of-Bag data, OOB)。袋外数据在评估模型的泛化误差和变量的重要性方面非常有用。
  为了估计模型的泛化误差,我们需要意识到,如果我们使用所有训练集中参与构建模型的树来预测训练集上的结果,可能会得到过于乐观的预测结果。因为这些树在训练过程中已经“见过”这些数据点,导致模型在训练集上表现得更好。
  因此,为了更准确地估计泛化误差,我们采用“袋外数据”的方法,即对于训练集中某个观测值的预测,只使用那些没有包含该观测值的树来完成预测。这样的预测称为“袋外预测”,因为它们使用的是模型在未见过的样本上的表现,能够更好地反映模型在新数据上的泛化能力。算法流程如下所示:
在这里插入图片描述
  对于具有平方误差损失的回归任务,通常使用袋外均方误差 (MSE) 来估计泛化误差:
         MSE oob = 1 N ∑ i = 1 N ( y i − f ^ oob ( x i ) ) 2 \text{MSE}_{\text{oob}} = \frac{1}{N} \sum_{i=1}^{N} \left( y_i - \hat{f}_{\text{oob}}(x_i) \right)^2 MSEoob​=N1​∑i=1N​(yi​−f^​oob​(xi​))2
  其中,
   MSE oob \text{MSE}_{\text{oob}} MSEoob​表示袋外均方误差(Mean Squared Error of Out-of-Bag。
   1 N \frac{1}{N} N1​是对所有 N 个观测点进行平均
   y i y_i yi​是真实的目标值,
   f ^ oob ( x i ) \hat{f}_{\text{oob}}(x_i) f^​oob​(xi​)是第 i 个观测点的袋外预测值。
   ( y i − f ^ oob ( x i ) ) 2 ( y_i - \hat{f}_{\text{oob}}(x_i) )^2 (yi​−f^​oob​(xi​))2是预测误差的平方。

  对于零一损失的分类任务,使用袋外错误率来估计泛化错误率:
           E oob = 1 N ∑ i = 1 N I ( y i ≠ f ^ oob ( x i ) ) E_{\text{oob}} = \frac{1}{N} \sum_{i=1}^{N} I(y_i \neq \hat{f}_{\text{oob}}(x_i)) Eoob​=N1​∑i=1N​I(yi​=f^​oob​(xi​))
  其中,使用袋外预测的错误率。这使我们能够获得每个类别的分类错误率,以及通过交叉制表 y i y_i yi​和 1 N \frac{1}{N} N1​获得袋外“混淆矩阵”,当两函数不相等时,函数值为 1,否则为 0。

三、随机森林的优缺点

(一)优点

  • 可以出来很高维度(特征很多)的数据,并且不用降维,
  • 无需做特征选择
  • 可以判断出不同特征之间的相互影响 不容易过拟合
  • 训练速度比较快,容易做成并行方法 实现起来比较简单 对于不平衡的数据集来说,它可以平衡误差。
  • 如果有很大一部分的特征遗失,仍可以维持准确度。

(二)缺点

  • 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。
  • 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。

四、随机森林分类任务实现对比

  主要根据模型搭建的流程,对比传统代码方式和利用Sentosa_DSML社区版完成机器学习算法时的区别。

(一)数据加载

1、Python代码

import pandas as pd
# 读取数据集
df = pd.read_csv("D:/sentosa_ML/Sentosa_DSML/mlServer/TestData/Iris.csv")
# 查看数据前五行
df.head()

2、Sentosa_DSML社区版

  利用文本读入算子读取数据
在这里插入图片描述
  右键预览可以看到每一步处理后的数据。
在这里插入图片描述

(二)样本分区

1、Python代码

# 编码标签
le_y = LabelEncoder()
df["Species"] = le_y.fit_transform(df["Species"])

# 将数据集划分为特征和标签
X = df.drop("Species", axis=1)  # 特征
Y = df["Species"]  # 标签

# 划分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)

2、Sentosa_DSML社区版

  连接样本分区算子,并设置训练集和测试集的样本比例
在这里插入图片描述
  样本分区完成后,利用类型算子将设为标签列

(三)模型训练

1、Python代码

# 训练随机森林分类器
clf1 = RandomForestClassifier(n_estimators=500, n_jobs=-1, max_depth=5, oob_score=True, random_state=42)
clf1.fit(X_train, Y_train)

# 预测测试集上的标签
pred_y_test = clf1.predict(X_test)

2、Sentosa_DSML社区版

  连接随机森林分类模型,设置模型参数,并执行。
在这里插入图片描述
  训练完成后可以得到随机森林分类模型。
在这里插入图片描述

(四)模型评估

1、Python代码

# 计算测试集的准确率
test_score = accuracy_score(Y_test, pred_y_test)
print(f"Testing Accuracy: {test_score}")

# 计算加权的Precision, Recall, F1分数
precision, recall, f1, _ = precision_recall_fscore_support(Y_test, pred_y_test, average='weighted')
print(f"Weighted Precision: {precision}")
print(f"Weighted Recall: {recall}")
print(f"F1 Score: {f1}")

# 计算混淆矩阵
cm = confusion_matrix(Y_test, pred_y_test)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=le_y.classes_, yticklabels=le_y.classes_)

2、Sentosa_DSML社区版

  连接评估算子,对模型进行评估。
在这里插入图片描述
  得到训练集的评估结果
在这里插入图片描述
  测试集的评估结果
在这里插入图片描述
  连接混淆矩阵算子,计算模型混淆矩阵。
在这里插入图片描述
  训练集的混淆矩阵
在这里插入图片描述
  测试集的混淆矩阵
在这里插入图片描述

(五)模型可视化

1、Python代码

# 可视化特征重要性
importances = clf1.feature_importances_
indices = np.argsort(importances)[::-1]

plt.figure(figsize=(10, 6))
plt.title("Feature Importances")
plt.bar(range(X.shape[1]), importances[indices], align="center")
plt.xticks(range(X.shape[1]), X.columns[indices], rotation=45)
plt.tight_layout()
plt.show()

在这里插入图片描述

2、Sentosa_DSML社区版

  右键模型信息,即可查看模型特征重要性图,决策树可视化等信息,特征重要性图如下所示:
在这里插入图片描述
  随机森林构建过程可视化:
在这里插入图片描述
  决策树1:
在这里插入图片描述
  决策树2:在这里插入图片描述
  决策树3:
在这里插入图片描述

五、随机森林回归任务实现对比

(一)数据加载、样本分区和特征标准化

1、Python代码

# 读取数据集
df = pd.read_csv("D:/sentosa_ML/Sentosa_DSML/mlServer/TestData/winequality.csv")

# 数据集的形状
print(f"Dataset shape: {df.shape}")

# 将数据集划分为特征和标签
X = df.drop("quality", axis=1) 
Y = df["quality"] 

# 划分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)

# 标准化特征
sc_x = StandardScaler()
X_train = sc_x.fit_transform(X_train)
X_test = sc_x.transform(X_test)  

2、Sentosa_DSML社区版

  读取数据、样本分区和类型算子操作流程如上节所示,然后,利用标准化算子对数据特征进行处理
在这里插入图片描述
  执行得到标准化模型
在这里插入图片描述

(二)模型训练

1、Python代码

# 训练随机森林回归器
regressor = RandomForestRegressor(n_estimators=500, max_depth=10, random_state=64, n_jobs=-1)
regressor.fit(X_train, Y_train)

# 预测测试集上的标签
y_pred = regressor.predict(X_test)

2、Sentosa_DSML社区版

  连接随机森林回归算子,设置随机森林算子的参数配置。
在这里插入图片描述
  执行得到随机森林回归模型
在这里插入图片描述

(三)模型评估

1、Python代码

# 计算评估指标
r2 = r2_score(Y_test, y_pred)
mae = mean_absolute_error(Y_test, y_pred)
mse = mean_squared_error(Y_test, y_pred)
rmse = np.sqrt(mse)
mape = np.mean(np.abs((Y_test - y_pred) / Y_test)) * 100
smape = 100 / len(Y_test) * np.sum(2 * np.abs(Y_test - y_pred) / (np.abs(Y_test) + np.abs(y_pred)))

# 打印评估结果
print(f"R²: {r2}")
print(f"MAE: {mae}")
print(f"MSE: {mse}")
print(f"RMSE: {rmse}")
print(f"MAPE: {mape}%")
print(f"SMAPE: {smape}%")

2、Sentosa_DSML社区版

  连接评估算子对随机森林回归模型进行评估
在这里插入图片描述
  训练集评估结果
在这里插入图片描述
  测试集评估结果
在这里插入图片描述

(四)模型可视化

1、Python代码

# 可视化特征重要性
importances = regressor.feature_importances_
indices = np.argsort(importances)[::-1]

plt.figure(figsize=(10, 6))
plt.title("Feature Importances")
plt.bar(range(X.shape[1]), importances[indices], align="center")
plt.xticks(range(X.shape[1]), X.columns[indices], rotation=45)
plt.tight_layout()
plt.show()

在这里插入图片描述

2、Sentosa_DSML社区版

  右键模型信息,即可查看模型特征重要性图,决策树可视化等信息:
在这里插入图片描述
在这里插入图片描述

六、总结

  相比传统代码方式,利用Sentosa_DSML社区版完成机器学习算法的流程更加高效和自动化,传统方式需要手动编写大量代码来处理数据清洗、特征工程、模型训练与评估,而在Sentosa_DSML社区版中,这些步骤可以通过可视化界面、预构建模块和自动化流程来简化,有效的降低了技术门槛,非专业开发者也能通过拖拽和配置的方式开发应用,减少了对专业开发人员的依赖。
  Sentosa_DSML社区版提供了易于配置的算子流,减少了编写和调试代码的时间,并提升了模型开发和部署的效率,由于应用的结构更清晰,维护和更新变得更加容易,且平台通常会提供版本控制和更新功能,使得应用的持续改进更为便捷。

  为了非商业用途的科研学者、研究人员及开发者提供学习、交流及实践机器学习技术,推出了一款轻量化且完全免费的Sentosa_DSML社区版。以轻量化一键安装、平台免费使用、视频教学和社区论坛服务为主要特点,能够与其他数据科学家和机器学习爱好者交流心得,分享经验和解决问题。文章最后附上官网链接,感兴趣工具的可以直接下载使用

https://sentosa.znv.com/
在这里插入图片描述

标签:模型,test,随机,Sentosa,DSML,森林
From: https://blog.csdn.net/qq_45586013/article/details/142137933

相关文章

  • 探索Go语言中的随机数生成、矩阵运算与数独验证
    1.Go中的随机数生成在许多编程任务中,随机数的生成是不可或缺的。Go语言通过math/rand包提供了伪随机数生成方式。伪随机数由种子(seed)决定,如果种子相同,生成的数列也会相同。为了确保每次程序运行时产生不同的随机数,我们通常使用当前时间作为种子。示例1:简单的随机数生......
  • 手动用梯度下降法和随机梯度下降法实现一元线性回归
    手动用梯度下降法实现一元线性回归实验目的本次实验旨在通过手动实现梯度下降法和随机梯度下降法来解决一元线性回归问题。具体目标包括:生成训练数据集,并使用matplotlib进行可视化。设计一个`LinearModel`类来实现一元线性回归的批量梯度下降法。使用matplotlib显示拟合结果......
  • jmeter通过beanshell中脚本实现随机获取某天(“yyyy-MM-dd HH:mm:ss“)前1周,一个月,一
    在接口测试中,请求参数中涉及时间的参数可能不是固定死的,因此jmeter想通过beanshell中脚本实现随机获取某天(statusTimeEnd(“yyyy-MM-ddHH:mm:ss”))前1周,一个月,一个季度,半年的时间0点,其中statusTimeEnd的值在用户参数中已配置。参考JMeter性能测试实战的方法:http://lit......
  • 随机生成数字
    /***随机生成数字**示例:生成长度为12的随机数:randomNumber(12)*示例:生成3~23之间的随机数:randomNumber(3,23)**@param1最小值|长度*@param2最大值*@returnint生成后的数字*/exportfunctionrandomNumber(){//生成最小值到最大值区......
  • 第十六讲:如何正确地显示随机消息?
    第十六讲:如何正确地显示随机消息?简概引入​ 我在上一篇文章,为你讲解完orderby语句的几种执行模式后,就想到了之前一个做英语学习App的朋友碰到过的一个性能问题。​ 今天这篇文章,我就从这个性能问题说起,和你说说MySQL中的另外一种排序需求,希望能够加深你对MySQL排序......
  • 【多样化的思想】随机测试
    多样化通常是一件好事。为什么我们这么强调物种多样性,投入那么多人力物力财力去保护濒危的动植物?就是因为,只有保持物种的多样性,生态环境才能稳定和平衡。1956年,我国把麻雀列为四害之一,号召全民灭雀,保护粮食。全国各族人民热情高涨,积极响应,尤其是小朋友们,当时有一首诗是这么......
  • 随机过程
    培养OI直觉那么大的组合数根本不可做。当然有的时候你的确能把类似的大数消掉,但是你用心感受一下,在这道题中,你觉得后续真的有机会把它消掉吗?所谓条条大路通罗马,在OI中常常是行不通的。通过之前的训练,你其实也知道一条路走不通很可能是大方向就完全错了。但在赛时,你的临场体验其......
  • 【机器学习】马尔可夫随机场的基本概念、和贝叶斯网络的联系与对比以及在python中的实
    引言马尔可夫随机场(MarkovRandomField,简称MRF)是一种用于描述变量之间依赖关系的概率模型,它在机器学习和图像处理等领域有着广泛的应用文章目录引言一、马尔科夫随机场1.1定义1.2特点1.3应用1.4学习算法1.5总结二、选择马尔可夫随机场的学习算法的标准2.1问......
  • js产生随机数
    产生\([0,1)\)之间的随机实数,即\(0\le\text{Math.random()}<1\)Math.random()//返回值样例://#1:0.60958701902852//#2:0.16182155144292465//#3:0.30126821448898133随机产生\([0,n]\)之间的整数functionrandint1(n){//各数产生概率较平均returnMath.r......
  • js产生随机数
    产生$[0,1)$之间的随机实数,即$0\le\text{Math.random()}<1$Math.random()//返回值样例://#1:0.60958701902852//#2:0.16182155144292465//#3:0.30126821448898133随机产生$[0,n]$之间的整数functionrandint1(n){//各数产生概率较平均returnMath.round(Math.r......