過学習のテンプレとして出てくる。
データの生成
コード
予測する曲線のデータと、それにノイズを乗せたデータを生成します。
import matplotlib.pyplot as plt import seaborn import numpy as np def random_data(N, err=2.0, rseed=1): X = np.random.rand(N, 1) ** 3 y = 1. / (X.ravel() + 0.1) if err > 0: y += err * np.random.randn(N) return X, y x, y = random_data(200) true_x, true_y = random_data(2000, err=0) predicted_line = np.linspace(-0.1, 1.1, 100)[:, None]
グラフ上にプロット
plt.scatter(x.ravel(), y, color='#444444', alpha=.7) plt.scatter(true_x.ravel(), true_y, color='#00DD00', alpha=.4)
フィッテング
1,2,3,4,5,10,20,30
次元の多項式でフィッティングを行いました。
次元が高くなってくると、すべての点を通過しようとして曲線の波が激しくなっていることがわかります。
axis = plt.axis(figsize=(10, 10)) for degree in [1,2,3,4,5,10,20,30]: y_test = PolynomialRegression(degree).fit(x, y).predict(predicted_line) plt.plot(predicted_line.ravel(), y_test, ':', label='degree={0}'.format(degree)) plt.xlim(-0.1, 1.0) plt.ylim(-2, 12) plt.scatter(x.ravel(), y, color='#444444', alpha=.7) plt.scatter(true_x.ravel(), true_y, color='#00DD00', alpha=.4) plt.legend(loc='best');