精华内容
下载资源
问答
  • 随机森林回归matlab代码,可用于回归和分类,简单易用
  • 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);
    
    
    

    实验结果

    模型的相关系数
    输入变量的重要性
    展开全文
  • R语言 随机森林回归

    2017-08-30 19:13:07
    主要利用R语言进行随机森林回归,还有其他两种回归, library(lattice) library(grid) library(DMwR) library(rpart) library(ipred) library(randomForest) #回归树,装袋算法,随机森林三大回归 #前二种算法可以...
  • 随机森林回归实验

    2020-05-04 13:38:46
    随机森林回归实验 文章目录随机森林回归实验实验说明实验步骤可视化 实验说明 sklearn包里已经实现了随机森林回归模型,导入使用即可。 数据集我们使用的是 sklearn包中自带的波士顿房价数据集。 实验环境:...

    随机森林回归实验

    实验说明

    sklearn包里已经实现了随机森林回归模型,导入使用即可。

    数据集我们使用的是 sklearn包中自带的波士顿房价数据集。

    • 实验环境:Anaconda3+VScode
    • Python版本:3.7
    • 需要的第三方库:sklearn、matplotlib、numpy

    实验步骤

    一个简单的随机森林回归实验同样分为六个步骤:

    1. 加载数据集
    2. 拆分数据集
    3. 创建模型
    4. 在训练集学习得到模型
    5. 模型预测
    6. 模型评测

    关于训练集和测试集的划分我们使用的是留出法,最后的结果我们使用四项指标来进行评估:

    • 平均绝对误差
    • 均方误差
    • 解释方差分
    • R2得分

    这一步用到的第三方库是 sklearn。

    代码如下:

    from sklearn.datasets import load_boston
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.metrics import mean_absolute_error
    from sklearn.metrics import mean_squared_error
    from sklearn.metrics import explained_variance_score
    from sklearn.metrics import r2_score
    #1.加载数据集
    boston_data = load_boston()
    # print(boston_data)
    #2.拆分数据集
    x = boston_data.data
    y = boston_data.target
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=10);
    #3.创建模型
    rfr = RandomForestRegressor(random_state=10, max_depth=8)
    #4.获取在训练集的模型
    rfr.fit(x_train, y_train)
    #5.预测结果
    rfr_predict = rfr.predict(x_test)
    #6.模型评测
    mae = mean_absolute_error(y_test, rfr_predict)
    mse = mean_squared_error(y_test, rfr_predict)
    evs = explained_variance_score(y_test, rfr_predict)
    r2 = r2_score(y_test, rfr_predict)
    print("平均绝对误差MAE:{}".format(mae))
    print("均方误差MSE:{}".format(mse))
    print("解释方差分EVS:{}".format(evs))
    print("R2得分:{}".format(r2))
    

    可以看到,得到的四项指标为:平均绝对误差为2.78,均方误差为14.24,解释方差分为0.86,R2得分为0.86
    m6

    可视化

    我们将刚才训练的随机森林,借助散点图进行可视化。

    这一步需要的第三方库是 sklearn、matplotlib、numpy。

    代码如下:

    from sklearn.datasets import load_boston
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.metrics import mean_absolute_error
    from sklearn.metrics import mean_squared_error
    from sklearn.metrics import explained_variance_score
    from sklearn.metrics import r2_score
    import matplotlib.pyplot as plt
    from matplotlib.colors import ListedColormap
    import numpy as np
    #1.加载数据集
    boston_data = load_boston()
    # print(boston_data)
    #2.拆分数据集
    x = boston_data.data
    y = boston_data.target
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=10)
    #3.创建模型
    rfr = RandomForestRegressor(random_state=10, max_depth=8)
    #4.获取在训练集的模型
    rfr.fit(x_train, y_train)
    #5.预测结果
    rfr_predict = rfr.predict(x_test)
    #6.模型评测
    mae = mean_absolute_error(y_test, rfr_predict)
    mse = mean_squared_error(y_test, rfr_predict)
    evs = explained_variance_score(y_test, rfr_predict)
    r2 = r2_score(y_test, rfr_predict)
    print("平均绝对误差MAE:{}".format(mae))
    print("均方误差MSE:{}".format(mse))
    print("解释方差分EVS:{}".format(evs))
    print("R2得分:{}".format(r2))
    # 设置散点颜色
    point_color = ListedColormap(['#FF0000', '#00FF00'])
    # 设置坐标轴
    y_min, y_max = y_test.min()-1,y_test.max()+1
    xx = np.arange(0,102,1)
    yy = y_test
    yy.sort()
    z = rfr_predict
    z.sort()
    # print(xx.shape)
    # print(yy.shape)
    # print(z.shape)
    
    # 创建图片
    plt.figure()
    plt.scatter(xx, yy, cmap=point_color, edgecolors='black')
    plt.scatter(xx, z, cmap=point_color, edgecolors='black')
    # 绘制刻度
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    # 设置标题
    plt.title("RandomForestRegressor")
    # 展示图表
    plt.grid(True)
    plt.show()
    

    散点图展示:
    m7

    可以看到,散点的分布位置贴合较近,模型训练得还不错。

    展开全文
  • 随机森林回归算法

    千次阅读 2019-11-20 16:48:11
    随机森林回归算法原理 随机森林回归模型由多棵回归树构成,且森林中的每一棵决策树之间没有关联,模型的最终输出由森林中的每一棵决策树共同决定。 随机森林的随机性体现在两个方面: 1、样本的随机性,从训练集中...

    随机森林回归算法原理

    随机森林回归模型由多棵回归树构成,且森林中的每一棵决策树之间没有关联,模型的最终输出由森林中的每一棵决策树共同决定。
    随机森林的随机性体现在两个方面:
    1、样本的随机性,从训练集中随机抽取一定数量的样本,作为每颗回归树的根节点样本;

    2、特征的随机性,在建立每颗回归树时,随机抽取一定数量的候选特征,从中选择最合适的特征作为分裂节点。
    算法原理如下:
    (a)从训练样本集S中随机的抽取m个样本点,得到一个新的S1…Sn个子训练集;

    (b)用子训练集,训练一个CART回归树(决策树),这里在训练的过程中,对每个节点的切分规则是先从所有特征中随机的选择k个特征,然后在从这k个特征中选择最优的切分点在做左右子树的划分。(这里的得到决策树都是二叉树)

    (c)通过第二步,可以生成很多个CART回归树模型。

    (d)每一个CART回归树最终的预测结果为该样本点所到叶节点的均值。

    (e)随机森林最终的预测结果为所有CART回归树预测结果的均值。

    随机森林建立回归树的特点:采样与完全分裂

    首先是两个随机采样的过程,随机森林对输入的数据要进行行(样本)、列(特征)的采样。对于样本采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。

    假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现过拟合over-fitting。

    然后进行特征采样,从M个Features中,选择m个(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出回归树

    一般情况下,回归树算法都一个重要的步骤 – 剪枝,但是在随机森林思想里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。

    每一棵回归树就是一个精通于某一个窄领域的专家(因为我们从M个feature中选择m让每一棵回归树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,

    对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家得出自己的结果,最后将得到结果取均值即可。

    随机森林的基学习器并不是弱学习器而是强学习器,是有很高深度的强决策树组成的。

    CART回归树

    CART回归树,采用的原则是最小均方差(MSE)。即对于任意划分特征A,对应的任意划分点s两边划分成的数据集D1和D2,求出使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小所对应的特征和特征值划分点。表达式为:
    在这里插入图片描述
    其中:c1为D1数据集的样本输出均值,c2为D2数据集的样本输出均值。
    CART回归树的预测是根据叶子结点的均值,因此随机森林的预测是所有树的预测值的平均值。

    展开全文
  • 用Python实现随机森林回归

    千次阅读 多人点赞 2020-11-02 13:19:38
    这里就对如何进行随机森林回归在算法上进行概述,在参数上进行详述。希望对你的工作有所帮助。 这里,将介绍如何在Python中构建和使用Random Forest回归,而不是仅仅显示代码,同时将尝试了解模型的工作原理。 1.1 ...

    1 介绍

    使用Scikit-Learn模块在Python实现任何机器学习算法都比较简单,并且不需要了解所有细节。这里就对如何进行随机森林回归在算法上进行概述,在参数上进行详述。希望对你的工作有所帮助。
    这里,将介绍如何在Python中构建和使用Random Forest回归,而不是仅仅显示代码,同时将尝试了解模型的工作原理。

    1.1 随机森林概述

    随机森林是一种基于集成学习的监督式机器学习算法。集成学习是一种学习类型,可以多次加入不同类型的算法或相同算法,以形成更强大的预测模型。随机森林结合了多个相同类型的算法,即多个决策的树木,故名“随机森林”。

    1.2 理解决策树

    决策树是随机森林的构建块,它本身就是个直观的模型。我们可以将决策树视为询问有关我们数据问题的流程图。这是一个可解释的模型,因为它决定了我们在现实生活中的做法:在最终得出决定之前,我们会询问有关数据的一系列问题。

    随机森林是由许多决策树组成的整体模型。通过对每个决策树的预测平均来进行预测。就像森林是树木的集合一样,随机森林模型也是决策树模型的集合。这使随机森林成为一种强大的建模技术,它比单个决策树要强大得多。
    随机森林中的每棵树都在对数据子集进行训练。其背后的基本思想是在确定最终输出时组合多个决策树,而不是依赖于各个决策树。每个决策树都有很高的方差,但是当我们将所有决策树并行组合在一起时,由于每个决策树都针对特定样本数据进行了完美的训练,因此结果方差很低,因此输出不依赖于一个决策树而是多个决策树木。对于回归问题,最终输出是所有决策树输出的平均值。

    1.3 随机森林工作过程概述

    1. 从数据集中随机选择N个样本子集。
    2. 基于这N个样本子集构建决策树。
    3. 选择算法中所需树的棵数,然后重复步骤1和2。

    对于回归问题,森林中的每棵树都将预测Y值(输出)。通过取森林中所有决策树预测值的平均值来计算最终值。

    1.4 Bootstrapping&Bagging

    Bootstrapping

    Bootstrapping算法,指的就是利用有限的样本资料经由多次重复抽样。如:在原样本中有放回的抽样,抽取n次。每抽一次形成一个新的样本,重复操作,形成很多新样本。
    随机森林就是采用在每个随机样本上训练决策树。尽管每棵树相对于一组特定的训练数据可能有很大的差异,但总体而言,整个森林的方差都很小。

    Bagging

    随机森林在不同的随机选择的样本子集上训练每个决策树,然后对预测取平均以进行整体预测。这个过程被称为Bagging。

    2 随机森林优缺点

    2.1 随机森林回归的优点

    在机器学习领域,随机森林回归算法比其他常见且流行的算法更适合回归问题。

    1. 要素和标签之间存在非线性或复杂关系。
    2. 它对训练集中噪声不敏感,更利于得到一个稳健的模型。随机森林算法比单个决策树更稳健,因为它使用一组不相关的决策树。
    3. 避免产生过拟合的模型。

    2.2 随机森林的缺点

    1. 随机森林的主要缺点在于其复杂性。由于需要将大量决策树连接在一起,因此它们需要更多的计算资源。
    2. 由于其复杂性,与其他同类算法相比,它们需要更多的时间进行训练。

    2.3 随机森林的过拟合问题

    欠拟合、合适与过拟合,如下图所示。当出现过拟合情况时候,对于训练数据模型表现良好,测试数据模型表现肯定较差。机器学习是比较容易出现过拟合的。对于随机森林的过拟合问题分为两派,会产生过拟合与不会过拟合。

    在这里插入图片描述
    不会过拟合:
    在Leo Breiman(随机森林算法的创建者)论文《Random Forests》中的表述:
    在这里插入图片描述
    在这里插入图片描述
    会过拟合:
    问题描述,一部分数据(数据的90%)作为训练样本,一部分(10%)作为测试样本,发现训练样本的R2一直在0.85,而测试样本R2都只有0.5几,高的也就0.6几。
    对于这个问题,也很有可能是自变量与因变量之间本身关系就很低产生了过拟合假象。

    3 使用随机森林回归实践

    在本节中,我们将研究如何使用Scikit-Learn将随机森林用于解决回归问题。

    3.1 问题描述

    根据汽油税(美分),人均收入(美元),高速公路(以英里为单位)和人口所占比例来预测美国48个州的汽油消耗量(百万加仑)。
    为了解决这个回归问题,采用Scikit-Learn 中的随机森林算法。

    3.2 样本数据

    例子数据集可在以下位置获得(需要KeXueShangWang才可以打开):
    https://drive.google.com/file/d/1mVmGNx6cbfvRHC_DvF12ZL3wGLSHD9f_/view
    在这里插入图片描述

    3.3 代码

    相关的解释说明都在代码中进行了注释

    import pandas as pd
    import numpy as np
    
    # 导入数据,路径中要么用\\或/或者在路径前加r
    dataset = pd.read_csv(r'D:\Documents\test_py\petrol_consumption.csv')
    
    # 输出数据预览
    print(dataset.head())
    
    # 准备训练数据
    # 自变量:汽油税、人均收入、高速公路、人口所占比例
    # 因变量:汽油消耗量
    X = dataset.iloc[:, 0:4].values
    y = dataset.iloc[:, 4].values
    
    # 将数据分为训练集和测试集
    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(X,
                                                        y,
                                                        test_size=0.2,
                                                        random_state=0)
    
    # 特征缩放,通常没必要
    # 因为数据单位,自变量数值范围差距巨大,不缩放也没问题
    from sklearn.preprocessing import StandardScaler
    
    sc = StandardScaler()
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)
    
    # 训练随机森林解决回归问题
    from sklearn.ensemble import RandomForestRegressor
    
    regressor = RandomForestRegressor(n_estimators=200, random_state=0)
    regressor.fit(X_train, y_train)
    y_pred = regressor.predict(X_test)
    
    # 评估回归性能
    from sklearn import metrics
    
    print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
    print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
    print('Root Mean Squared Error:',
          np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
    
    

    输出结果

      Petrol_tax  Average_income  Paved_Highways  Population_Driver_licence(%)  Petrol_Consumption
    0         9.0            3571            1976                         0.525                 541
    1         9.0            4092            1250                         0.572                 524
    2         9.0            3865            1586                         0.580                 561
    3         7.5            4870            2351                         0.529                 414
    4         8.0            4399             431                         0.544                 410
    Mean Absolute Error: 48.33899999999999
    Mean Squared Error: 3494.2330150000003
    Root Mean Squared Error: 59.112037818028234
    

    4 Sklearn随机森林回归参数详解

    要了解sklearn.ensemble.RandomForestRegressor每个参数的意义,我们需要从函数定义入手,具体介绍还得看官网介绍:

    sklearn.ensemble.RandomForestRegressor(
    n_estimators=100, *, 				# 树的棵树,默认是100
    criterion='mse', 					# 默认“ mse”,衡量质量的功能,可选择“mae”。
    max_depth=None, 					# 树的最大深度。
    min_samples_split=2, 				# 拆分内部节点所需的最少样本数:
    min_samples_leaf=1, 				# 在叶节点处需要的最小样本数。
    min_weight_fraction_leaf=0.0, 		# 在所有叶节点处的权重总和中的最小加权分数。
    max_features='auto', 				# 寻找最佳分割时要考虑的特征数量。
    max_leaf_nodes=None, 				# 以最佳优先方式生长具有max_leaf_nodes的树。
    min_impurity_decrease=0.0, 			# 如果节点分裂会导致杂质的减少大于或等于该值,则该节点将被分裂。
    min_impurity_split=None, 			# 提前停止树木生长的阈值。
    bootstrap=True, 					# 建立树木时是否使用bootstrap抽样。 如果为False,则将整个数据集用于构建每棵决策树。
    oob_score=False, 					# 是否使用out-of-bag样本估算未过滤的数据的R2。
    n_jobs=None, 						# 并行运行的Job数目。
    random_state=None, 					# 控制构建树时样本的随机抽样
    verbose=0, 							# 在拟合和预测时控制详细程度。
    warm_start=False, 					# 设置为True时,重复使用上一个解决方案,否则,只需拟合一个全新的森林。
    ccp_alpha=0.0,
    max_samples=None)					# 如果bootstrap为True,则从X抽取以训练每个决策树。
    

    5 随机森林可视化

    5.1 代码

    import sklearn.datasets as datasets
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.pipeline import Pipeline
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.decomposition import PCA
    
    # 导入数据,路径中要么用\\或/或者在路径前加r
    dataset = pd.read_csv(r'D:\Documents\test_py\petrol_consumption.csv')
    
    # 输出数据预览
    print(dataset.head())
    
    # 准备训练数据
    # 自变量:汽油税、人均收入、高速公路、人口所占比例
    # 因变量:汽油消耗量
    X = dataset.iloc[:, 0:4].values
    y = dataset.iloc[:, 4].values
    
    # 将数据分为训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X,
                                                        y,
                                                        test_size=0.2,
                                                        random_state=0)
    regr = RandomForestRegressor()
    # regr = RandomForestRegressor(random_state=100,
    #                              bootstrap=True,
    #                              max_depth=2,
    #                              max_features=2,
    #                              min_samples_leaf=3,
    #                              min_samples_split=5,
    #                              n_estimators=3)
    pipe = Pipeline([('scaler', StandardScaler()), ('reduce_dim', PCA()),
                     ('regressor', regr)])
    pipe.fit(X_train, y_train)
    ypipe = pipe.predict(X_test)
    
    from six import StringIO
    from IPython.display import Image
    from sklearn.tree import export_graphviz
    import pydotplus
    import os
    
    # 执行一次
    # os.environ['PATH'] = os.environ['PATH']+';'+r"D:\CLibrary\Graphviz2.44.1\bin\graphviz"
    dot_data = StringIO()
    export_graphviz(pipe.named_steps['regressor'].estimators_[0],
                    out_file=dot_data)
    graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
    graph.write_png('tree.png')
    Image(graph.create_png())
    
    
    

    5.2 GraphViz’s executables not found报错解决方案

    参考博文
    在这里插入图片描述

    5.3 InvocationException: GraphViz’s executables not found 解决方案

    参考博文

    在这里插入图片描述

    5.4 随机森林可视化

    X[0], X[1], X[2], X[3], X[4]…分别为对应的自变量。 从结构化可以看到mse逐渐减小。这里一共是12层树,实际工作中可能远大于这里的例子。
    在这里插入图片描述

    5.5 变量重要性

    通过变量重要性评价,可以删除那些不重要的变量,并且性能不会受到影响。另外,如果我们使用不同的机器学习方法(例如支持向量机),则可以将随机森林特征重要性用作一种特征选择方法。

    为了量化整个随机森林中所有变量对模型的贡献,我们可以查看变量的相对重要性。 Skicit-learn中返回的重要性表示包含特定变量可以提高预测。 重要性的实际计算超出了本文的范围,这里仅对模型输出重要性数值进行使用。

    # Get numerical feature importances
    importances = list(regr.feature_importances_)
    # List of tuples with variable and importance
    print(importances)
    
    # Saving feature names for later use
    feature_list = list(dataset.columns)[0:4]
    
    feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list, importances)]
    # Sort the feature importances by most important first
    feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True)
    # Print out the feature and importances 
    # [print('Variable: {:20} Importance: {}'.format(*pair)) for pair in feature_importances];
    
    # Import matplotlib for plotting and use magic command for Jupyter Notebooks
    
    import matplotlib.pyplot as plt
    # Set the style
    # plt.style.use('fivethirtyeight')
    # list of x locations for plotting
    x_values = list(range(len(importances)))
    print(x_values)
    # Make a bar chart
    plt.bar(x_values, importances, orientation = 'vertical')
    # Tick labels for x axis
    plt.xticks(x_values, feature_list,rotation=6)
    # Axis labels and title
    plt.ylabel('Importance'); plt.xlabel('Variable'); plt.title('Variable Importances');
    plt.show()
    
    

    在这里插入图片描述

    参考
    https://stackabuse.com/random-forest-algorithm-with-python-and-scikit-learn/
    https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html
    https://towardsdatascience.com/random-forest-in-python-24d0893d51c0
    添加链接描述

    展开全文
  • 随机森林随机回归预测 数据集 (The Data Set) In order to demonstrate a random forest regression, a data set of e-commerce sales from popular online retailer, Wish, will be used. The data comes from ...
  • python随机森林回归数据实战

    千次阅读 2020-11-12 11:51:53
    文章目录前言一、随机森林回归器参数介绍二、数据实战1.数据介绍2.重点代码2.1特征集和标签集获取2.2数据集划分2.3随机森林模型训练2.4预测结果可视化2.5 特征重要性选择及可视化3.完整代码总结 前言 我为什么写这...
  • matlab软件随机森林回归模型代码,可直接matlab打开运行!精简版,包括数据导入、模型建立、误差计算、保存模型,绘制对比图的多个功能!
  • 训练随机森林回归模型 RandomForestRegressor bootstrap 表示是够有放回抽样,还是不放回抽样 # 训练随机森林回归模型 RandomForestRegressor from sklearn.ensemble import RandomForestRegressor from sklearn ...
  • 随机森林回归模型 万事俱备,我们可以来建立随机森林模型啦,首先导入工具包,先建立1000个树试试吧,其他参数先用默认值,之后我们会再深入到调参任务中: # 导入算法 from sklearn.ensemble import ...
  • sklearn实现随机森林回归预测

    千次阅读 2020-05-14 15:55:10
    sklearn实现随机森林回归预测 import numpy as np import matplotlib.pyplot as plt from sklearn import ensemble def gen_data(x1, x2): # 生成数据 y = np.sin(x1) * 0.1 + np.cos(x2) * 0.4 + 0.1 * x1 ...
  • 随机森林回归应用中遇到的问题

    万次阅读 2017-04-21 11:09:08
    随机森林算法的应用本人在做kaggle的house prices题目时用到了随机森林回归的算法,遇到了一些问题,现在记录下来。 随机森立对于线性相关的特征是否有影响? 特征简化后效果会变好,为什么? 随机森林算法原理见...
  • 1.随机森林回归 1.1数据集 此处采用波士顿房价数据集(可直接调用),训练特征为13个,输出标签为MEDV。 数据截图如下, 1.2 代码实现 from sklearn.ensemble import RandomForestRegressor import numpy as np ...
  • 文章目录随机森林回归填补缺失值导入需要的库导入数据集 随机森林回归填补缺失值 我们从现实中收集的数据,几乎不可能是完美的,往往都会有一些缺失值,很多人选择的是直接将含有缺失值的样本直接删除,这是一种...
  • MATLAB随机森林回归模型

    千次阅读 2016-03-06 17:36:00
    MATLAB随机森林回归模型: 调用matlab自带的TreeBagger.m T=textread('E:\datasets-orreview\discretized-regression\10bins\abalone10\matlab\test_abalone10.2'); X=textread('E:\datasets-orreview\...
  • 随机森林回归和多输出元估计器对于多元回归数据的回归及效果对比 An example to compare multi-output regression with random forest and themultioutput.MultiOutputRegressormeta-estimator. # 比较多输出...
  • 针对神经网络算法在当前PM2.5浓度预测领域存在的易过拟合、网络结构复杂、学习效率低等问题,引入RFR(random forest regression,随机森林回归)算法,分析气象条件、大气污染物浓度和季节所包含的22项特征因素,...
  • 随机森林回归python实现

    千次阅读 2019-10-25 18:38:34
    随机回归森林是由多个完全独立的回归决策树voting完成的,单个决策树的训练采用的是bagging,是集成学习中比较经典,效果较好的方法,可以作为baseline. from sklearn.datasets import load_iris import numpy as ...
  • 随机森林回归:随机森林是一种目标估计,通过对数据集上的部分样本形成一个分类决策树,并使用averaging去提高预测准确率和控制过拟合发生。 class sklearn.ensemble.RandomForestRegressor(n_estimators=10, ...
  • sklearn随机森林回归器类的格式 sklearn.ensemble.RandomForestRegressor (n_estimators=’warn’, criterion=’mse’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, ...
  • Breiman 发明的随机森林的原理并不复杂, 和 bagging 类似, 它对原始数据集做很多次放回抽样, 每次抽取和样本量同样多的观测值, 由于是放回抽样, 每次都有一些观测值没有抽到, 一些观测值会重复抽到, 如此会得到很多...
  • 这里我们将对波士顿房价的原始数据进行处理,在数据中人为添加一些缺失值,然后根据分三种情况:①用0填补缺失值,②均值填补,③用随机森林填补,之后分别构建随机森林回归,计算MSE,并做可视化。 1.导入相应包 ...
  • 在scikit-learn中,有一个专门填充的类,专门将均值,中值,或其他数值填充,比如还有0值填充,随机森林回归填充,来分别验证拟合状况,来找出此数据集最佳的缺失值填补方式。 假如我们还是使用回归数据来做测试,...
  • 使用了三种集成回归模型 git:https://github.com/linyi0604/MachineLearning 代码: 1 from sklearn.datasets import load_boston 2 from sklearn.cross_validation import train_test_split 3 f...
  • 随机森林回归 交叉验证 feature重要性 美化feature贡献度柱状图 图4.2. 绘制时间序列热图 猜你喜欢 写在后面 写在前面 之前分享了3月底发表的的 《水稻微生物组时间序列分析》的文章,大家对其中图绘制...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,310
精华内容 12,524
关键字:

随机森林回归