5 种不同模型的低训练 (~64%) 和测试准确率 (~14%)

Posted

技术标签:

【中文标题】5 种不同模型的低训练 (~64%) 和测试准确率 (~14%)【英文标题】:low training (~64%) and test accuracy (~14%) with 5 different models 【发布时间】:2019-11-24 07:03:21 【问题描述】:

我正在努力寻找一种适用于我的数据集的学习算法。

我正在处理一个典型的回归量问题。我关心的数据集中有 6 个特征。我的数据集中大约有 800 个数据点。特征和预测值具有很高的非线性相关性,因此这些特征并不是无用的(据我所知)。预测值呈双峰分布,因此我很快就忽略了线性模型。

所以我尝试了 5 种不同的模型:随机森林、额外树、AdaBoost、梯度提升和 xgb 回归器。训练数据集返回准确率,测试数据返回 11%-14%。这两个数字吓到我了哈哈。我尝试调整随机森林的参数,但似乎没有什么特别大的区别。

参数调整功能

def hyperparatuning(model, train_features, train_labels, param_grid = ):
    grid_search = GridSearchCV(estimator = model, param_grid = param_grid, cv = 3, n_jobs = -1, verbose =2)
    grid_search.fit(train_features, train_labels)
    print(grid_search.best_params_)
    return grid_search.best_estimator_`

评估模型的功能

def evaluate(model, test_features, test_labels):
    predictions = model.predict(test_features)
    errors = abs(predictions - test_labels)
    mape = 100*np.mean(errors/test_labels)
    accuracy = 100 - mape
    print('Model Perfomance')
    print('Average Error: :0.4f degress. '.format(np.mean(errors)))
    print('Accuracy = :0.2f%. '.format(accuracy))

我希望输出至少可以接受,但我得到的训练数据为 64%,测试数据为 12-14%。看到这个数字真的很恐怖!

【问题讨论】:

【参考方案1】:

目前,您正在过度拟合,因此您正在寻找的是正则化。例如,要减少作为树集合的模型的容量,您可以限制树的最大深度(max_depth),增加节点处拆分所需的最小样本数(min_samples_split),减少学习者(n_estimators)等

执行交叉验证时,您应该适应训练集并评估您的验证集,最佳配置应该是在验证集上表现最好的配置。您还应该保留一个测试集,以便根据全新的观察结果评估您的模型。

【讨论】:

【参考方案2】:

这是一个过拟合的问题。您非常适合您的训练数据的假设。 您的问题的可能解决方案:

    您可以尝试获取更多训练数据(不是特征)。 尝试不太复杂的模型,例如决策树,因为它非常复杂 模型(如随机森林、神经网络等)符合假设 训练数据很好。 交叉验证:它只允许您调整超参数 你原来的训练集。这使您可以将测试集保持为 用于选择最终模型的真正看不见的数据集。 正则化:该方法取决于您的学习者类型 使用。例如,您可以修剪决策树,使用 dropout 神经网络,或在成本函数中添加惩罚参数 回归。

我建议您使用管道功能,因为它可以让您同时执行多个模型。 一个例子:

pipe = Pipeline(steps=[('pca', pca), ('logistic', logistic)])
# Parameters of pipelines can be set using ‘__’ separated parameter names:
param_grid = 
    'pca__n_components': [5, 20, 30, 40, 50, 64],
    'logistic__alpha': np.logspace(-4, 4, 5),

search = GridSearchCV(pipe, param_grid, iid=False, cv=5)
search.fit(X_train, X_test)

【讨论】:

【参考方案3】:

我建议通过以更好的形式预处理数据来改进。尝试手动删除异常值,检查厨师距离的概念以查看对模型有高负面影响的元素。此外,您可以以与标准缩放不同的形式缩放数据,如果数据中的元素太大或太小,则使用对数缩放。或者使用DCT变换/ SVD变换等特征变换。

或者更简单地说,您可以使用现有数据创建自己的特征,例如,如果您在股票价格预测中将昨天收盘价和今天开盘价作为 2 个特征,您可以创建一个新特征来表示差异cost%,这对您的准确性有很大帮助。

进行一些线性回归分析以了解 Beta 值,以便更好地了解哪个特征对目标值的贡献更大。你也可以在随机森林中使用 feature_importances_ 来达到同样的目的,并尽可能地改进该特征,以便模型更好地理解。

这只是可以做的冰山一角。我希望这会有所帮助。

【讨论】:

我也是这么想的。感谢您确认我的想法! 我确实删除了异常值! 太棒了。如果我看到数据样本,我可以提出更好的方法。有时我们永远不知道,线性回归可能比这些复杂的东西更好。所以测试所有可能的方法:)【参考方案4】:

您的问题有几个问题。

对于初学者,您正试图在看似回归的问题中使用准确性,这毫无意义

虽然您没有提供确切的模型(可以说是个好主意),但评估函数中的这一行

errors = abs(predictions - test_labels)

实际上是mean absolute error 的基础(MAE - 尽管您实际上应该理解它的意思,顾名思义)。 MAE 和 MAPE 一样,确实是回归问题的性能指标;但是你接下来使用的公式

accuracy = 100 - mape

实际上并不成立,也没有在实践中使用。

确实,凭直觉,人们可能想要获得1-MAPE 数量;但这不是一个好主意,因为 MAPE 本身有很多缺点,严重限制了它的使用;这是来自Wikipedia的部分列表:

如果有零值(例如在需求数据中有时会发生),则不能使用它,因为会被零除。 对于过低的预测,误差百分比不能超过 100%,但对于过高的预测,误差百分比没有上限。

【讨论】:

非常感谢。我没有那样想。我只是盲目地遵循我朋友的做法。谢谢你。我还是个初学者。除了 MAE、RMSE、MSE 和 R2,您还推荐什么其他测试? @HangNguyen 前 3 个就足够了 - 忘记 R2 (详情请参阅我的答案的最后部分 here);并且非常欢迎您接受答案 - 请参阅What should I do when someone answers my question?(可以说,您至少应该对过去的一些问题也这样做)。 @HangNguyen 恕我直言,声称只是“它过度拟合 - 尝试 thisthat”并没有真正解决根本问题 哈哈,我同意。我想知道你还有什么建议我应该做的更好的预测?

以上是关于5 种不同模型的低训练 (~64%) 和测试准确率 (~14%)的主要内容,如果未能解决你的问题,请参考以下文章

5倍交叉验证如何理解

模型评估:模型状态评估

基于python如何建立人脸库

组合从多个模型中提取的特征集

如何最好地确定模型的准确性?重复训练/测试拆分或简历?

TensorFlow2 大幅提高模型准确率的神奇操作