精华内容
下载资源
问答
  • 所有的参数,属性与接口,全部和随机森林分类器一致。仅有的不同就是回归树与分类树的不同,不纯度的指标, 参数Criterion不一致。RandomForestRegressor(n_estimators='warn',criterion='mse',max_depth=None,...

    所有的参数,属性与接口,全部和随机森林分类器一致。仅有的不同就是回归树与分类树的不同,不纯度的指标, 参数Criterion不一致。

    RandomForestRegressor(n_estimators='warn'
                          criterion='mse'
                          max_depth=None
                          min_samples_split=2
                          min_samples_leaf=1
                          min_weight_fraction_leaf=0.0
                          max_features='auto'
                          max_leaf_nodes=None
                          min_impurity_decrease=0.0
                          min_impurity_split=None
                          bootstrap=True
                          oob_score=False
                          n_jobs=None
                          random_state=None
                          verbose=0
                          warm_start=False)

    重要参数,属性与接口

    criterion

    回归树衡量分枝质量的指标,支持的标准有三种

    1. 输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失。
    2. 输入"friedman_mse"使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差。
    3. 输入"mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失。

    其中是样本数量,i是每一个数据样本,是模型回归出的数值,是样本点i实际的数值标签。所以MSE的本质是样本真实数据与回归结果的差异。在回归树中,MSE不只是我们的分枝质量衡量指标,也是我们最常用的衡量回归树回归质量的指标,当我们在使用交叉验证,或者其他方式获取回归树的结果时,我们往往选择均方误差作为我们的评估(在分类树中这个指标是score代表的预测准确率)。在回归中,我们追求的是,MSE越小越好。

    然而,回归树的接口score返回的是R平方,并不是MSE。此处可参考线性回归中模型评估指标。

    最重要的属性和接口,都与随机森林的分类器相一致,还是apply, fit, predict和score最为核心。值得一提的是,随机森林回归并没有predict_proba这个接口,因为对于回归来说,并不存在一个样本要被分到某个类别的概率问题,因此没有predict_proba这个接口。

    例子

    from sklearn.datasets import load_boston
    from sklearn.model_selection import cross_val_score
    from sklearn.ensemble import RandomForestRegressor
    boston = load_boston()
    regressor = RandomForestRegressor(n_estimators=100,random_state=0)
    cross_val_score(regressor, boston.data, boston.target, cv=10
                   ,scoring = "neg_mean_squared_error")
    sorted(sklearn.metrics.SCORERS.keys())

    返回十次交叉验证的结果,注意在这里,如果不填写scoring = "neg_mean_squared_error",交叉验证默认的模型衡量指标是R平方,因此交叉验证的结果可能有正也可能有负。而如果写上scoring,则衡量标准是负MSE,交叉验证的结果只可能为负。

    实例:⽤随机森林回归填补缺失值

    在之前缺失值处理文章中提到运用随机森林回归填补缺失值,我们来看看具体如何操作。

    导包

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from sklearn.datasets import load_boston
    from sklearn.impute import SimpleImputer
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.model_selection import cross_val_score

    数据准备

    以波⼠顿数据集为例,导⼊完整的数据集并探索

    dataset = load_boston()
    dataset.data.shape
    #总共506*13=6578个数据
    X, y = dataset.data, dataset.target
    n_samples = X.shape[0]
    n_features = X.shape[1]

    生产缺失值

    rng = np.random.RandomState(0)
    missing_rate = 0.5
    n_missing_samples = int(np.floor(n_samples * n_features * missing_rate))
    #np.floor向下取整,返回.0格式的浮点数

    所有数据要随机遍布在数据集的各⾏各列当中,⽽⼀个缺失的数据会需要⼀个⾏索引和⼀个列索引如果能够创造⼀个数组,包含3289个分布在0~506中间的⾏索引,和3289个分布在0~13之间的列索引,那我们就可以利⽤索引来为数据中的任意3289个位置赋空值。

    我们现在采样3289个数据,远远超过样本量506,所以使⽤随机抽取的函数randint。但如果需要的数据量⼩于我们的样本量506,那我们可以采⽤np.random.choice来抽样,choice会随机抽取不重复的随机数,因此可以帮助我们让数据更加分散,确保数据不会集中在⼀些⾏中。

    missing_features_index = rng.randint(0,n_features,n_missing_samples)
    missing_samples_index = rng.randint(0,n_samples,n_missing_samples)
    # missing_samples=rng.choice(dataset.data.shape[0],n_missing_samples,replace=False)

    X_missing = X.copy()
    y_missing = y.copy()
    X_missing[missing_samples, missing_features] = np.nan
    X_missing = pd.DataFrame(X_missing)
    # 转换成DataFrame是为了后续⽅便各种操作,
    # numpy对矩阵的运算速度快,但是在索引等功能上却不如pandas来得好⽤

    然后我们⽤0,均值和随机森林来填写这些缺失值,然后查看回归的结果如何

    #使⽤均值进⾏填补
    from sklearn.impute import SimpleImputer
    imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
    X_missing_mean = imp_mean.fit_transform(X_missing)
    #使⽤0进⾏填补
    imp_0 = SimpleImputer(missing_values=np.nan, strategy="constant",fill_value=0)
    X_missing_0 = imp_0.fit_transform(X_missing)

    随机森林填补

    8a9ddf689ab5ba463777811f09dce0ca.png

    使⽤随机森林回归填补缺失值任何回归都是从特征矩阵中学习,然后求解连续型标签y的过程,之所以能够实现这个过程,是因为回归算法认为,特征矩阵和标签之前存在着某种联系。实际上,标签和特征是可以相互转换的,⽐如说,在⼀个"⽤地区,环境,附近学校数量"预测"房价"的问题中,我们既可以⽤"地区","环境","附近学校数量"的数据来预测"房价",也可以反过来,⽤"环境","附近学校数量"和"房价"来预测"地区"。⽽回归填补缺失值,正是利⽤了这种思想。

    对于⼀个有n个特征的数据来说,其中特征T有缺失值,我们就把特征T当作标签,其他的n-1个特征和原本的标签组成新的特征矩阵。那对于T来说,它没有缺失的部分,就是我们的Y_test,这部分数据既有标签也有特征,⽽它缺失的部分,只有特征没有标签,就是我们需要预测的部分。


    特征T不缺失的值对应的其他n-1个特征 + 本来的标签:X_train
    特征T不缺失的值:Y_train
    特征T缺失的值对应的其他n-1个特征 + 本来的标签:X_test
    特征T缺失的值:未知,我们需要预测的Y_test


    这种做法,对于某⼀个特征⼤量缺失,其他特征却很完整的情况,⾮常适⽤。

    那如果数据中除了特征T之外,其他特征也有缺失值怎么办?答案是遍历所有的特征,从缺失最少的开始进⾏填补(因为填补缺失最少的特征所需要的准确信息最少)。填补⼀个特征时,先将其他特征的缺失值⽤0代替,每完成⼀次回归预测,就将预测值放到原本的特征矩阵中,再继续填补下⼀个特征。每⼀次填补完毕,有缺失值的特征会减少⼀个,所以每次循环后,需要⽤0来填补的特征就越来越少。当进⾏到最后⼀个特征时(这个特征应该是所有特征中缺失值最多的),已经没有任何的其他特征需要⽤0来进⾏填补了,⽽我们已经使⽤回归为其他特征填补了⼤量有效信息,可以⽤来填补缺失最多的特征。遍历所有的特征后,数据就完整,不再有缺失值了。

    X_missing_reg = X_missing.copy()
    sortindex = np.argsort(X_missing_reg.isnull().sum(axis=0)).values
    for i in sortindex:
        #构建我们的新特征矩阵和新标签
        df = X_missing_reg
        fillc = df.iloc[:,i]
        df = pd.concat([df.iloc[:,df.columns != i],pd.DataFrame(y_full)],axis=1)
        #在新特征矩阵中,对含有缺失值的列,进⾏0的填补
        df_0 =SimpleImputer(missing_values=np.nan,
        strategy='constant',fill_value=0).fit_transform(df)
        #找出我们的训练集和测试集
        Ytrain = fillc[fillc.notnull()]
        Ytest = fillc[fillc.isnull()]
        Xtrain = df_0[Ytrain.index,:]
        Xtest = df_0[Ytest.index,:]
        #⽤随机森林回归来填补缺失值
        rfc = RandomForestRegressor(n_estimators=100)
        rfc = rfc.fit(Xtrain, Ytrain)
        Ypredict = rfc.predict(Xtest)
        #将填补好的特征返回到我们的原始的特征矩阵中
        X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),i] = Ypredict

    建模

    #对所有数据进⾏建模,取得MSE结果
    X = [X_full,X_missing_mean,X_missing_0,X_missing_reg]
    mse = []
    std = []
    for x in X:
        estimator = RandomForestRegressor(random_state=0, n_estimators=100)
        scores =
        cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error',
        cv=5).mean()
        mse.append(scores * -1)

    可视化

    x_labels = ['Full data',
            'Zero Imputation',
          'Mean Imputation',
          'Regressor Imputation']
    colors = ['r''g''b''orange']
    plt.figure(figsize=(126))
    ax = plt.subplot(111)
    for i in np.arange(len(mse)):
      ax.barh(i, mse[i],color=colors[i], alpha=0.6, align='center')
        
    ax.set_title('Imputation Techniques with Boston Data')
    ax.set_xlim(left=np.min(mse) * 0.9,right=np.max(mse) * 1.1)
    ax.set_yticks(np.arange(len(mse)))
    ax.set_xlabel('MSE')
    ax.set_yticklabels(x_labels)
    plt.show()

    随机森林调参

    参数对模型在未知数据上的评估性能的影响影响程度
    n_estimators提升⾄平稳,n_estimators↑,不影响单个模型的复杂度????
    max_depth有增有减,默认最⼤深度,即最⾼复杂度,向复杂度降低的⽅向调参max_depth↓,模型更简单,且向图像的左边移动???
    min_samples _leaf有增有减,默认最⼩限制1,即最⾼复杂度,向复杂度降低的⽅向调参min_samples_leaf↑,模型更简单,且向图像的左边移动??
    min_samples_split有增有减,默认最⼩限制2,即最⾼复杂度,向复杂度降低的⽅向调参min_samples_split↑,模型更简单,且向图像的左边移动??
    max_features有增有减,默认auto,是特征总数的开平方,位于中间复杂度,既可以 向复杂度升高的方向,也可以向复杂度降低的方向调参
    max_features↓,模型更简单,图像左移
    max_features↑,模型更复杂,图像右移
    max_features是唯⼀的,既能够让模型更简单,也能够让模型更复杂的参数,所以在调整这个参数的时候,需要考虑我们调参方向
    ?
    criterion有增有减,一般使用gini

    推荐阅读

    e8a3a17c54e4a5e52a5ae2eed670822c.png

    -- 数据STUDIO -- 

    08e0bfc7717b8385a87b8acca121e2c4.gif

    展开全文
  • 随机森林回归算法 X = S2(1:22,:); % S2为数据集 T = S2(23:end,:); %nTree = round(sqrt(size(X,2)-1)); nTree = 50; train_data = X(:,1:end-1);train_label = X(:,end); test_data = T(:,1:end-1); Factor = ...

    随机森林回归算法

    X = S2(1:22,:); %  S2为数据集
    T = S2(23:end,:);
    %nTree = round(sqrt(size(X,2)-1));
    nTree = 50;
    train_data = X(:,1:end-1);train_label = X(:,end); test_data = T(:,1:end-1);
    Factor = TreeBagger(nTree, train_data, train_label,'Method','regression');
    [Predict_label,Scores] = predict(Factor, test_data)
    %Predict_label=cellfun(@str2num,Predict_label(1:end));
    MZE = mean(round(Predict_label) ~= T(:,end))
    MAE = mean(abs(round(Predict_label) - T(:,end)))

     

    展开全文
  • 随机森林是一种灵活,易于使用的机器学习算法,即使没有超参数调整,也能在大多数情况下产生出色的结果。它也是最常用的算法之一,因为它简单,并且可以用于分类和回归任务。在这篇文章中,您将学习随机森林算法如何...

    efc869fbdac4648253019a3f466feeff.png

    随机森林是一种灵活,易于使用的机器学习算法,即使没有超参数调整,也能在大多数情况下产生出色的结果。它也是最常用的算法之一,因为它简单,并且可以用于分类和回归任务。在这篇文章中,您将学习随机森林算法如何工作以及其他几个重要的事情。

    目录:

    • 这个怎么运作
    • 真实生活类比
    • 特征重要性
    • 决策树与随机森林的区别
    • 重要的超参数(预测能力,速度)
    • 优点和缺点
    • 用例
    • 摘要

    这个怎么运作:

    随机森林是一种监督学习算法。就像你已经从它的名字中看到的一样,它创造了一个森林,并使它在某种程度上是随机的。它构建的“森林”是决策树的集合,大部分时间都是用“装袋”方法训练的。装袋方法的一般思想是学习模型的组合增加了整体结果。

    用简单的话来说:随机森林构建多个决策树并将它们合并在一起以获得更准确和稳定的预测。

    随机森林的一大优势是,它可以用于分类和回归问题,这些问题构成了当前机器学习系统的大部分。我将在分类中讨论随机森林,因为分类有时被认为是机器学习的基石。您可以在下面看到随机森林如何使用两棵树:

    caba6d7a917dc665bb06b0de39f5d00c.png

    随机森林具有与决策树或装袋分类器几乎相同的超参数。幸运的是,您不必将决策树与装袋分类器组合在一起,只需轻松使用随机森林的分类器类即可。就像我已经说过的,使用Random Forest,你也可以使用Random Forest回归量来处理回归任务。

    随机森林为模型增加了额外的随机性,同时种植树木。它不是在分割节点时搜索最重要的特征,而是在随机特征子集中搜索最佳特征。这导致了广泛的多样性,通常导致更好的模型。

    因此,在随机森林中,用于分割节点的算法仅考虑特征的随机子集。您甚至可以通过为每个特征使用随机阈值而不是搜索最佳可能阈值(如正常决策树那样)来使树更随机。

    真实生活类比:

    想象一下,一个名叫安德鲁的人,想要决定在一年的假期旅行中应该去哪些地方。他问那些认识他的人。首先,他去找一位朋友,朋友问安德鲁之前他去过哪里,他是否喜欢。根据答案,他会给安德鲁一些建议。

    这是典型的决策树算法方法。安德鲁斯的朋友通过使用安德鲁的答案创建了规则,以指导他决定应该向安德鲁推荐什么。

    之后,安德鲁开始要求越来越多的朋友给他建议,他们再次问他不同的问题,他们可以从中得到一些建议。然后他选择了对他最推荐的地方,这是典型的随机森林算法方法。

    特征重要性:

    随机森林算法的另一个高质量是,很容易测量每个特征对预测的相对重要性。Sklearn为此提供了一个很好的工具,它可以通过查看使用该功能的树节点减少森林中所有树木的杂质来测量特征的重要性。它会在训练后自动为每个要素计算此分数并对结果进行缩放,以使所有重要性的总和等于1。

    如果你不知道决策树是如何工作的,如果你不知道叶子或节点是什么,这里是维基百科的一个很好的描述:在决策树中,每个内部节点代表一个属性的“测试”(例如硬币正面还是反面朝上),每个分支代表测试的结果,每个叶节点代表一个类标签(在计算所有属性后作出决定)。 没有子节点的节点是叶子。

    通过查看特征重要性,您可以决定要删除哪些特征,因为它们对预测过程没有足够的贡献或没有贡献。这很重要,因为机器学习的一般规则是,您拥有的特征越多,您的模型就越容易受到过度拟合的影响,反之亦然。

    下面你可以看到一个表格和一个可视化,它显示了13个特征的重要性,我在监督分类项目中使用了有名的泰坦尼克号数据集。你可以在这里找到整个项目。

    50993e0dfe56c7a061be390e2acb9340.png

    决策树与随机森林之间的差异:

    就像我已经提到的,随机森林是决策树的集合,但是存在一些差异。

    如果您将具有要素和标签的训练数据集输入到决策树中,它将制定一组规则,用于进行预测。

    例如,如果您想预测一个人是否会点击在线广告,您可以收集过去点击过的人的广告以及描述他的决定的一些功能。如果将功能和标签放入决策树中,它将生成一些规则。然后,您可以预测广告是否会被点击。相比之下,随机森林算法随机选择观察和特征来构建几个决策树,然后平均结果。

    另一个区别是“深层”决策树可能会受到过度拟合的影响。随机森林通过创建特征的随机子集并使用这些子集构建较小的树来防止过度拟合。之后,它结合了子树。请注意,这不会每次都起作用,并且它还会使计算速度变慢,具体取决于随机林构建的树数。

    重要的超参数:

    随机森林中的超参数用于增加模型的预测能力或使模型更快。我将在这里谈谈sklearns内置随机森林函数的超参数。

    1.增加预测能力

    首先,有“n_estimators”超参数,它只是算法在进行最大投票或取平均预测之前构建的树数。通常,更多数量的树会提高性能并使预测更稳定,但它也会减慢计算速度。

    另一个重要的超参数是“max_features”,它是Random Forest考虑拆分节点的最大特征数。Sklearn提供了几个选项,在他们的文档中有描述。

    我们将在速度方面讨论的最后一个重要的超参数是“min_sample_leaf”。与其名称一样,这确定了拆分内部节点所需的最小叶子数。

    2.提高模型速度

    “n_jobs”超参数告诉引擎是多少处理器允许使用。如果它的值为1,则它只能使用一个处理器。值“-1”表示没有限制。

    “random_state”使模型的输出可复制。当模型具有random_state的确定值并且已经给出相同的超参数和相同的训练数据时,该模型将始终产生相同的结果。

    最后,还有“oob_score”(也称为oob采样),它是一种随机森林交叉验证方法。在此抽样中,大约三分之一的数据不用于训练模型,可用于评估其性能。这些样品称为袋外样品。它与留一法交叉验证方法非常相似,但几乎没有额外的计算负担。

    优点和缺点:

    就像我已经提到的,随机森林的一个优点是它可以用于回归和分类任务,并且很容易查看它分配给输入要素的相对重要性。

    随机森林也被认为是一种非常方便易用的算法,因为它的默认超参数通常会产生良好的预测结果。超参数的数量也不是那么高,而且它们很容易理解。

    机器学习中的一个重大问题是过度拟合,但大多数情况下,这对于随机森林分类器来说不容易发生。那是因为如果森林中有足够的树,分类器就不会过度拟合模型。

    随机森林的主要局限在于大量决策树可以使算法减慢并且对实时预测无效。一般来说,这些算法训练速度很快,但一旦训练完成预测就很慢。更准确的预测需要更多的树,这导致更慢的模型。在大多数实际应用中,随机森林算法足够快,但肯定存在运行时性能很重要而其他方法更受欢迎的情况。

    当然,随机森林是一种预测建模工具,而不是一种描述性工具。这意味着,如果您正在寻找数据中关系的描述,则首选其他方法。

    用例:

    随机森林算法用于许多不同的领域,如银行,股票市场,医药和电子商务。例如,在银行业中,它用于检测将比其他人更频繁地使用银行服务的客户,并及时偿还他们的债务。在此域中,它还用于检测想要诈骗银行的欺诈客户。在金融领域,它用于确定未来股票的行为。在医疗保健领域,它用于识别医学中组分的正确组合,并分析患者的病史以识别疾病。最后,在电子商务中,随机森林用于确定客户是否真的喜欢该产品。

    摘要:

    随机森林是一个很好的算法,可以在模型开发过程的早期进行训练,看看它是如何执行的,并且由于其简单性,很难建立一个“坏”的随机森林。如果您需要在短时间内开发模型,此算法也是一个很好的选择。最重要的是,它提供了一个非常好的指标,表明它为您的功能赋予的重要性。

    随机森林在性能方面也很难被击败。当然,您可能总能找到一个能够表现更好的模型,比如神经网络,但这些通常需要花费更多的时间进行开发。最重要的是,它们可以处理许多不同的要素类型,如二进制,分类和数字。

    总体而言,随机森林是一种(大多数)快速,简单和灵活的工具,尽管它有其局限性。

    点击英文原文 https://towardsdatascience.com/the-random-forest-algorithm-d457d499ffcd


    更多文章欢迎访问: http://www.apexyun.com

    公众号:银河系1号

    联系邮箱:public@space-explore.com

    (未经同意,请勿转载)

    展开全文
  • Matlab TreeBagger随机森林回归实例

    万次阅读 多人点赞 2020-03-12 11:34:33
    随机森林回归是一种机器学习和数据分析领域常用且有效的算法。本文介绍在Matlab平台如何使用自带函数和测试数据实现回归森林,对于随机森林和决策树的相关理论原理将不做太深入的描述。 算法流程 (1)加载Matlab...

    简介

    在探寻变量之间相关性时,简单线性相关容易实现,对于多元的非线性关系,如果不知道关系式(函数方程)很难建立自变量和因变量之间关系。而机器学习方法为解决这类复杂多元非线性问题提供了很好的思路。
    其中,随机森林回归是一种机器学习和数据分析领域常用且有效的算法。本文介绍在Matlab平台如何使用自带函数(TreeBagger)和测试数据实现回归森林,对于随机森林和决策树的相关理论原理将不做太深入的描述。

    算法流程

    (1)加载Matlab测试数据集;
    (2)训练TreeBagger(随机森林);
    (3)创建散点图;
    (4)估计输入变量的相对重要性;
    (5)检查需要多少棵树。

    TreeBagger介绍

    TreeBagger集成了一组决策树,用于分类或回归。集成中的每棵树都生长在独立绘制的输入数据的引导程序副本上。该副本中未包含的观察结果对于该树而言是“无用之物”。

    TreeBagger将决策树用于分类或回归。TreeBagger依靠ClassificationTree和 RegressionTree功能来生长单个树。ClassificationTree和RegressionTree接受为每个决策拆分随机选择的特征数作为可选输入参数。也就是说, TreeBagger实现了随机森林算法。
    对于回归问题,TreeBagger支持均值和分位数回归(即分位数回归森林)。

    默认情况下,TreeBagger为分类树。要使用回归树,请指定 ‘Method’,‘regression’。

    语法

    Mdl = TreeBagger(NumTrees,Tbl,ResponseVarName)
    Mdl = TreeBagger(NumTrees,Tbl,formula)
    Mdl = TreeBagger(NumTrees,Tbl,Y)
    B = TreeBagger(NumTrees,X,Y)
    B = TreeBagger(NumTrees,X,Y,Name,Value)
    

    描述

    Y是相应自变量数据的因变量数组,对于分类问题, Y是一组类标签。标签可以是数字或逻辑向量等。对于回归问题,Y是一个数值向量。对于回归树,必须指定名称-值对 ‘Method’,‘regression’。

    若要预测均值响应或估计给定数据的均方误差,请分别传递TreeBagger模型和数据分析。要对袋外观测数据执行类似的操作,请使用oobPredict或oobError。

    要估计给定数据的响应分布的分位数或分位数误差,请将TreeBagger模型和数据分别传递给quantilePredict或quantileError。要对袋外观察执行类似的操作,请使用oobQuantilePredict或oobError。

    测试数据集下载

    波士顿房价数据集:http://t.cn/RfHTAgY
    https://download.csdn.net/download/wokaowokaowokao12345/12243422
    或者使用Matlab自带测试数据集。

    波士顿房价数据集是一个回归问题数据集,共有 506 个样本,13 个输入变量和1个输出变量。每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率,一氧化氮浓度,住宅平均房间数,到中心区域的加权距离以及自住房平均房价等等。房价是因变量,其它变量为自变量。
    在这里插入图片描述

    例子1

    https://www.mathworks.com/help/stats/regression-treeBagger-examples.html

    clear;clc;close all
    
    %%
    % 加载Matlab提供的测试数据——使用1985年汽车进口量数据库,其中包含205个样本数据,25个自变量和1个因变量
    load imports-85;
    Y = X(:,1);
    X = X(:,2:end);
    isCategorical = [zeros(15,1);ones(size(X,2)-15,1)]; % Categorical variable flag
    
    % 设置随机生成器种子,实际运用中可以注释掉,以获得随机性
    rng(1945,'twister')
    
    
    %% 最优leaf选择
    % 对于回归,一般规则是将叶子大小设置为5。通过比较不同叶子数量MSE获得最佳叶子数量
    % 叶子数量越少MSE越小,即使如此也肯定不是越小越好,这里就假设leaf=5是最优了
    leaf = [5 10 20 50 100];
    col = 'rbcmy';
    figure
    for i=1:length(leaf)
        b = TreeBagger(50,X,Y,'Method','R','OOBPrediction','On',...
    			'CategoricalPredictors',find(isCategorical == 1),...
                'MinLeafSize',leaf(i));
        plot(oobError(b),col(i))
        hold on
    end
    xlabel('Number of Grown Trees')
    ylabel('Mean Squared Error') 
    legend({'5' '10' '20' '50' '100'},'Location','NorthEast')
    hold off
    
    %% 树的数量设置,前面用了50棵树(为了收敛速度快),接下来增加到100
    b = TreeBagger(100,X,Y,'Method','R','OOBPredictorImportance','On',...
        'CategoricalPredictors',find(isCategorical == 1),...
        'MinLeafSize',5);
    
    % 绘制误差曲线
    figure
    plot(oobError(b))
    xlabel('Number of Grown Trees')
    ylabel('Out-of-Bag Mean Squared Error')
    
    %% 自变量重要性分析
    % 自变量对RF模型贡献有大有小,RF的预测能力依赖于贡献大的自变量。对于每个自变量,可以观察其重要性,进行取舍组合,并查看MSE是否有改善。
    % OOBPermutedPredictorDeltaError提供了每个自变量的重要性,值越大,变量越重要。
    figure
    bar(b.OOBPermutedPredictorDeltaError)
    xlabel('Feature Number') 
    ylabel('Out-of-Bag Feature Importance')
    
    % 选择重要性大于0.7的变量
    idxvar = find(b.OOBPermutedPredictorDeltaError>0.7)
    idxCategorical = find(isCategorical(idxvar)==1);
    finbag = zeros(1,b.NTrees);
    for t=1:b.NTrees
        finbag(t) = sum(all(~b.OOBIndices(:,1:t),2));
    end
    finbag = finbag / size(X,1);
    figure
    plot(finbag)
    xlabel('Number of Grown Trees')
    ylabel('Fraction of In-Bag Observations')
    
    %% 使用选择的特征重新训练
    b5v = TreeBagger(100,X(:,idxvar),Y,'Method','R',...
        'OOBPredictorImportance','On','CategoricalPredictors',idxCategorical,...
        'MinLeafSize',5);
    figure
    plot(oobError(b5v))
    xlabel('Number of Grown Trees')
    ylabel('Out-of-Bag Mean Squared Error')
    
    figure
    bar(b5v.OOBPermutedPredictorDeltaError)
    xlabel('Feature Index')
    ylabel('Out-of-Bag Feature Importance')
    
    %% 找到样本数据中的异常数据
    b5v = fillProximities(b5v);
    figure
    histogram(b5v.OutlierMeasure)
    xlabel('Outlier Measure')
    ylabel('Number of Observations')
    
    figure(8)
    [~,e] = mdsProx(b5v,'Colors','K');
    xlabel('First Scaled Coordinate')
    ylabel('Second Scaled Coordinate')
    
    figure
    bar(e(1:20))
    xlabel('Scaled Coordinate Index')
    ylabel('Eigenvalue')
    

    例子2

    clear;clc;close all
    
    %%
    % 加载Matlab提供的测试数据——使用1985年汽车进口量数据库,其中包含205个样本数据,25个自变量和1个因变量
    load imports-85;
    Y = X(:,1);
    X = X(:,2:end);
    isCategorical = [zeros(15,1);ones(size(X,2)-15,1)]; % Categorical variable flag
    
    %% 训练随机森林,TreeBagger使用内容,以及设置随机森林参数
    tic
    leaf = 5;
    ntrees = 200;
    fboot = 1;
    disp('Training the tree bagger')
    b = TreeBagger(ntrees, X,Y, 'Method','regression', 'oobvarimp','on', 'surrogate', 'on', 'minleaf',leaf,'FBoot',fboot);
    toc
    
    %% 使用训练好的模型进行预测
    % 这里没有单独设置测试数据集合,如果进行真正的预测性能测试,使用未加入至模型训练的数据进行预测测试。
    disp('Estimate Output using tree bagger')
    x = Y;
    y = predict(b, X);
    toc
    
    % calculate the training data correlation coefficient
    % 计算相关系数
    cct=corrcoef(x,y);
    cct=cct(2,1);
    
    % Create a scatter Diagram
    disp('Create a scatter Diagram')
    
    % plot the 1:1 line
    plot(x,x,'LineWidth',3);
    
    hold on
    scatter(x,y,'filled');
    hold off
    grid on
    
    set(gca,'FontSize',18)
    xlabel('Actual','FontSize',25)
    ylabel('Estimated','FontSize',25)
    title(['Training Dataset, R^2=' num2str(cct^2,2)],'FontSize',30)
    
    drawnow
    
    fn='ScatterDiagram';
    fnpng=[fn,'.png'];
    print('-dpng',fnpng);
    
    %--------------------------------------------------------------------------
    % Calculate the relative importance of the input variables
    tic
    disp('Sorting importance into descending order')
    weights=b.OOBPermutedVarDeltaError;
    [B,iranked] = sort(weights,'descend');
    toc
    
    %--------------------------------------------------------------------------
    disp(['Plotting a horizontal bar graph of sorted labeled weights.']) 
    
    %--------------------------------------------------------------------------
    figure
    barh(weights(iranked),'g');
    xlabel('Variable Importance','FontSize',30,'Interpreter','latex');
    ylabel('Variable Rank','FontSize',30,'Interpreter','latex');
    title(...
        ['Relative Importance of Inputs in estimating Redshift'],...
        'FontSize',17,'Interpreter','latex'...
        );
    hold on
    barh(weights(iranked(1:10)),'y');
    barh(weights(iranked(1:5)),'r');
    
    %--------------------------------------------------------------------------
    grid on 
    xt = get(gca,'XTick');    
    xt_spacing=unique(diff(xt));
    xt_spacing=xt_spacing(1);    
    yt = get(gca,'YTick');    
    ylim([0.25 length(weights)+0.75]);
    xl=xlim;
    xlim([0 2.5*max(weights)]);
    
    %--------------------------------------------------------------------------
    % Add text labels to each bar
    for ii=1:length(weights)
        text(...
            max([0 weights(iranked(ii))+0.02*max(weights)]),ii,...
            ['Column ' num2str(iranked(ii))],'Interpreter','latex','FontSize',11);
    end
    
    %--------------------------------------------------------------------------
    set(gca,'FontSize',16)
    set(gca,'XTick',0:2*xt_spacing:1.1*max(xl));
    set(gca,'YTick',yt);
    set(gca,'TickDir','out');
    set(gca, 'ydir', 'reverse' )
    set(gca,'LineWidth',2);   
    drawnow
    
    %--------------------------------------------------------------------------
    fn='RelativeImportanceInputs';
    fnpng=[fn,'.png'];
    print('-dpng',fnpng);
    
    %--------------------------------------------------------------------------
    % Ploting how weights change with variable rank
    disp('Ploting out of bag error versus the number of grown trees')
    
    figure
    plot(b.oobError,'LineWidth',2);
    xlabel('Number of Trees','FontSize',30)
    ylabel('Out of Bag Error','FontSize',30)
    title('Out of Bag Error','FontSize',30)
    set(gca,'FontSize',16)
    set(gca,'LineWidth',2);   
    grid on
    drawnow
    fn='EroorAsFunctionOfForestSize';
    fnpng=[fn,'.png'];
    print('-dpng',fnpng);
    
    
    

    实验结果

    模型的相关系数
    输入变量的重要性
    展开全文
  • 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代表集成学习技术水平的方法...
  • 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代表集成学习技术水平的方法...
  • matlab实现的随机森林算法,利用分类器可做回归或预测
  • 个体学习器:也就是常见的学习算法,如逻辑回归,神经网络等,根据个体学习器间的强弱依赖关系,可以分类两类集成学习算法。一类是具有强依赖性,个体学习器必须串行生成的序列化方法,代表算法是Boosting。另一类的...
  • 1决策树随机森林算法是一种集成学习方法,随机森林的基分类器是决策树,决策树是一种最基本的分类与回归模型,由节点和有向边组成,因其外观看起来像一棵树,所以叫做决策树。其中,节点又分为根节点、内部节点、...
  • 随机森林算法

    2017-11-06 13:38:03
    随机森林回归分宜预测,比向量机精度好点随机森林 论文作者写的随机森林代码,采用matlab混合编程,需要安装Fortran compiler。。。 (An interface to the random forest algorithm (version 3.3) written by Leo ...
  • random forest 随机森林(高亮!用于分类) matlab实现

    万次阅读 多人点赞 2017-09-06 11:02:19
    最近要用到随机森林,于是乎对它的原理了解了一番,并做了一下算法的实现。本次实现是用于分类问题的,如果是回归问题,分裂规则不一样,我还没有实现..... 下面的原理摘自别人的笔记,如果了解决策树CART的构建规则...
  • 比之前讲过的线性回归、Logist回归、KNN、决策树的评分效果都好。集成学习的讲解分三个部分:Bagging-自举汇聚、Boosting-提升算法、Stacking-模型融合。注意:Stacking模型是一个很有趣的算法,在比赛中用到有时候...
  • 本文含3605字,19图表截屏建议阅读8分钟本文是Python商业数据挖掘实战的第4篇1 - 基于不平衡数据的反欺诈模型实战2 - Apriori算法实现智能推荐3- 随机森林预测宽带客户离网4 - 多元线性回归模型实战前言「多元线性...
  • 前言 最近研读了孙剑团队的Face Alignment at 3000fps ...1.基于标准随机森林回归算法独立地学习每个特征点的局部二值特征,连接形成每张图像的特征; 2.基于双坐标下降法学习全局线性回归; 论文下载: http:/...
  • 随机森林 支持向量机 ANN ....等 排序算法: 快速排序 气泡排序 合并排序 插入排序...等 数据结构和算法: Queue列 二叉树 链表 跳过清单 BFS,DFS ....等 DSP和多媒体技术: 快速傅立叶变换 小波 哈夫曼...等
  • 第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章 思维进化算法优化BP神经网络——非线性函数拟合 第32章 小波神经网络的时间序列预测——短时交通流量预测 第33章 模糊神经网络的预测算法——嘉陵江...
  • 监督式学习的例子有:回归、决策树、随机森林、K近邻、逻辑回归 2、非监督式学习 这个算法用在不同的组内聚类分析 非监督式学习的例子有:关联算法和 K均值算法 3、强化学习 机器被放在一个能让它通过反复试错...
  • 第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章 思维进化算法优化BP神经网络——非线性函数拟合 第32章 小波神经网络的时间序列预测——短时交通流量预测 第33章 模糊神经网络的预测算法——嘉陵江...
  • 第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章 思维进化算法优化BP神经网络——非线性函数拟合 第32章 小波神经网络的时间序列预测——短时交通流量预测 第33章 模糊神经网络的预测算法——嘉陵江...
  • 第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章 思维进化算法优化BP神经网络——非线性函数拟合 第32章 小波神经网络的时间序列预测——短时交通流量预测 第33章 模糊神经网络的预测算法——嘉陵江...
  • 第30章基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章思维进化算法优化BP神经网络——非线性函数拟合 第32章小波神经网络的时间序列预测——短时交通流量预测 第33章模糊神经网络的预测算法——嘉陵江水质...
  • 第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章 思维进化算法优化BP神经网络——非线性函数拟合 第32章 小波神经网络的时间序列预测——短时交通流量预测 第33章 模糊神经网络的预测算法——嘉陵江...
  • 第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章 思维进化算法优化BP神经网络——非线性函数拟合 第32章 小波神经网络的时间序列预测——短时交通流量预测 第33章 模糊神经网络的预测算法——嘉陵江...
  • LBF运行程序

    2019-01-12 20:40:57
    这是一份matlab实现的关于LBF算法,改算法主要有两部分:1,LBF特征的提取。2,基于cascade的级联的随机森林做全局线性回归,有兴趣的可以一起讨论交流
  • 第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章 思维进化算法优化BP神经网络——非线性函数拟合 第32章 小波神经网络的时间序列预测——短时交通流量预测 第33章 模糊神经网络的预测算法——嘉陵江...
  • 决策树和随机森林 降维 吨SNE 图论算法 生成树 偏微分方程 压缩和扩展矩阵 压缩感测 矩阵完成 (用于无面部识别的个人资料图片) 波浪加工 马萨诸塞州 FTAN 双曲和线性相似 (查找信号方向) 地震沙滩球 云计算 饮...
  • 第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章 思维进化算法优化BP神经网络——非线性函数拟合 第32章 小波神经网络的时间序列预测——短时交通流量预测 第33章 模糊神经网络的预测算法——嘉陵江...
  • Milk是Python的一个机器学习工具箱,其重点是提供监督分类法与几种有效的分类分析:SVMs(基于libsvm),K-NN,随机森林经济和决策树。它还可以进行特征选择。这些分类可以在许多方面相结合,形成不同的分类系统。 ...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

随机森林回归算法matlab

matlab 订阅