0

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

我正在处理一个典型的回归量问题。我关心的数据集中有 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%。看到这个数字真的很恐怖!

4

4 回答 4

1

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

  1. 您可以尝试获取更多训练数据(不是特征)。
  2. 尝试不太复杂的模型,如决策树,因为高度复杂的模型(如随机森林、神经网络等)在训练数据上很好地拟合了假设。
  3. 交叉验证:它允许您仅使用原始训练集调整超参数。这使您可以将测试集保留为真正看不见的数据集,以选择最终模型。
  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)
于 2019-07-15T17:12:22.353 回答
1

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

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

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

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

于 2019-07-16T02:59:24.400 回答
1

你的问题有几个问题。

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

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

errors = abs(predictions - test_labels)

实际上是平均绝对误差的基础(MAE——尽管你实际上应该取它的平均值,顾名思义)。MAE 和 MAPE 一样,确实是回归问题的性能指标;但是你接下来使用的公式

accuracy = 100 - mape

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

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

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

目前,您正在过度拟合,因此您正在寻找的是正则化。例如,要减少作为树集合的模型的容量,您可以限制树的最大深度max_depthmin_samples_splitn_estimators

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

于 2019-07-15T15:10:19.193 回答