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

low training (~64%) and test accuracy (~14%) with 5 different models

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

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

所以我尝试了 5 种不同的模型:随机森林、额外的树、AdaBoost、梯度提升和 xgb 回归器。训练数据集 returns 准确率和测试数据 returns 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%。看到这个数字真是太恐怖了!

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

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

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

  1. 您可以尝试获取更多训练数据(不是特征)。
  2. 尝试不太复杂的模型,例如决策树,因为它非常复杂 模型(如随机森林、神经网络等)符合假设 很好的训练数据。
  3. Cross-validation:它允许你只用调整超参数 你原来的训练集。这允许您将测试集保持为 一个真正看不见的数据集,用于选择您的最终模型。
  4. 正则化:方法将取决于你的学习者类型 使用。例如,您可以修剪决策树,使用 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)

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

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

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

这只是 ice-berg 可以完成的工作的一小部分。希望对您有所帮助。

你的问题有几个问题。

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

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

errors = abs(predictions - test_labels)

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

accuracy = 100 - mape

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

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

的部分列表
  • It cannot be used if there are zero values (which sometimes happens for example in demand data) because there would be a division by zero.
  • For forecasts which are too low the percentage error cannot exceed 100%, but for forecasts which are too high there is no upper limit to the percentage error.