1次元のおもちゃデータ用のSVR予測モデルを構築してmatplotlibでプロットするためにscikit-learnでコードを書きました。1次元データをフィットさせて線を予測する
青い線が真のデータです。線形カーネルのモデルは素敵な線に合っていますが、次数2のカーネルの予測は私が期待するものではありません。私はオレンジ色の線が予測している値より若干青い線の値を予測するモデルを持っていたいと思います。私は、私が気にしていたことを視覚化するために黒い線を描いた。
どうしてですか?データは次数2の多項式の良い候補のようです。真のデータに続く黒の傾向線は、緑の線が提供しているものよりもはるかによくフィットするはずです。プロット。そのようなモデルは、データに基づいて次数2の多項式で見つけるべきではありませんか?また、この曲線をより高い推定y値で持つ代わりに、青色線の近くのX = 0でうまく曲線化する。
私はどのようにしてモデルを作成できますか?
次のコードは、上記(マイナス塗装黒線)のプロットを得るためにそれを実行し、完全な自己完結型である
# some data
y = [0, 3642, 6414, 9844,, 16072, 18868, 22275, 25551, 28949, 31680, 34412, 37290, 39858, 42557,
45094, 47354, 49547, 51874, 54534, 55987, 55987, 58377, 60767, 63109, 65060, 66865, 68540, 70328,
72035, 73905, 75791, 77873, 79791, 81775, 83726]
X = range(0, len(y))
X_longer = range(0, len(y)*2)
# train models
from sklearn.svm import SVR
import numpy as np
clf_1 = SVR(kernel='poly', C=1e3, degree=1)
clf_2 = SVR(kernel='poly', C=1e3, degree=2)
clf_1.fit(np.array(X).reshape(-1, 1), y)
clf_2.fit(np.array(X).reshape(-1, 1), y)
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
# plot real data
plt.plot(X, y, linewidth=8.0, label='true data')
predicted_1_y = []
predicted_2_y = []
# predict data points based on models
for i in X_longer:
predicted_1_y.append(clf_1.predict(np.array([i]).reshape(-1, 1)))
predicted_2_y.append(clf_2.predict(np.array([i]).reshape(-1, 1)))
# plot model predictions
plt.plot(X_longer, predicted_1_y, linewidth=6.0, ls=":", label='model, degree 1')
plt.plot(X_longer, predicted_2_y, linewidth=6.0, ls=":", label='model, degree 2')
plt.legend(loc='upper left')
plt.show()
ちょうどそれがいつも上ったり下ったりすると、実際には何も説明されません。彼の希望するトレンドラインは、ある程度の距離が右になるまで下がらない二次トレンドになる可能性があります。 – BrenBarn
@BrenBarn私はそれが彼が最終的に望んでいるものに依存すると思う。モデルがどのように外挿するか、これほど難しい制約なしにデータを超えてどこを変えるかを制御するのは難しいです。 – Inverse
@BrenBarnが書いたことも私が想定したものです。上記のコードは実行されません。 '' TypeError:リストインデックスはタプルではなく整数でなければなりません。 – tkja