45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
from sklearn.linear_model import LinearRegression, Ridge, Lasso
|
|
from sklearn.preprocessing import PolynomialFeatures
|
|
from sklearn.model_selection import train_test_split
|
|
from sklearn.pipeline import make_pipeline
|
|
from sklearn.utils import resample
|
|
from sklearn import preprocessing
|
|
|
|
|
|
np.random.seed(2018)
|
|
|
|
n = 40
|
|
n_boostraps = 100
|
|
maxdegree = 14
|
|
|
|
|
|
# Make data set.
|
|
x = np.linspace(-3, 3, n).reshape(-1, 1)
|
|
x = preprocessing.scale(x)
|
|
y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.normal(0, 0.1, x.shape)
|
|
error = np.zeros(maxdegree)
|
|
bias = np.zeros(maxdegree)
|
|
variance = np.zeros(maxdegree)
|
|
polydegree = np.zeros(maxdegree)
|
|
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
|
|
|
|
for degree in range(maxdegree):
|
|
model = make_pipeline(PolynomialFeatures(degree=degree), LinearRegression(fit_intercept=False))
|
|
y_pred = np.empty((y_test.shape[0], n_boostraps))
|
|
for i in range(n_boostraps):
|
|
x_, y_ = resample(x_train, y_train)
|
|
y_pred[:, i] = model.fit(x_, y_).predict(x_test).ravel()
|
|
|
|
polydegree[degree] = degree
|
|
error[degree] = np.mean( np.mean((y_test - y_pred)**2, axis=1, keepdims=True) )
|
|
bias[degree] = np.mean( (y_test - np.mean(y_pred, axis=1, keepdims=True))**2 )
|
|
variance[degree] = np.mean( np.var(y_pred, axis=1, keepdims=True) )
|
|
|
|
plt.plot(polydegree, error, label='Error')
|
|
plt.plot(polydegree, bias, label='bias')
|
|
plt.plot(polydegree, variance, label='Variance')
|
|
plt.legend()
|
|
plt.show()
|