17.【进阶】模型正则化--欠拟合与过拟合问题

#-*- 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

#总结:
#在实际生活中,第二个模型是最满足真实情况的
#第一个模型的复杂度太低,导致了欠拟合
#第三个模型的复杂度太高,导致了过拟合 
#第二个模型,相对来说,泛化能力更好一些
#为了兼顾模型的复杂度和预测准确性,我们采用了模型正则化方法,在下一讲进行说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值