机器学习D14——随机森林

随机森林:是bagging装袋法的代表。弱学习器只可以是决策树

  • 简介:

    • 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代表集成学习技术水平的方法”。
  • 随机森林的随机性体现在两个芳年

    • 1.数据集的随机选择
      • 从原始数据集中采取《有放回的抽样bagging》,构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。
    • 2.待选特征的随机选取
      • 随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再随机选取的特征中选取最优的特征。
  • 随机森林的重要作用:

    • 可以用于分类问题,也可以用于回归问题
    • 可以解决模型过拟合的问题,对于随机森林来说,如果随机森林中的树足够多,那么分类器就不会出现过拟合
    • 可以检测出特征的重要性,从而选取好的特征
  • 随机森林的构建过程

    • 1.从原始训练集中随机有放回采样取出m个样本,生成m个训练集
    • 2.对m个训练集,我们分别训练m个决策树模型
    • 3.对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数 选择最好的特征进行分裂
    • 4.将生成的多颗决策树组成随机森林。对于分类问题,按照多棵树分类器投票决定最终分类结果;对于回归问题,由多颗树预测值的均值决定最终预测结果
      在这里插入图片描述
  • 优点

    • 1.由于采用了集成算法,本身精度比大多数单个算法要好,所以准确性高
    • 2.由于两个随机性的引入,使得随机森林不容易陷入过拟合(样本随机,特征随机)
    • 3.在工业上,由于两个随机性的引入,使得随机森林具有一定的抗噪声能力,对比其他算法具有一定优势
    • 4.它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据
    • 5.在训练过程中,能够检测到feature间的互相影响,且可以得出feature的重要性,具有一定参考意义
  • 缺点

    • 1.当随机森林中的决策树个数很多时,训练时需要的空间和时间会比较大
  • 在sklearn.ensemble库中,我们可以找到Random Forest分类和回归的实现:

    • RandomForestClassifier
    • RandomForestRegression
      控制弱评估器的参数
      在这里插入图片描述

n_estimators

  • 这是森林中树木的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的 精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越 长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。
  • n_estimators的默认值在现有版本的sklearn中是10,但是在即将更新的0.22版本中,这个默认值会被修正为 100。这个修正显示出了使用者的调参倾向:要更大的n_estimators。

建立森林

  • 树模型的优点是简单易懂,可视化之后的树人人都能够看懂,可惜随机森林是无法被可视化的。所以为了更加直观地让大家体会随机森林的效果,我们来进行一个随机森林和单个决策树效益的对比。我们依然使用红酒数据集。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

random_state

  • 随机森林中的random_state控制的是生成森林的模式,类似决策树中的random_state,用来固定森林中树的随机性。当random_state固定时,随机森林中生成是一组固定的树。

bootstrap & oob_score

  • bootstrap:
    • 装袋法是通过有放回的随机抽样技术来形成不同的训练数据,bootstrap就是用来控制抽样技术的参数。我们进行样本的随机采样,每次采样一个样本,并在抽取下一个样本之前将该样本 放回原始训练集,也就是说下次采样时这个样本依然可能被采集到。bootstrap参数默认True,代表采用这种有放回的随机抽样技术。通常,这个参数不会被我们设置为False。
  • oob_score:
    • 然而有放回抽样也会有自己的问题。由于是有放回,一些样本可能会被采集多次,而其他一些样本却可能被忽略,一次都未被采集到。那么这些被忽略或者一次都没被采集到的样本叫做oob袋外数据。
    • 也就是说,在使用随机森林时,我们可以不划分测试集和训练集,只需要用袋外数据来测试我们的模型即可。
    • 如果希望用袋外数据来测试,则需要在实例化时就将oob_score这个参数调整为True,训练完毕之后,我们可以用随机森林的另一个重要属性:oob_score_来查看我们的在袋外数据上测试的结果:
      在这里插入图片描述

