支持向量 - /Logistic - 回归:你有波士顿住房数据的基准测试结果吗?

sur*_*chs 4 python regression machine-learning scikit-learn

我将通过在sklearn(sklearn.datasets.load_boston)附带的波士顿房价数据集上运行它来测试我的sklearn支持向量回归包的实现.

在玩了一段时间后(尝试不同的正则化和管参数,案例的随机化和交叉验证)并且始终如一地预测扁平线我现在对于失败的地方感到茫然.更引人注目的是,当我使用也附带sklearn.datasets包(load_diabetes)的糖尿病数据集时,我得到了更好的预测.

这是复制的代码:

import numpy as np
from sklearn.svm import SVR
from matplotlib import pyplot as plt
from sklearn.datasets import  load_boston
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression

# data = load_diabetes()
data = load_boston()
X = data.data
y = data.target

# prepare the training and testing data for the model
nCases = len(y)
nTrain = np.floor(nCases / 2)
trainX = X[:nTrain]
trainY = y[:nTrain]
testX  = X[nTrain:]
testY = y[nTrain:]

svr = SVR(kernel='rbf', C=1000)
log = LinearRegression()

# train both models
svr.fit(trainX, trainY)
log.fit(trainX, trainY)

# predict test labels from both models
predLog = log.predict(testX)
predSvr = svr.predict(testX)

# show it on the plot
plt.plot(testY, testY, label='true data')
plt.plot(testY, predSvr, 'co', label='SVR')
plt.plot(testY, predLog, 'mo', label='LogReg')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:有没有人成功地将这个数据集用于支持向量回归模型,或者知道我做错了什么?我非常感谢你的建议!

以下是上述脚本的结果: 在load_boston数据集上运行的结果

gre*_*ess 8

改变从内核rbflinear就能解决问题.如果您想使用rbf,请尝试一些不同的参数,尤其是gamma.默认情况下gamma(1/# features)对于您的情况来说太大了.

在此输入图像描述

这是我用于线性内核的参数SVR:

svr = SVR(kernel='linear', C=1.0, epsilon=0.2)
Run Code Online (Sandbox Code Playgroud)

我绘制了训练数据标签和测试数据标签.您可能会注意到训练数据的分布不均匀.这使得模型缺乏训练数据5 < y < 15.所以我做了一些数据的洗牌,并将训练数据设置为使用66%的数据.

nTrain = np.floor(nCases *2.0 / 3.0)
import random
ids = range(nCases)
random.shuffle(ids)

trainX,trainY,testX,testY = [],[],[],[]
for i, idx in enumerate(ids):
    if i < nTrain:
        trainX.append(X[idx])
        trainY.append(y[idx])
    else:
        testX.append(X[idx])
        testY.append(y[idx])
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

在此输入图像描述

在预测误差方面,对于两个回归量来说,它看起来更好.

这是rbf内核的一个工作示例SVR:

svr = SVR(kernel='rbf',  C=1.0, epsilon=0.2, gamma=.0001)
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述