【发布时间】:2018-08-12 03:37:22
【问题描述】:
我有一个数据集,其中包含用于训练的510 样本和用于测试的127 样本,每个样本都有7680 特征。我想设计一个模型来预测来自训练数据的高度(cm)标签。目前,我使用了 SVM,但它提供了非常糟糕的结果。你能看看我的代码并给我一些cmets。您可以使用dataset 和可运行代码在您的机器上试用它
import numpy as np
from sklearn.svm import SVR
# Training Data
train_X = np.loadtxt('trainX.txt') # 510 x 7680
train_Y = np.loadtxt('trainY.txt') # 510 x 1
test_X = np.loadtxt('testX.txt') # 127 x 7680
test_Y = np.loadtxt('testY.txt') # 127 x 1
my_svr = SVR(C=1000, epsilon=0.2)
my_svr.fit(train_X,train_Y)
p_regression = my_svr.predict(test_X)
print (p_regression)
print (test_Y)
一些结果:
p_regression
[15.67367165 16.35094166 13.10510262 14.03943211 12.7116549 11.45071423
13.27225207 9.44959181 10.45775627 13.23953143 14.95568324 11.35994414
10.69531821 12.42556347 14.54712287 12.25965911 9.04101931 14.03604126
12.41237627 13.51951317 10.36302674 9.86389635 11.41448842 15.67146184
14.74764672 11.22794536 12.04429175 12.48199183 14.29790809 16.21724184
10.94478135 9.68210872 14.8663311 8.62974573 15.17281425 12.97230127
9.46515876 16.24388177 10.35742683 15.65336366 11.04652502 16.35094166
14.03943211 10.29066405 13.27225207 9.44959181 10.45775627 13.23953143
14.95568324 11.35994414 10.69531821 12.42556347 14.54712287 12.25965911
9.04101931 14.03604126 12.41237627 13.51951317 10.36302674 9.86389635
11.41448842 15.67146184 14.74764672 11.22794536 12.04429175 12.48199183
14.29790809 16.21724184 10.94478135 9.68210872 14.8663311 8.62974573
15.17281425 12.97230127 9.46515876 16.24388177 10.35742683 15.65336366
11.04652502 16.35094166 14.03943211 10.29066405 13.27225207 9.44959181
10.45775627 13.23953143 14.95568324 11.35994414 10.69531821 12.42556347
14.54712287 12.25965911 9.04101931 14.03604126 12.41237627 13.51951317
10.36302674 9.86389635 11.41448842 15.67146184 14.74764672 11.22794536
12.04429175 12.48199183 14.29790809 16.21724184 10.94478135 9.68210872
14.8663311 8.62974573 15.17281425 12.97230127 9.46515876 16.24388177
10.35742683 15.65336366 11.04652502 16.35094166 14.03943211 10.29066405
13.27225207 9.44959181 10.45775627 13.23953143 14.95568324 11.35994414
10.69531821]
test_Y
[13. 14. 13. 15. 15. 17. 13. 17. 16. 12. 17. 6. 4. 3. 4. 6. 6. 8.
9. 18. 3. 6. 4. 6. 7. 8. 11. 11. 13. 12. 12. 14. 13. 12. 15. 15.
16. 15. 17. 18. 17. 14. 15. 17. 13. 17. 16. 12. 17. 6. 4. 3. 4. 6.
6. 8. 9. 18. 3. 6. 4. 6. 7. 8. 11. 11. 13. 12. 12. 14. 13. 12.
15. 15. 16. 15. 17. 18. 17. 14. 15. 17. 13. 17. 16. 12. 17. 6. 4. 3.
4. 6. 6. 8. 9. 18. 3. 6. 4. 6. 7. 8. 11. 11. 13. 12. 12. 14.
13. 12. 15. 15. 16. 15. 17. 18. 17. 14. 15. 17. 13. 17. 16. 12. 17. 6.
4.]
【问题讨论】:
-
最可能的原因是您只训练了一个 SVM 模型而没有进行任何类型的超参数优化。只是碰巧那些特定的超参数值对这些数据不利。当然,使用这些预测变量无法预测结果的情况总是存在的。
-
@George:谢谢。但是我尝试了一些超参数设置,但并没有提供好的结果。您认为我们可以使用其他方法代替 SVM 来完成我的任务吗?你更喜欢哪种方法?
-
一个好的初始起点是使用随机森林(使用默认参数,但我一般会使用约 500-1000 棵树)。它们比 SVM 更容易调整,并且通常表现得足够好。我确实这样做了,但似乎无法获得好的结果;我的 MSE 为 21.7。有趣的是,在训练集上,我得到了 5.2 的袋外 MSE。这表明测试集存在“错误”。可能,测试数据分布与训练数据有很大不同。为了测试这一点,我创建了新的训练/测试数据并运行模型。这次我的 MSE 约为 5.1。
-
很高兴听到这个消息。你能分享你的代码吗?
-
我合并了训练集和测试集,并使用 510/127 样本拆分再次拆分它们。这样做并使用默认参数运行随机森林,我得到了 5.1。我尝试了不同的随机分割并得到了〜5.7,所以也许我只是在那里很幸运。 @Jame 的一个问题:您是否对训练数据进行了任何类型的预处理?你有没有机会进行特征选择?
标签: python machine-learning scikit-learn svm linear-regression