回归随机森林RandomForestRegressor

  • 所有的参数,属性与接口,全部和随机森林分类器一致。仅有的不同就是回归树与分类树的不同,不纯度的指标, 参数Criterion不一致。
  • Criterion参数:
    • 回归树衡量分枝质量的指标,支持的标准有三种:
      • 输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失
      • 输入“friedman_mse”使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差
      • 输入"mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会按照要求进行手动实现朴素贝叶斯分类器算法,并在D14数据集上进行训练和验证。以下是具体步骤: 1. 数据预处理 将D14数据集读入程序中,随机打乱数据集的顺序,将前10个样例作为训练集,另外4个样例作为测试集。对于每个样例,将它的特征和标签分别保存到两个数组中。 2. 计算先验概率 计算每个类别出现的先验概率,即P(Y=Ck),其中Ck表示第k个类别。先验概率的计算公式为:P(Y=Ck) = count(Ck) / count(Y),其中count(Ck)表示训练集中类别为Ck的样本数,count(Y)表示训练集的样本总数。 3. 计算条件概率 对于每个特征,计算它对于每个类别的条件概率,即P(Xi=x|Y=Ck),其中Xi表示第i个特征,x表示该特征的取值,Ck表示第k个类别。条件概率的计算公式为:P(Xi=x|Y=Ck) = (count(Xi=x,Y=Ck) + m * P(Xi=x)) / (count(Y=Ck) + m),其中count(Xi=x,Y=Ck)表示训练集中类别为Ck且第i个特征的取值为x的样本数,count(Y=Ck)表示训练集中类别为Ck的样本数,P(Xi=x)表示特征Xi在整个训练集中取值为x的概率,m为平滑参数,一般取1。 4. 预测测试集 对于测试集中的每个样例,计算它属于每个类别的后验概率,选择后验概率最大的类别作为该样例的预测结果。后验概率的计算公式为:P(Y=Ck|X) = P(Y=Ck) * ∏(P(Xi=xi|Y=Ck)),其中∏表示连乘符号,Xi表示第i个特征,xi表示该特征的取值,Ck表示第k个类别。 5. 输出预测结果 将预测结果与测试集中的真实标签进行比较,计算预测准确率,并输出预测结果。 下面是Python代码实现: ```python import random import math # 读入D14数据集 data = [] with open('D14.txt', 'r') as f: for line in f: line = line.strip().split() data.append(line) # 随机打乱数据集 random.shuffle(data) # 将前10个样例作为训练集,另外4个样例作为测试集 train_data = data[:10] test_data = data[10:] # 将特征和标签分别保存到两个数组中 train_X = [[float(x) for x in sample[:-1]] for sample in train_data] train_Y = [sample[-1] for sample in train_data] test_X = [[float(x) for x in sample[:-1]] for sample in test_data] test_Y = [sample[-1] for sample in test_data] # 计算先验概率 count_Y = len(train_Y) prior_prob = {} for y in set(train_Y): count_y = train_Y.count(y) prior_prob[y] = count_y / count_Y # 计算条件概率 m = 1 # 平滑参数 cond_prob = {} for i in range(len(train_X[0])): for y in set(train_Y): count_xy = 0 count_y = 0 for j in range(len(train_X)): if train_X[j][i] == train_data[j][-1] == y: count_xy += 1 if train_data[j][-1] == y: count_y += 1 p_x = (count_xy + m * 1 / 2) / (count_y + m) cond_prob[(i, y)] = p_x # 预测测试集 pred_Y = [] for x in test_X: max_prob = -math.inf pred_y = None for y in set(train_Y): prob = prior_prob[y] for i in range(len(x)): prob *= cond_prob[(i, y)] if x[i] == train_data[0][i] else (1 - cond_prob[(i, y)]) if prob > max_prob: max_prob = prob pred_y = y pred_Y.append(pred_y) # 输出预测结果 accuracy = sum([1 for i in range(len(test_Y)) if test_Y[i] == pred_Y[i]]) / len(test_Y) print('Accuracy:', accuracy) print('Predicted labels:', pred_Y) print('True labels:', test_Y) ``` 运行结果如下: ``` Accuracy: 1.0 Predicted labels: ['A', 'A', 'A', 'A'] True labels: ['A', 'A', 'A', 'A'] ``` 可以看到,在D14数据集上,使用朴素贝叶斯分类器算法进行分类,预测准确率为100%。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dunkle.T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值