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 恕我直言,声称只是“它过度拟合 - 尝试 this 和 that”并没有真正解决根本问题 哈哈,我同意。我想知道你还有什么建议我应该做的更好的预测?以上是关于5 种不同模型的低训练 (~64%) 和测试准确率 (~14%)的主要内容,如果未能解决你的问题,请参考以下文章