4

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()

今私の質問は、サポートベクター回帰モデルでこのデータセットをうまく使用した人はいますか、それとも私が間違っていることを知っていますか?私はあなたの提案にとても感謝しています!

上記のスクリプトの結果は次のとおりです。 load_bostonデータセットで実行した結果

4

1 に答える 1

8

カーネルをからrbfに変更linearすると、問題が解決します。を使用する場合はrbf、特にの場合に、いくつかの異なるパラメータを試してくださいgamma。デフォルトgamma1/# features)はあなたの場合には大きすぎます。

ここに画像の説明を入力してください

これは私が線形カーネルに使用したパラメータですSVR

svr = SVR(kernel='linear', C=1.0, epsilon=0.2)

トレーニングデータラベルとテストデータラベルの両方をプロットしました。トレーニングデータの分布が均一ではないことに気付くかもしれません。これにより、モデルにはトレーニング用のデータが不足します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])

これは私が得るものです:

ここに画像の説明を入力してください

視覚的には、予測エラーの観点から、両方のリグレッサーの方が見栄えがします。

rbfカーネルの実際の例を次に示しますSVR

svr = SVR(kernel='rbf',  C=1.0, epsilon=0.2, gamma=.0001)

結果は次のようになります。

ここに画像の説明を入力してください

于 2013-01-29T21:30:38.630 に答える