三种拟合的汇总:
欠拟合:
实现思路:
我们可以新建一个二维的数据集,然后用一维线性回归去训练模型,训练效果就会不佳,也就是所谓的欠拟合(因为正常情况下我们应该用二维非线性函数去训练模型,现在用一个一元的,自然效果不会很好)
代码实现:
(1)导包
#第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
(2)新建数据集
#第二部分:创建数据集
np.random.seed(233)
x=np.random.uniform(-4,2,size=(100))
y=x**2+4*x+3+2*np.random.randn(100)
x=x.reshape(-1,1)
plt.scatter(x,y)
plt.show()
(3)实现欠拟合并输出结果
#第三部分:欠拟合实现
from sklearn.linear_model import LinearRegression
Linear_Regression=LinearRegression()
Linear_Regression.fit(x,y)
y_predict=Linear_Regression.predict(x)
plt.scatter(x,y)
plt.plot(x,y_predict,color='red')
plt.show()
score=Linear_Regression.score(x,y)
print(score)
(4)完整pycharm代码实现
#第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
#第二部分:创建数据集
np.random.seed(233)
x=np.random.uniform(-4,2,size=(100))
y=x**2+4*x+3+2*np.random.randn(100)
x=x.reshape(-1,1)
plt.scatter(x,y)
plt.show()
#第三部分:欠拟合实现
from sklearn.linear_model import LinearRegression
Linear_Regression=LinearRegression()
Linear_Regression.fit(x,y)
y_predict=Linear_Regression.predict(x)
plt.scatter(x,y)
plt.plot(x,y_predict,color='red')
plt.show()
score=Linear_Regression.score(x,y)
print(score)
正常拟合:
更改上面的(3)代码:
#第三部分:正常拟合情况
from sklearn.preprocessing import PolynomialFeatures
poly=PolynomialFeatures(degree=2)
x_poly=poly.fit_transform(x)
from sklearn.linear_model import LinearRegression
Linear_Regression=LinearRegression()
Linear_Regression.fit(x_poly,y)
y_predict=Linear_Regression.predict(x_poly)
plt.scatter(x, y,s=10)
plt.plot(np.sort(x, axis=0), y_predict[np.argsort(x, axis=0)], color='red')
plt.show()
score=Linear_Regression.score(x_poly,y)
print(score)
完整pycharm代码如下:
#第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
#第二部分:创建数据集
np.random.seed(233)
x=np.random.uniform(-4,2,size=(100))
y=x**2+4*x+3+2*np.random.randn(100)
x=x.reshape(-1,1)
plt.scatter(x,y)
#plt.show()
#第三部分:正常拟合情况
from sklearn.preprocessing import PolynomialFeatures
poly=PolynomialFeatures(degree=2)
x_poly=poly.fit_transform(x)
from sklearn.linear_model import LinearRegression
Linear_Regression=LinearRegression()
Linear_Regression.fit(x_poly,y)
y_predict=Linear_Regression.predict(x_poly)
plt.scatter(x, y,s=10)
plt.plot(np.sort(x, axis=0), y_predict[np.argsort(x, axis=0)], color='red')
plt.show()
score=Linear_Regression.score(x_poly,y)
print(score)
多项式回归也可以用另外一种方式来实现:
我们用自定义生成的曲线去拟合,同时训练的结果自带有序性,画图的时候不再需要使用sort和argsort了。
#第三部分:正常拟合情况
from sklearn.preprocessing import PolynomialFeatures
poly=PolynomialFeatures(degree=2)
x_poly=poly.fit_transform(x)
from sklearn.linear_model import LinearRegression
Linear_Regression=LinearRegression()
Linear_Regression.fit(x_poly,y)
X_new = np.linspace(-5, 3, 200).reshape(-1, 1) # 从-5到3生成200个点
X_new_poly = poly.fit_transform(X_new) # 使用fit_transform直接转换X_new
y_predict=Linear_Regression.predict(X_new_poly)
plt.scatter(x, y,s=10)
plt.plot(X_new , y_predict, color='red')
plt.show()
完整代码如下:
#第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
#第二部分:创建数据集
np.random.seed(233)
x=np.random.uniform(-4,2,size=(100))
y=x**2+4*x+3+2*np.random.randn(100)
x=x.reshape(-1,1)
plt.scatter(x,y)
#plt.show()
#第三部分:正常拟合情况
from sklearn.preprocessing import PolynomialFeatures
poly=PolynomialFeatures(degree=2)
x_poly=poly.fit_transform(x)
from sklearn.linear_model import LinearRegression
Linear_Regression=LinearRegression()
Linear_Regression.fit(x_poly,y)
X_new = np.linspace(-5, 3, 200).reshape(-1, 1) # 从-5到3生成200个点
X_new_poly = poly.fit_transform(X_new) # 使用fit_transform直接转换X_new
y_predict=Linear_Regression.predict(X_new_poly)
plt.scatter(x, y,s=10)
plt.plot(X_new , y_predict, color='red')
plt.show()
过拟合代码实现:
过拟合尝尝表现为:在训练集上的训练效果越来越好,但是一拿到测试集上的时候,效果就变得非常的差,在现实生活中,就好比一个学生,把书中的知识点全部背完了,但很可能并不知道怎么做的,那么出它背过的题肯定正确率非常高,但是出新题由于没有掌握技巧,就会出错。
过拟合代码修改的是上面的第三部分:
# 第三部分:过拟合情况
plt.rcParams['figure.figsize'] = (12, 8)
degrees = [2, 5, 10, 15, 20, 24]
for i, degree in enumerate(degrees):
from sklearn.preprocessing import PolynomialFeatures
polynomial_features = PolynomialFeatures(degree=degree)
X_poly = polynomial_features.fit_transform(x)
from sklearn.linear_model import LinearRegression
linear_regression = LinearRegression()
linear_regression.fit(X_poly, y)
X_new = np.linspace(-5, 3, 200).reshape(-1, 1) # 从-5到3生成200个点
X_new_poly = polynomial_features.fit_transform(X_new) # 使用fit_transform直接转换X_new
y_predict = linear_regression.predict(X_new_poly)
plt.subplot(2, 3, i + 1)
plt.title("Degree: {0}".format(degree))
plt.scatter(x, y, s=10)
plt.ylim(-5, 25)
plt.plot(X_new, y_predict, color='red')
print("Degree:", degree, "Score:", linear_regression.score(X_poly, y))
plt.show()
完整代码如下:
# 第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
# 第二部分:创建数据集
np.random.seed(233)
x = np.random.uniform(-4, 2, size=(100))
y = x ** 2 + 4 * x + 3 + 2 * np.random.randn(100)
x = x.reshape(-1, 1)
plt.scatter(x, y)
# plt.show()
# 第三部分:过拟合情况
plt.rcParams['figure.figsize'] = (12, 8)
degrees = [2, 5, 10, 15, 20, 24]
for i, degree in enumerate(degrees):
from sklearn.preprocessing import PolynomialFeatures
polynomial_features = PolynomialFeatures(degree=degree)
X_poly = polynomial_features.fit_transform(x)
from sklearn.linear_model import LinearRegression
linear_regression = LinearRegression()
linear_regression.fit(X_poly, y)
X_new = np.linspace(-5, 3, 200).reshape(-1, 1) # 从-5到3生成200个点
X_new_poly = polynomial_features.fit_transform(X_new) # 使用fit_transform直接转换X_new
y_predict = linear_regression.predict(X_new_poly)
plt.subplot(2, 3, i + 1)
plt.title("Degree: {0}".format(degree))
plt.scatter(x, y, s=10)
plt.ylim(-5, 25)
plt.plot(X_new, y_predict, color='red')
print("Degree:", degree, "Score:", linear_regression.score(X_poly, y))
plt.show()