本博客参考书籍:《scikit-learn机器学习:常用算法原理及编程实战》
本博客源码地址:码云
步骤
- 生成200个在
[
−
2
π
,
2
π
]
[-2\pi,2\pi]
[−2π,2π]区间内的正弦函数点,并给这些点添加一些噪声
- 使用reshape()函数转换数组形式
- 使用PolynomialFeatures和Pipeline创建一个多项式拟合模型
- 分别使用2、3、5、10阶多项式拟合数据集
- 可视化呈现训练结果
代码实现
# 生成具有正弦函数特征的200个点
n=200
x=np.linspace(-2*np.pi,2*np.pi,n)
y=np.sin(x)+np.random.rand(n)-0.1
x=x.reshape(-1,1)
y=y.reshape(-1,1)
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
# 定义一个能够生成多项式模型的函数
def polynomial_model(degree=1):
polynomial_feature=PolynomialFeatures(degree=degree,include_bias=False)
linear_regression=LinearRegression(normalize=True)
pipeline=Pipeline([('poly_feature',polynomial_feature),('linear_gree',linear_regression)])
return pipeline
生成多个不同阶数的多项式模型,对模型进行训练
degrees=[2,3,5,10]
results=[]
for d in degrees:
model=polynomial_model(degree=d)
model.fit(x,y)
train_score=model.score(x,y)
mean_error=mean_squared_error(y,model.predict(x))
results.append({'模型':model,'训练评分':train_score,'均方根误差':mean_error,'模型阶数':d})
我们可以看到训练结果,对于拟合正弦函数这个问题,多项式阶数越高,训练评分越高,均方根误差越低
接下来我们将模型结果以可视化的形式呈现
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False
plt.subplots_adjust(hspace=0.5)
plt.figure(figsize=(12,6),dpi=200)
for i,r in enumerate(results):
plt.subplot(2,2,i+1)
plt.title('模型阶数:{}'.format(r['模型阶数']))
plt.scatter(x,y,s=5,alpha=0.5)
plt.plot(x,r['模型'].predict(x),'r--')
plt.show()
运行结果,我们发现10阶多项式几乎能够完全表现出正弦函数的图像特点