#-*- coding:utf-8 -*-
#学习目标:以“披萨饼价格预测”为例,认识欠拟合和过拟合的问题
#假定只考虑披萨的尺寸和售价的关系,X为尺寸,y代表售价
X_train = [[6],[8],[10],[14],[18]]
y_train = [[7],[9],[13],[17.5],[18]]
#*************************************************************************************
#1.首先以一次线性回归函数进行预测
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train,y_train)
import numpy as np
#在X轴上从0~25均匀采样100个数据点
xx = np.linspace(0,26,100)
xx = xx.reshape(xx.shape[0],1)
#以上述100个数据点为基准,预测回归直线
yy = lr.predict(xx)
#对回归预测到的直线进行作图
import matplotlib.pyplot as plt
#scatter()功能:绘制散点图,c='r'表示点的颜色为red,marker表示点的形状'o'是默认的圆
# b---blue c---cyan g---green k----black m---magenta r---red w---white y---yellow
plt.scatter(X_train,y_train,c='r',marker='o')
#plot()功能:绘制折线图,同样可以设置颜色样式,color属性和linestyle属性
plt1,= plt.plot(xx,yy)
#确定坐标范围:plt.axis([xmin, xmax, ymin, ymax])
#xlim(xmin, xmax)和ylim(ymin, ymax)来调整x,y坐标范围
plt.axis([0,25,0,25])
plt.xlabel('Diameter of Pizza')
plt.ylabel('Price of Pizza')
#注意legend的参数形式,第二个参数,字符串放在()里面,并且当只有一个参数时,要在结尾加上‘,’
plt.legend([plt1],('Degree=1',),'best')
plt.show()
#输出线性回归模型在<训练样本>上的r2-score
print 'The R-squared value of lr is ',lr.score(X_train,y_train)
#The R-squared value of lr is 0.910001596424
#*************************************************************************************
#2.接下来以二次多项式回归函数进行预测
#将原特征升高一个维度,以二次多项式回归模型对训练样本进行拟合
from sklearn.preprocessing import PolynomialFeatures
poly2 = PolynomialFeatures(degree=2) #映射出二次多项式特征
X_train_poly2 = poly2.fit_transform(X_train)
lr_poly2 = LinearRegression()
lr_poly2.fit(X_train_poly2,y_train)
#重新映射回归值,并绘制图像
#因为训练的模型lr_poly2针对的是2D的数据,所以此处要将xx也转成2D的形式,才能预测对应的y值
xx_poly2 = poly2.transform(xx)
yy_poly2 = lr_poly2.predict(xx_poly2)
plt.scatter(X_train,y_train,c='r')
#获取plot对象的方法:
#line, = plt.plot(x, y, '-')
#这里的','不可以省略,不然在下面的legend中就会出错。
plt1,= plt.plot(xx,yy)
#这边绘图时,传的参数就是(xx,yy_poly2)了,不能是xx_poly2,点的坐标形式是(x,y),x应为1维向量
plt2, = plt.plot(xx,yy_poly2)
plt.axis([0,25,0,25])
plt.xlabel('Diameter of Pizza')
plt.ylabel('Price of Pizza')
#legend:添加图例(对直线的描述),第一个参数是要显示的直线的列表[],第二个参数是每条直线的label,第三个参数是显示的位置
plt.legend([plt1,plt2],('degree=1','degree=2'),'best')
plt.show()
#输出二次多项式回归模型在<训练样本>上的r2-score
print 'The R-squared value of poly2 is ',lr_poly2.score(X_train_poly2,y_train)
#The R-squared value of poly2 is 0.98164216396
#*************************************************************************************
#3.最后再以四次多项式回归函数进行预测
poly4 = PolynomialFeatures(degree=4)
X_train_poly4 = poly4.fit_transform(X_train)
lr_poly4 = LinearRegression()
lr_poly4.fit(X_train_poly4,y_train)
#重新预测xx_poly4对应的回归值,并绘图
xx_poly4 = poly4.transform(xx)
yy_poly4 = lr_poly4.predict(xx_poly4)
plt.scatter(X_train,y_train,c='r')
plt1, = plt.plot(xx,yy)
plt2, = plt.plot(xx,yy_poly2)
plt3, = plt.plot(xx,yy_poly4)
plt.axis([0,25,0,25])
plt.xlabel('Diameter of Pizza')
plt.ylabel('Price of Pizza')
plt.legend([plt1,plt2,plt3],('degree=1','degree=2','degree=4'),'best')
plt.show()
#输出四次多项式回归模型在<训练样本>上的r2-score
print 'The R-squared value of poly4 is ',lr_poly4.score(X_train_poly4,y_train)
#The R-squared value of poly4 is 1.0
#总结:
#在实际生活中,第二个模型是最满足真实情况的
#第一个模型的复杂度太低,导致了欠拟合
#第三个模型的复杂度太高,导致了过拟合
#第二个模型,相对来说,泛化能力更好一些
#为了兼顾模型的复杂度和预测准确性,我们采用了模型正则化方法,在下一讲进行说明。
17.【进阶】模型正则化--欠拟合与过拟合问题
最新推荐文章于 2021-11-24 14:02:04 发布