当训练数据明显显示模式时,Sklearn svr会给出错误的结果

时间:2018-04-13 12:14:07

标签: python scikit-learn

我有以下培训数据:

double

以及以下标签(分数):

x = [
    [0.914728682,5.217,5,0.217,3.150362319,33.36,35,-1.64,4.220113852],
    [0.885057471,7.793,8,-0.207,3.380911063,46.84,48,-1.16,4.448243115],
    [0.871345029,7.152,7,0.152,3.976205037,44.98,47,-2.02,5.421236592],
    [0.821428571,8.04,8,0.04,2.909880565,52.02,54.5,-2.48,2.824104235],
    [0.931372549,8.01,8,0.01,4.616714697,48.04,48,0.04,9.650462033],
    [0.66367713,5.424,5.5,-0.076,1.37804878,32.6,35.5,-2.9,1.189781022],
    [0.78,8.66,9,-0.34,2.272965879,48.47,55,-6.53,2.564550265],
    [0.227272727,19.55,21,-1.45,1.860133206,128.23,147,-18.77,1.896893491],
    [0.47826087,10.09,8,2.09,1.155519927,74.43,64,10.43,1.169547454],
    [0.652694611,6.775,4,2.775,1.05529595,43.1,30,13.1,1.062885327],
    [0.798561151,3.986,2,1.986,0.656563993,25.38,13,12.38,0.652442159],
    [0.666666667,5.419,3,2.419,1.057985162,34.37,16,18.37,0.981719509],
    [0.5625,7.719,2,5.719,0.6421797,46.91,12,34.91,0.665673336]
]

似乎很清楚,第5列和第9列中的值越大,得分越高。

我在提供的训练数据上编写了以下代码,使用了SVR:

y = [0.237113402,0.168831169,0.104166667,0.086419753,0.063147368,0.016042781,
     0.014814815,0,0,-0.0794,-0.14,-0.1832,-0.2385]

但无论以下哪一项用于预测,都不会给出看起来正确的分数。

1得分= model.predict(rb.fit_transform(testData))

2得分= model.predict(testData)

如果我在训练期间做了以下类似的事情:

rb = RobustScaler()
xScaled = rb.fit_transform(x)
model = SVR(C=1.0, epsilon=0.1)
model.fit(xScaled,y)

然后:
     得分= svmModel.predict(testData)

我回到原点附近的东西。

但是我在x中选择一行,将其放入一个名为testData的一行的二维数组中,然后执行:

 xScaled = preprocessing.scale(x)
 model = SVR(C=1.0, epsilon=0.1)
 model.fit(xScaled,y)

我得分错了。事实上,无论我使用哪一行来创建一行的2d数组,我都得到相同的分数。

我做错了什么?如果有人可以提供帮助,我将非常感激。

1 个答案:

答案 0 :(得分:1)

1)score = model.predict(rb.fit_transform(testData))

执行上述操作时,您将重新拟合RobustScaler到新数据。这意味着它将扩展到新数据,并且不会与训练数据的比例相匹配。所以结果不会很好。

2)score = model.predict(testData)

在上面,您没有缩放测试数据,因此它与SVC学到的不同。因此,结果也会很糟糕。

您需要做什么: -

score = model.predict(rb.transform(testData))

调用transform()将根据训练数据比例缩放提供的数据,因此SVC可以更好地预测输出。