2016-01-18 134 views
2

我对建模技术有点新,我试图比较SVR和线性回归。我用f(x)= 5x + 10的线性函数来生成训练和测试数据集。我已经写了下面的代码片段至今:建模支持向量回归(SVR)与线性回归

import csv 
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.linear_model import LinearRegression 

with open('test.csv', 'r') as f1: 
    train_dataframe = pd.read_csv(f1) 

X_train = train_dataframe.iloc[:30,(0)] 
y_train = train_dataframe.iloc[:30,(1)] 

with open('test.csv','r') as f2: 
    test_dataframe = pd.read_csv(f2) 

X_test = test_dataframe.iloc[30:,(0)] 
y_test = test_dataframe.iloc[30:,(1)] 

svr = svm.SVR(kernel="rbf", gamma=0.1) 
log = LinearRegression() 
svr.fit(X_train.reshape(-1,1),y_train) 
log.fit(X_train.reshape(-1,1), y_train) 

predSVR = svr.predict(X_test.reshape(-1,1)) 
predLog = log.predict(X_test.reshape(-1,1)) 

plt.plot(X_test, y_test, label='true data') 
plt.plot(X_test, predSVR, 'co', label='SVR') 
plt.plot(X_test, predLog, 'mo', label='LogReg') 
plt.legend() 
plt.show() 

正如你可以在图片中看到,线性回归工作正常,但SVM具有较差的预测精度。

enter image description here

请让我知道,如果你的任何建议,以解决这一问题。

感谢

+0

当我使用R(与包e1071这仅仅是一个结合LIBSVM)做同样的事情(即SVM回归与RBF内核)我得到合理的结果。我怀疑是因为python相关的原因,或者它与SVR和/或内核的超参数的默认设置(gamma,epsilon,cost C,...)有关...... –

+0

@araz,did你设法解决它亲爱的?我坚持相同的问题,你可以在这里看到它(http://stackoverflow.com/questions/40529975/support-vector-regression-prediction-graph),我会很感激你的帮助。 – Mahsolid

回答

3

请参阅下面的代码:

import numpy as np 
import pandas as pd 
from sklearn.linear_model import LinearRegression 
from sklearn.svm import SVR 
from sklearn.cross_validation import train_test_split 

X = np.linspace(0,100,101) 
y = np.array([(100*np.random.rand(1)+num) for num in (5*x+10)]) 

X_train, X_test, y_train, y_test = train_test_split(X, y) 

svr = SVR(kernel='linear') 
lm = LinearRegression() 
svr.fit(X_train.reshape(-1,1),y_train.flatten()) 
lm.fit(X_train.reshape(-1,1), y_train.flatten()) 

pred_SVR = svr.predict(X_test.reshape(-1,1)) 
pred_lm = lm.predict(X_test.reshape(-1,1)) 

plt.plot(X,y, label='True data') 
plt.plot(X_test[::2], pred_SVR[::2], 'co', label='SVR') 
plt.plot(X_test[1::2], pred_lm[1::2], 'mo', label='Linear Reg') 
plt.legend(loc='upper left'); 

enter image description here

你无处可去是原因rbf内核

+1

感谢您的好解决方案。我已经尝试过'linear'内核,它的工作原理非常完美。我的问题是,为什么它不适用于'rbf'? – arazx

+2

@Araz这也是一个让我困惑的好问题。 '度'高于1的'聚'核或者不会产生可接受的解决方案。 “度数= 1”的“多边形”在最小二乘方面不产生最佳解。所有这些让我困惑。我建议重写一下这样的问题,比如“为什么内核不是'线性'不适用于这个玩具数据集”,并将其发布到CrossValidated中,并且可以使用上面的代码生成漂亮的图片。 –

+0

我也很疑惑!这让我感到困惑,为什么SVR为这样一个简单的数据集失败。伟大的建议。我肯定会分享这个问题。 – arazx

3

原因是SVR与核径向基不应用特征缩放。在将数据拟合到模型之前,您需要应用特征缩放。

示例代码特征缩放

from sklearn.preprocessing import StandardScaler 
sc_X = StandardScaler() 
X = sc_X.fit_transform(X) 
sc_y = StandardScaler() 
y = sc_y.fit_transform(y)