精华内容
下载资源
问答
  • 随机森林过拟合问题

    万次阅读 多人点赞 2019-08-27 16:20:09
    任何机器学习算法都会有一个很常见的问题,就是过拟合问题(overfitting),经常都能看到很多人在问随机森林会不会出现过拟合问题,在外国的网站看到了这篇文章,觉得写的很好,所以翻译转载在这里。 提出问题:随机...

    任何机器学习算法都会有一个很常见的问题,就是过拟合问题(overfitting),经常都能看到很多人在问随机森林会不会出现过拟合问题,在外国的网站看到了这篇文章,觉得写的很好,所以翻译转载在这里。

    提出问题:随机森林是否会过拟合?

    当我第一次看到这个问题时,我有点惊讶,第一个想法是,当然!任何复杂的机器学习算法都会过拟合。我已经训练了数百个随机森林(RF)模型,并且多次观察到它们过拟合。第二个想法是,为什么人们会问这样的问题?我们多做一些研究,在Google了一下之后,我在Leo Breiman(随机森林算法的创建者)网站上找到了以下段落:

    Random forests does not overfit. You can run as many trees as you want.

    Breiman原文(在他的文章里面声明了一点,文章中的RF的模型是通过800Hz的处理器运行的),大意就是说随机森林不会过拟合,你想跑多少树就跑多少树。

    听到这里,可能大家都觉得不可思议,为啥随机森林不会过拟合?我想该算法的开创者是最了解的,他比我聪明多了,他肯定是对的。但是,之前我确实已经看到很多次RF过拟合,这就不得不让我很困惑,所以可以一点点的揭开随机森林的面纱。

    什么是随机森林?

    随机森林就是很多棵树,单科决策树对数据的变化很敏感,很容易对一些噪声进行过拟合,所以说只有一棵树的随机森林也会出现过拟合,和决策树是一样的道理,当我们逐个添加决策树到随机森林中时,过拟合的趋势会减少(由于袋装(Bagging)和随机特征选择),但是,通常错误不会变为零,加上更多的树之后,误差方差将接近零,但偏差不会!这是一个有用的特性,它告诉我们RF中的树越多越好,也许这就是Breiman在写关于RF和过拟合的文章时的想法。

    更多了解随机森林可以参考:https://www.cnblogs.com/maybe2030/p/4585705.html (写的很好)

    一个随机森林过拟合的例子(Python)

    为了展示一个随机森林过拟合的例子,在这里将使用以下公式生成一个非常简单的数据:

    y = 10 * x + noise

    这里使用从0到1均匀分布的x,噪声是平均值和单位方差为零的正态分布,加起来得到变量y,下面是我们的数据示例图。

    使用以下代码可以生成以上的数据并将其拆分为一个序列和测试子集:

    data = np.random.uniform(0, 1,(1000, 1))
    noise = np.random.normal(size=(1000,))
    X = data[:,:1]
    y = 10.0*(data[:,0]) + noise
    # split to train and test
    X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.4, random_state=2019)

    这个RF模型中只有一个输入变量x和一个输出变量y,为了训练这个模型我使用python中的scikit-learn库,这里我会训练两个模型,一个是满树模型,另一个是由min_samples_leaf超参数控制的修剪模型。训练满树随机森林的代码:

    rf = RandomForestRegressor(n_estimators=50)
    rf.fit(X_train, y_train)
    y_train_predicted = rf.predict(X_train)
    y_test_predicted_full_trees = rf.predict(X_test)
    mse_train = mean_squared_error(y_train, y_train_predicted)
    mse_test = mean_squared_error(y_test, y_test_predicted_full_trees)
    print("RF with full trees, Train MSE: {} Test MSE: {}".format(mse_train, mse_test))

    误差采用均方误差,越低越好,结果:

    可以看到满树的RF模型在训练数据上得到MSE(均方差):0.20,在测试数据上得到MSE:1.41。

    接下来我们用修剪过的树检验一下RF:

    rf = RandomForestRegressor(n_estimators=50, min_samples_leaf=25)
    rf.fit(X_train, y_train)
    y_train_predicted = rf.predict(X_train)
    y_test_predicted_pruned_trees = rf.predict(X_test)
    mse_train = mean_squared_error(y_train, y_train_predicted)
    mse_test = mean_squared_error(y_test, y_test_predicted_pruned_trees)
    print("RF with pruned trees, Train MSE: {} Test MSE: {}".format(mse_train, mse_test))

    结果:

    可以看到,对于修剪过的树,训练数据集的MSE结果为0.91,测试数据集上的MSE为1.04。

    到这里其实就有明显的过拟合的证据!满树的RF在训练数据集上的误差比具有修剪树的RF小得多,但测试数据上的误差会比修剪树的更高——出现了过拟合。我们可以在散点图上想象一下,左边是过拟合RF的结果,右边是修剪后随机林的结果。

    我们看到满树的RF过拟合了,可以预测在训练过程中它学习到的噪声,修剪过的树对RF的结果要平滑得多,因此,它的泛化能力更好。

    拟合和树的增长

    我们可以检验一下随机森林模型在增加树的数量时的行为,我们从1棵树开始训练RF模型,并在每个循环迭代中添加1棵树,在每一步中,我们都会测试训练数据集和测试数据集上的MSE。

    rf = RandomForestRegressor(n_estimators=1)
    for iter in range(50):
      rf.fit(X_train, y_train)
      y_train_predicted = rf.predict(X_train)
      y_test_predicted = rf.predict(X_test)
      mse_train = mean_squared_error(y_train, y_train_predicted)
      mse_test = mean_squared_error(y_test, y_test_predicted)
      print("Iteration: {} Train mse: {} Test mse: {}".format(iter, mse_train, mse_test))
      rf.n_estimators += 1

    plot绘制结果图:

    显而易见,可以看到我们在使用满树RF的时候,出现了过拟合,但是可以从上面散点图中看到,过拟合不会根据RF模型中的树的增加而增加,它随着更多的树而趋于稳定。

    结论

    • RF算法确实会过拟合。
    • 当算法中加入更多的树时,随机林中的泛化误差方差将减小到零,然而,泛化的偏差并没有改变。
    • 为了避免在RF中过拟合,应调整算法的超参数(hyper-parameters),例如,叶子节点中的样本数。

    上文中所有的代码链接:Google Colab

    原文地址:https://mljar.com/blog/random-forest-overfitting/

    展开全文
  • 随机森林算法思想,怎么增加随机性,如何评估特征重要性,为什么不容易过拟合 随机森林思想怎么添加的随机性 随机森林 (RF) 是 Bagging 的一个变体。RF在以决策树为基学习器构建 Bagging 集成的基础上,进一步在决策...

    问题

    随机森林算法思想,怎么增加随机性,如何评估特征重要性,为什么不容易过拟合

    随机森林思想怎么添加的随机性

    随机森林 (RF) 是 Bagging 的一个变体。RF在以决策树为基学习器构建 Bagging 集成的基础上,进一步在决策树的训练过程中引入随机性:

    传统决策树在选择划分属性时,是在当前结点的属性集合(假定有 d 个属性)中选择一个最优属性;而在 RF 中,对基决策树的每一个结点,先从结点的属性集合中随机选择一个包含 k 个属性的子集,然后再从这个子集当中选择一个最优属性用于划分。

    这里的参数 k 控制了随机性的引入程度。若令 k = d k=d k=

    展开全文
  • 通过建立随机森林,实现大数据样本拟合回归。随机森林参数通过误差最低确定
  • sklearn中对随机森林进行调参

    一、闲言碎语

    具体的方法可参考我的这篇文章python+sklearn进行交叉验证(使用交叉验证对数据划分,模型评估和参数估计,使用决策树举例)
    方法都是相同的,不同的是要调哪些参数,我在这里主要介绍一下随机森林中的主要的参数。
    分割线

    二、参数问题

    随机森林就是多颗决策树,那么调参可以分为两类:

    1. 随机森林框架参数
      n_estimators:
      也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。
      oob_score:
      即是否采用袋外样本来评估模型的好坏。默认识False。个人推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力。
      criterion:
      即CART树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。一般来说选择默认的标准就已经很好的。
    2. 随机森林决策树参数
      决策树参数中最重要的包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf(这里写的比我开头介绍的那篇文章多一个参数,由于之前写的那篇文章比较早,所以可能考虑的少,不过再进行考虑max_features之后,发现还是默认的效果最好)

    参数的重要性
    首先看下面这张图(来源:知乎):
    main_parameter
    在这里面主要看最右侧的影响程度,按这个顺序调参即可,还有一个参数oob_score,其实可以放到倒数第二个执行。

    看是不是过拟合,有一个方法:可以在训练集上进行训练模型之后,可以对训练集进行测试,一般未调参之前,都会达到1.0的精度,显然是过拟合。在经过调参之后,精度会下降,说明消除掉过拟合了,可以看下表train那一列。

    三、结论

    conclusion

    可以看出,使用随机森林的时候,精度达到了最高的0.8325。到目前为止,除了上表提到的决策树,神经网络,逻辑回归,随机森林,以及集成方法(使用了神经网络,逻辑回归,随机森林)之外


    集成方法部分代码如下:

    clf1 = tree.DecisionTreeClassifier(criterion="entropy", max_depth=9, min_samples_leaf=7, min_samples_split=2)
    clf2 = MLPClassifier(hidden_layer_sizes=(12, 9), activation='tanh', max_iter=3000, solver='adam', random_state=42, learning_rate='constant', alpha=0.0001, batch_size=200, tol=0.00001, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
    clf3 = RandomForestClassifier(n_estimators=101, criterion='gini', oob_score=False, max_features='auto', max_depth=15, random_state=42, min_samples_leaf=2, min_samples_split=2)
    
    eclf1 = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('mlp', clf3)], voting='soft', weights=[1, 2, 2], flatten_transform=True)
    
    cv = StratifiedShuffleSplit(n_splits=10, test_size=0.1, random_state=42)
    score = cross_val_score(eclf1, x, y, cv=cv).mean()
    print(score)
    

    (接上段),还使用了支持向量机SVM, Adaboost, Native_Bayes, KNN,一共9种机器学习算法,之所以这四个没有进行调参,是因为他们的精度真的很低,即使调参,效果也不会很好,所以主要对decision_tree, neural_network, logistic, random_dorest, vote这五种方法进行调参,也就是上表的五种方法。可以说,在现有的数据集上精度可能已经很难提升了,0.8325成为了最好的结果,要想提升我看只能从数据入手了,不过因为一些原因,数据收集是个难点,就看之后会有什么进展吧,结束!

    四、参考文献

    1. https://zhuanlan.zhihu.com/p/126288078
    2. https://blog.csdn.net/geduo_feng/article/details/79558572
    展开全文
  • 鸢尾花数据集分类-随机森林这个比较简单理解,是比较基础点的。现在直接对数据集的特征进行遍历,并分析过拟合情况。 https://blog.csdn.net/weixin_42567027/article/details/107488666 数据集 代码 // An ...


    鸢尾花数据集分类-随机森林这个比较简单理解,是比较基础点的。现在直接对数据集的特征进行遍历,并分析过拟合情况。
    https://blog.csdn.net/weixin_42567027/article/details/107488666

    数据集

    在这里插入图片描述

    代码

    // An highlighted block
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    from sklearn.ensemble import RandomForestClassifier
    
    
    def iris_type(s):
        it = {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}
        return it[s]
    
    # 'sepal length', 'sepal width', 'petal length', 'petal width'
    iris_feature = u'花萼长度', u'花萼宽度', u'花瓣长度', u'花瓣宽度'
    
    if __name__ == "__main__":
        mpl.rcParams['font.sans-serif'] = [u'SimHei']  # 黑体 FangSong/KaiTi
        mpl.rcParams['axes.unicode_minus'] = False
    
        data = pd.read_csv('F:\pythonlianxi\shuju\iris.data', header=None)
        x_prime = data[range(4)]
        y = pd.Categorical(data[4]).codes
    
        feature_pairs = [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
        plt.figure(figsize=(16, 9), facecolor='#FFFFFF')
        for i, pair in enumerate(feature_pairs):
            # 准备数据
            x = x_prime[pair]
    
            # 随机森林  200课决策树,深度为3
            clf = RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=3)
            clf.fit(x, y.ravel())
    
            # 画图
            N, M = 50, 50  # 横纵各采样多少个值
            x1_min, x2_min = x.min()
            x1_max, x2_max = x.max()
            t1 = np.linspace(x1_min, x1_max, N)
            t2 = np.linspace(x2_min, x2_max, M)
            x1, x2 = np.meshgrid(t1, t2)  # 生成网格采样点
            x_test = np.stack((x1.flat, x2.flat), axis=1)  # 测试点
    
            # 训练集上的预测结果
            y_hat = clf.predict(x)
            y = y.reshape(-1)
            c = np.count_nonzero(y_hat == y)    # 统计预测正确的个数
            print ('特征:  ', iris_feature[pair[0]], ' + ', iris_feature[pair[1]],end='\t')
            print ('\t预测正确数目:', c,end='\t')
            print ('\t准确率: %.2f%%' % (100 * float(c) / float(len(y))))
    
            # 显示
            cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
            cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
            y_hat = clf.predict(x_test)  # 预测值
            y_hat = y_hat.reshape(x1.shape)  # 使之与输入的形状相同
            plt.subplot(2, 3, i+1)
            plt.pcolormesh(x1, x2, y_hat, cmap=cm_light)  # 预测值
            plt.scatter(x[pair[0]], x[pair[1]], c=y, edgecolors='k', cmap=cm_dark)  # 样本
            plt.xlabel(iris_feature[pair[0]], fontsize=18)
            plt.ylabel(iris_feature[pair[1]], fontsize=18)
            plt.xlim(x1_min, x1_max)
            plt.ylim(x2_min, x2_max)
            plt.grid()
        plt.tight_layout(2.5)
        plt.subplots_adjust(top=0.92)
        plt.suptitle(u'随机森林对鸢尾花数据的两特征组合的分类结果', fontsize=18)
        plt.show()
    

    实验分析

    两两特征进行组合,最后的鸢尾花分类效果不用,也说明有些特征的区分效果并不好,因此可以对特征进行选择,得到最好的识别效果。
    在这里插入图片描述
    在这里插入图片描述

    过拟合分析

    从之前的研究中发现决策树的深度不同,识别率也会不同。虽然合适的深度会得到很好的识别效果,但是也会造成过拟合现象,使得算法的鲁棒性不强。
    随机森林算法在随机决策树生成过程采用的Boostrap,所以在一棵树的生成过程并不会使用所有的样本,未使用的样本就叫(Out_of_bag)袋外样本(oob 数据集),通过袋外样本,可以评估这个树的准确度,其他子树叶按这个原理评估,最后可以取平均值。
    oob_score = True:表示使用 oob 数据集作为验证数据集,估算算法的泛化能力;
    oob_score 默认为 False,不使用 oob 数据集作为验证数据集。

    修改代码,分析过拟合现象。

    // An highlighted block
    clf = RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=3, oob_score=True)
    clf.fit(x, y.ravel())
    print(clf.oob_score_,end='\t')
    

    当max_depth=3时没有出现明显的过拟合。
    在这里插入图片描述
    当max_depth=5时,特征:花萼长度+花萼宽度,出现了过拟合现象。
    在这里插入图片描述
    当max_depth=10时,特征:花萼长度+花萼宽度,发生了严重的过拟合。
    在这里插入图片描述

    展开全文
  • 笔者希望该笔记能够记录每个机器学习算法的过拟合问题。...一、随机森林不会发生过拟合的原因   在建立每一棵决策树的过程中,有两点需要注意 - 采样与完全分裂。首先是两个随机采样的过程,ran
  • 过拟合原因: 由于训练数据包含抽样误差,训练时,复杂的模型将抽样误差也考虑在内,将抽样误差也进行了很好的拟合,如 1、比如数据不够, 2、训练太多拟合了数据中的噪声或没有代表性的特征也就是模型太复杂  ...
  • RF_fitting_RF回归_随机森林拟合_随机森林_随机森林拟合_随机森林回归.zip
  • RF_fitting_RF回归_随机森林拟合_随机森林_随机森林拟合_随机森林回归_源码.zip
  • matlab下利用随机森林包做回归拟合

    千次阅读 多人点赞 2020-09-16 13:17:10
    随机森林包的配置教程在博主主页 如对代码有不懂的地方请在下方留言,看到会回复: clear all; clc; winsize=5; %% 数据读入 [num,s]=xlsread("****"); time=s(2:size(s,1),1); dt = datetime(time, 'InputFormat', ...
  • 1.原理简介:是一种bagging方法,使用CART决策树作为弱学习器,并行训练,数据采样随机,特征选择随机,所以可避免过拟合 2.算法流程: (1)对训练集随机采样m次 (2)用采样集训练决策树模型,在训练决策树节点...
  • 随机森林代码-matlab

    2018-12-22 09:31:57
    随机森林代码-matlab,亲测有效,这是今年的内部包含一份英文文档解说
  • 文章目录对空间数据的拟合数据生成过程参数说明实现代码和传统RF模型比较对AR(p)模型的拟合数据生成过程参数说明代码实现参考文献 对空间数据的拟合 数据生成过程 参数说明 实现代码 和传统RF模型比较 ...
  • 随机森林matlab代码下载 Random-Forest-MATLAB 随机森林工具包-MATLAB版 using MATLAB to achieve RF algorithm,and the decision tree is ID3 , C4.5 and CART. I had achieve these by different ways. 此处复现的...
  • 同时,它也是随机森林算法中用到的方法。 它的做法就是 对样本数量为 N 的数据集进行 N 次有放回的随机采样 ,得到一个大小是 N 的训练集。 在这个过程中将会有一部分数据是没有被采样得到的,一个样本...
  • 通过对故障诊断结果的分析,随机森林算法避免了复杂的寻参过程和传统分类器的过拟合现象,能够处理大规模数据集,通过分类器的组合,提高了故障诊断准确率,并缩短了分类模型的预测时间,具有较好的应用前景。
  • 随机森林算法梳理及相关参数介绍

    千次阅读 2019-02-28 14:48:41
    集成学习的概念 集成学习是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法。...RF(随机森林)需要用到bagging,但是其...
  • 随机森林模型调参方法

    千次阅读 2018-05-16 15:06:45
    一、默认参数打印随机森林学习器的默认参数配置:1、bootstrap=True2、criterion='mse'3、max_depth=None4、max_features='auto'5、max_leaf_nodes=None6、min_impurity_decrease=0.07、min_impurity_split=None8、...
  • 决策树回归,随机森林和多元线性回归的精度比较 风险资本家雇用您来预测一家初创公司的利润。 因此,您必须处理一个数据集,该数据集包含50个创业公司的详细信息,并根据某些功能预测新创业公司的利润。 根据您的...
  • 手撕随机森林的超参数

    千次阅读 2019-09-19 19:45:35
    随机森林有两大随机特点: 1、Random sampling of training data points when building trees 2、Random subsets of features considered when splitting nodes from sklearn . ensemble import ...
  • 集成学习—随机森林原理(理解与论文研读)

    千次阅读 多人点赞 2019-08-21 17:44:40
    随机森林(Random forest,简称RF)是由Leo Breiman在2001年在《Machine Learning》(2018年影响因子2.809)正式发表提出。正如上一篇博客中写的,随机森林属于集成学习中Bagging的典型算法。总的来说,随机森林就是...
  • 一、随机森林算法简介: 在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。而 "Random ...
  • 随机森林 成员XXX XXX XXX 目录 随机森林的引入及相关基本概念 什么是随机森林 决策树算法 随机森林的生成 袋外错误率 随机森林的特点 过拟合 随机森林的实例分析 1.什么是随机森林 随机森林就是通过集成学习的思想...
  • 决策树与随机森林初探

    万次阅读 2018-08-19 13:11:04
    2、过拟合处理——剪枝 3、随机深林 4、Bagging 5、Boosting(GBDT、XGBoost) 决策树的优势力与劣势 1、特征选择的几种方式 决策树的最关键的问题,如何选择划分属性的顺序才能使得决策树的平均性能最好 ...
  • 机器学习中用来防止过拟合的方法有哪些? 本文作者:qqfly 编辑:贾智龙 2017-05-16 15:48 雷锋网(公众号:雷锋网)按:本文作者 qqfly,上海交通大学机器人所博士生,本科毕业于清华大学机械工程系,...
  • 传统的随机森林房价评估算法存在着大量参数组合...将新算法与传统随机森林房价评估算法进行了对比实验分析,结果表明,融合模拟退火的随机森林房价评估算法误差值减少,拟合优度值增加,评估的准确度得到了显著提升。
  • xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算, 这也是xgboost异于传统gbdt的一个特性。 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。 ...
  • 随机森林简介

    千次阅读 2017-07-31 16:44:47
    随机森林简介
  • 优化随机森林算法,正确率提高1%~5%(已经有90%+的正确率,再调高会导致过拟合) 论文当然是参考的,毕竟出现早的算法都被人研究烂了,什么优化基本都做。而人类最高明之处就是懂得利用前人总结的经验和制造的...
  • 针对传统煤自燃温度预测模型预测精度较差、基于支持向量机(SVM)的预测模型对参数的选取要求较高和基于神经网络的预测模型测试时易出现过拟合的问题,提出了一种基于随机森林算法的煤自燃温度预测模型。利用煤自燃...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,605
精华内容 7,842
关键字:

随机森林过拟合