66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
from sklearn.model_selection import train_test_split
|
|
import xgboost as xgb
|
|
from sklearn.preprocessing import StandardScaler
|
|
import scikitplot as skplt
|
|
from sklearn.metrics import mean_squared_error
|
|
|
|
|
|
def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.5, -1, 1.5], alpha=0.5, contour=True):
|
|
x1s = np.linspace(axes[0], axes[1], 100)
|
|
x2s = np.linspace(axes[2], axes[3], 100)
|
|
x1, x2 = np.meshgrid(x1s, x2s)
|
|
X_new = np.c_[x1.ravel(), x2.ravel()]
|
|
y_pred = clf.predict(X_new).reshape(x1.shape)
|
|
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
|
|
plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
|
|
if contour:
|
|
custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])
|
|
plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)
|
|
plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", alpha=alpha)
|
|
plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", alpha=alpha)
|
|
plt.axis(axes)
|
|
plt.xlabel(r"$x_1$", fontsize=18)
|
|
plt.ylabel(r"$x_2$", fontsize=18, rotation=0)
|
|
|
|
n = 500
|
|
maxdegree = 8
|
|
|
|
# Make data set.
|
|
x = np.linspace(-3, 3, n).reshape(-1, 1)
|
|
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)
|
|
scaler = StandardScaler()
|
|
scaler.fit(X_train)
|
|
X_train_scaled = scaler.transform(X_train)
|
|
X_test_scaled = scaler.transform(X_test)
|
|
|
|
for degree in range(maxdegree):
|
|
model = xgb.XGBRegressor(objective ='reg:squarederror', colsample_bytree = 0.3, learning_rate = 0.1,
|
|
max_depth = degree, alpha = 10, n_estimators = 10)
|
|
model.fit(X_train_scaled,y_train)
|
|
y_pred = model.predict(X_test_scaled)
|
|
polydegree[degree] = degree
|
|
error[degree] = np.mean( np.mean((y_test - y_pred)**2) )
|
|
bias[degree] = np.mean( (y_test - np.mean(y_pred))**2 )
|
|
variance[degree] = np.mean( np.var(y_pred) )
|
|
print('Polynomial degree:', degree)
|
|
print('Error:', error[degree])
|
|
print('Bias^2:', bias[degree])
|
|
print('Var:', variance[degree])
|
|
print('{} >= {} + {} = {}'.format(error[degree], bias[degree], variance[degree], bias[degree]+variance[degree]))
|
|
|
|
plt.xlim(1,maxdegree-1)
|
|
plt.plot(polydegree, error, label='Error')
|
|
plt.plot(polydegree, bias, label='bias')
|
|
plt.plot(polydegree, variance, label='Variance')
|
|
plt.legend()
|
|
plt.show()
|
|
|