机器学习之欠拟合和过拟合代码实现

三种拟合的汇总:

欠拟合:

实现思路:

我们可以新建一个二维的数据集,然后用一维线性回归去训练模型,训练效果就会不佳,也就是所谓的欠拟合(因为正常情况下我们应该用二维非线性函数去训练模型,现在用一个一元的,自然效果不会很好)

代码实现:

(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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值