2016-09-27 3 views
0
train.sort_values(by=['mass'], ascending=True, inplace=True) 
x = train['mass'] 
y = train['pa'] 

# Fit regression model 
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1) 
svr_lin = SVR(kernel='linear', C=1e3) 
svr_poly = SVR(kernel='poly', C=1e3, degree=2) 
x_train = x.reshape(x.shape[0], 1) 
x = x_train 
y_rbf = svr_rbf.fit(x, y).predict(x) 
y_lin = svr_lin.fit(x, y).predict(x) 
y_poly = svr_poly.fit(x, y).predict(x) 

# look at the results 
plt.scatter(x, y, c='k', label='data') 
plt.hold('on') 
plt.plot(x, y_rbf, c='g', label='RBF model') 
plt.plot(x, y_lin, c='r', label='Linear model') 
plt.plot(x, y_poly, c='b', label='Polynomial model') 
plt.xlabel('data') 
plt.ylabel('target') 
plt.title('Support Vector Regression') 
plt.legend() 
plt.show() 

コードはhttp://scikit-learn.org/stable/auto_examples/svm/plot_svm_regression.htmlからコピーされます。 私が変えるのはデータセットだけです。私は何が問題なのか分かりません。データが線形でないときに、python scikit-learnによってSVRを使用して線形回帰を取得します。

+0

あなたの質問のコードをよりよくフォーマットしてください。 –

答えて

0

ほとんどの場合、データの規模に関係します。この例では、同じペナルティのハイパーパラメータを使用していますが、yの値は大きさの大きい順です。したがって、SVRアルゴリズムは、エラーに対するペナルティがy値に比べて小さくなっているため、精度より単純さを優先します。 1e6と言うにはCを増やす(またはyの値を正規化する)必要があります。

例コードでCを非常に小さくした場合、これは、C=.00001と言われています。それで、あなたはあなたのコードで得ているのと同じ種類の結果を得ます。

(アルゴリズム​​の詳細。)

側の注意点としては、機械学習の実践の巨大な部分は、ハイパーパラメータチューニングです。これは、間違ったハイパーパラメータが与えられた場合、良いベースモデルでも悪い結果が得られる可能性のある良い例です。

+0

ありがとう。私は実際にCを1e6に変更すると結果が得られます。ハイパーパラメータは結果に大きな影響を与えます。私はできるだけ早くハイパーパラメータチューニングを学ぶ必要があります。もう一度ありがとう! –

+0

ゲーリー、私は助けることができてうれしい。答えがあなたの質問にうまく答えたと感じたら、答えを受け入れてください(チェックマークをクリックしてください) – scomes

+0

は今チェックされていますか? –

関連する問題