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

2024-05-29 10:25:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力寻找一个适合我的数据集的学习算法。你知道吗

我正在处理一个典型的回归问题。我关心的数据集中有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%。看到这些数字真是太可怕了!你知道吗


Tags: 数据模型testsearchlabelsmodelparamtrain
3条回答

你的问题有几个问题。你知道吗

对于初学者来说,您试图在一个似乎是回归的问题中使用准确性,这是一个无意义的问题。你知道吗

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

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.

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

或者更简单地说,你可以用现有的数据创建你自己的特征,例如,如果你在股票价格预测中把最新收盘价和今天开盘价作为两个特征,你可以创建一个新的特征,表示成本%的差异,这对你的准确度有很大帮助。你知道吗

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

这只是冰山一角的冰可以做什么。我希望这有帮助。你知道吗

这是一个安装过度的问题。你在训练数据上很好地拟合了这个假设。 您问题的可能解决方案:

  1. 您可以尝试获取更多的训练数据(而不是特征)。你知道吗
  2. 尝试像决策树这样不太复杂的模型,因为它非常复杂 模型(如随机森林、神经网络等)符合这一假设 很好的训练数据。你知道吗
  3. 交叉-v验证:允许您只需要使用 你原来的训练装备。这允许您将测试集保持为 一个真正看不见的数据集,用于选择最终模型。你知道吗
  4. 调节器光化:方法取决于你的学习者类型 使用。例如,可以修剪决策树,在 一个神经网络,或在成本函数中加入一个惩罚参数 回归。你知道吗

我建议您使用pipeline函数,因为它允许您同时执行多个模型。 例如:

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)

相关问题 更多 >

    热门问题