①课程介绍
课程名称:Python3入门机器学习 经典算法与应用 入行人工智能
课程章节:8-3;8-4;8-5
主讲老师:liuyubobobo
内容导读
- 第一部分 过拟合与欠拟合
- 第二部分 学习曲线
- 第三部分
- 第四部分
②课程详细
第一部分 过拟合与欠拟合
在上一章用很方便的手段进行了多项式回归,但是在多项式回归=4,最后的图片看得出,曲线有一点歪,并且往着不适合这个数据的方向进行拟合,这种情况是对这个数据进行过度地拟合而导致训练出地模型没有可靠的泛化能力,对新数据没有很好地准确率。
导入函数
import numpy as np
import matplotlib.pyplot as plt
导入函数
np.random.seed(666)
x = np.random.uniform(-3.0, 3.0, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, size=100)
可视化数据
plt.scatter(x, y)
plt.show()
先不进行多项式拟合,用线性回归进行拟合,看看数据会是什么样的
线性回归
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X, y)
lin_reg.score(X, y)
0.4953707811865009
准确率也不高
对拟合的曲线进行可视化处理
y_predict = lin_reg.predict(X)
plt.scatter(X,y)
plt.plot(np.sort(X, axis=0), y_predict[np.argsort(X, axis=0)].reshape(-1,1), color='r')
plt.show()
这就是典型的欠拟合,缺欠
接下来使用多项式回归,进行过拟合的展示
封装管道,集成了多项式回归,归一化,线性回归
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
def PlolynomialRegression(degree):
return Pipeline([
("poly",PolynomialFeatures(degree=degree)),
("stand_scaler",StandardScaler()),
("lin_reg",LinearRegression())
])
训练对象
poly2_reg = PlolynomialRegression(2)
poly2_reg.fit(X, y)
进行可视化
plt.scatter(X, y)
plt.plot(np.sort(X, axis=0), y2_predict[np.argsort(X, axis=0)].reshape(-1,1), color='r')
plt.show()
这种是刚刚好合适的,
当把degree提高到100次冥
训练对象
poly3_reg = PlolynomialRegression(100)
poly3_reg.fit(X, y)
可视化
plt.scatter(X, y)
plt.plot(np.sort(X, axis=0), y3_predict[np.argsort(X, axis=0)].reshape(-1,1), color='r')
plt.show()
从这个数据的角度来说,数据拟合的很好,因为和某些数据几乎无缝贴合,可惜我们的目标是,创建一个普适模型,显然这个模型用于别的数据就会产生很大的误差,这种情况就是过拟合,
第二部分 学习曲线
在低维的情况下可以使用可视化进行观察,但是X维度高了之后就不好进行可视化,这时候可以使用学习曲线,来观察是否过拟合
数据预处理
import numpy as np
import matplotlib.pyplot as plt
创建对象
np.random.seed(666)
x = np.random.uniform(-3.0, 3.0, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, size=100)
plt.scatter(x, y)
plt.show()
对数据进行分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
创建学习曲线
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
train_score = []
test_score = []
for i in range(1, 76):
lin_reg = LinearRegression()
lin_reg.fit(X_train[:i,], y_train[:i,])
y_train_predict = lin_reg.predict(X_train[:i,])
y_test_predict = lin_reg.predict(X_test[:i,])
train_score.append(mean_squared_error(y_train[:i,], y_train_predict))
test_score.append(mean_squared_error(y_test[:i,], y_test_predict))
对学习曲线进行可视化
plt.plot([i for i in range(len(train_score))], np.sqrt(train_score), label='train')
plt.plot([i for i in range(len(test_score))], np.sqrt(test_score), label='test')
plt.legend()
plt.axis([0, 20 ,0, 6])
plt.show()
封装成一个自动绘制学习曲线的图
def plot_learning_curve(algo, X_train, X_test, y_train, y_test):
from sklearn.metrics import mean_squared_error
train_score = []
test_score = []
for i in range(1, len(X_train)+1):
algo.fit(X_train[:i,], y_train[:i,])
y_train_predict = algo.predict(X_train[:i,])
y_test_predict = algo.predict(X_test[:i,])
train_score.append(mean_squared_error(y_train[:i,], y_train_predict))
test_score.append(mean_squared_error(y_test[:i,], y_test_predict))
plt.plot([i for i in range(1, len(train_score)+1)], np.sqrt(train_score), label='train')
plt.plot([i for i in range(1, len(test_score)+1)], np.sqrt(test_score), label='test')
plt.legend()
plt.axis([0, len(X_train) ,0, 4])
plt.show()
plot_learning_curve(LinearRegression(), X_train, X_test, y_train, y_test)
进行多项式回归
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
def PolynomialRegression(degree):
return Pipeline([
("poly",PolynomialFeatures(degree=degree)),
("stand_scaler",StandardScaler()),
("lin_reg",LinearRegression())
])
定义三种多项式回归的数据情况
poly2_reg = PolynomialRegression(2)
poly10_reg = PolynomialRegression(10)
poly30_reg = PolynomialRegression(30)
plot_learning_curve(poly2_reg, X_train, X_test, y_train, y_test)
plot_learning_curve(poly10_reg, X_train, X_test, y_train, y_test)
plot_learning_curve(poly30_reg, X_train, X_test, y_train, y_test)
③课程思考
- 欠拟合与过拟合的判断是机器学习领域中重要的话题,欠拟合与过拟合如何进行调整,都是很重要的