【问题标题】:How do you plot learning curves for Random Forest models?你如何绘制随机森林模型的学习曲线?
【发布时间】:2016-07-12 12:32:18
【问题描述】:

在 Andrew Ng 的机器学习课程之后,我想尝试他绘制学习曲线(成本与样本数量)的方法,以评估对额外数据样本的需求。但是,对于随机森林,我对如何绘制学习曲线感到困惑。随机森林似乎没有基本的成本函数,例如线性回归,所以我不确定在 y 轴上究竟使用什么。

【问题讨论】:

    标签: machine-learning random-forest


    【解决方案1】:

    您可能在这里混淆了几个类别。

    首先,在机器学习中,learning curve 定义为

    将性能与经验相关联的图...。性能是学习系统的错误率或准确度,而经验可能是用于学习的训练示例的数量或用于优化系统模型参数的迭代次数。

    随机森林和线性模型都可以用于回归或分类。

    • 对于回归,成本通常是预测和信号之间差异的 l2 范数 (although sometimes the l1 norm) 的函数。

    • 对于分类,代价通常是不匹配或对数丢失。

    关键是,这不是底层机制是线性模型还是森林的问题。您应该确定它是什么类型的问题,以及成本函数是什么。在决定之后,绘制学习曲线只是信号和预测的函数。

    【讨论】:

    • 我正在使用它进行分类,所以我猜那么成本是错误还是 logloss?这是我用来绘制学习曲线与样本数量的关系吗?
    • @user123959 是的。这些将是非常合乎逻辑的选择。
    • 谢谢。最后一件事,你能解释一下我在另一个堆栈溢出问题 (stats.stackexchange.com/questions/78590/…) 上读到的这条评论:“请永远不要考虑在拟合 RF 时查看训练错误(大多数其他 ML 方法都不是)——正如 user31264 提到的那样,这个数字根本没有意义。如果您需要基于训练集的误差近似值,请使用 OOB 误差。因为这就是为什么我认为绘制成本函数的相同方法不适用于随机森林。
    • 是的,这是一个非常重要且正确的评论。它指出您永远不应该评估模型在用于训练它的数据上的性能。这种表现几乎没有任何意义。在学习曲线率的情况下,这意味着您应该保留一些数据,每次都在一些其他数据(不同大小)上进行训练,并在保留的数据上对其进行测试。有意义吗?
    • 但我认为学习曲线的重点是绘制训练集和测试集/CV 集的性能,以查看是否存在差异问题。 IE。如果训练集和测试集学习曲线之间存在很大差距,那么肯定存在方差问题等。
    【解决方案2】:

    您可以使用此功能绘制任何一般估计器(包括随机森林)的学习曲线。不要忘记更正缩进。

    import matplotlib.pyplot as plt
    
    def learning_curves(estimator, data, features, target, train_sizes, cv):
        train_sizes, train_scores, validation_scores = learning_curve(
        estimator, data[features], data[target], train_sizes = train_sizes,
        cv = cv, scoring = 'neg_mean_squared_error')
        train_scores_mean = -train_scores.mean(axis = 1)
        validation_scores_mean = -validation_scores.mean(axis = 1)
    
        plt.plot(train_sizes, train_scores_mean, label = 'Training error')
        plt.plot(train_sizes, validation_scores_mean, label = 'Validation error')
        plt.ylabel('MSE', fontsize = 14)
        plt.xlabel('Training set size', fontsize = 14)
        title = 'Learning curves for a ' + str(estimator).split('(')[0] + ' model'
        plt.title(title, fontsize = 18, y = 1.03)
        plt.legend()
        plt.ylim(0,40)
    

    使用此函数绘制学习曲线:

    from sklearn.ensemble import RandomForestRegressor
    plt.figure(figsize = (16,5))
    model = RandomForestRegressor()
    plt.subplot(1,2,i)
    learning_curves(model, data, features, target, train_sizes, 5)
    

    【讨论】:

      猜你喜欢
      • 2016-10-16
      • 2016-08-03
      • 2013-11-27
      • 2018-09-21
      • 2019-12-07
      • 1970-01-01
      • 2015-09-23
      • 2020-08-03
      • 2012-09-04
      相关资源
      最近更新 更多