多项式回归(波士顿房价预测)
导入模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
获取数据
在《代码-普通线性回归》的时候说到特征LSTAT和标记MEDV有最高的相关性,但是它们之间并不是线性关系,因此这次尝试使用多项式回归拟合它们之间的关系。
df = pd.read_csv('housing-data.txt', sep='\s+', header=0)
X = df[['LSTAT']].values
y = df['MEDV'].values
训练模型
# 增加二次方,即二项式回归
quadratic = PolynomialFeatures(degree=2)
# 增加三次方,即三项式回归
cubic = PolynomialFeatures(degree=3)
# 训练二项式和三项式回归得到二次方和三次方的X
X_quad = quadratic.fit_transform(X)
X_cubic = cubic.fit_transform(X)
# 增加x轴坐标点
X_fit = np.arange(X.min(), X.max(), 1)[:, np.newaxis]
lr = LinearRegression()
# 线性回归
lr.fit(X, y)
lr_predict = lr.predict(X_fit)
# 计算线性回归的R2值
lr_r2 = r2_score(y, lr.predict(X))
# 二项式回归
lr = lr.fit(X_quad, y)
quad_predict = lr.predict(quadratic.fit_transform(X_fit))
# 计算二项式回归的R2值
quadratic_r2 = r2_score(y, lr.predict(X_quad))
# 三项式回归
lr = lr.fit(X_cubic, y)
cubic_predict = lr.predict(cubic.fit_transform(X_fit))
# 计算三项式回归的R2值
cubic_r2 = r2_score(y, lr.predict(X_cubic))
print(lr.score(X_cubic, y))
print(cubic_r2)
0.6578476405895719
0.6578476405895719
报告决定系数
r2_score即报告决定系数
(
R
2
)
(R^2)
(R2),可以理解成MSE的标准版,
R
2
R^2
R2的公式为
R
2
=
1
−
1
n
∑
i
=
1
n
(
y
(
i
)
−
y
(
i
)
^
)
2
1
n
∑
i
=
1
n
(
y
(
i
)
−
μ
(
y
)
)
2
R^2 = 1-{\frac {{\frac{1}{n}\sum_{i=1}^n(y^{(i)}-\hat{y^{(i)}})^2}} {{\frac{1}{n}}\sum_{i=1}^n(y^{(i)}-\mu_{(y)})^2} }
R2=1−n1∑i=1n(y(i)−μ(y))2n1∑i=1n(y(i)−y(i)^)2
其中
μ
(
y
)
\mu_{(y)}
μ(y)是
y
y
y的平均值,即
1
n
∑
i
=
1
n
(
y
(
i
)
−
μ
(
y
)
)
2
{{\frac{1}{n}}\sum_{i=1}^n(y^{(i)}-\mu_{(y)})^2}
n1∑i=1n(y(i)−μ(y))2为
y
y
y的方差,公式可以写成
R
2
=
1
−
M
S
E
V
a
r
(
y
)
R^2 = 1-{\frac{MSE}{Var(y)}}
R2=1−Var(y)MSE
R
2
R^2
R2的取值范围在
0
−
1
0-1
0−1之间,如果
R
2
=
1
R^2=1
R2=1,则均方误差
M
S
E
=
0
MSE=0
MSE=0,即模型完美的拟合数据。
可视化
plt.scatter(X, y, c='gray', edgecolor='white', marker='s', label='训练数据')
plt.plot(X_fit, lr_predict, c='r',
label='线性(d=1),$R^2={:.2f}$'.format(lr_r2), linestyle='--', lw=3)
plt.plot(X_fit, quad_predict, c='g',
label='平方(d=2),$R^2={:.2f}$'.format(quadratic_r2), linestyle='-', lw=3)
plt.plot(X_fit, cubic_predict, c='b',
label='立方(d=3),$R^2={:.2f}$'.format(cubic_r2), linestyle=':', lw=3)
plt.xlabel('地位较低人口的百分比[LSTAT]', fontproperties=font)
plt.ylabel('以1000美元为计价单位的房价[RM]', fontproperties=font)
plt.title('波士顿房价预测', fontproperties=font, fontsize=20)
plt.legend(prop=font)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2KB0Afml-1582719294952)(02-08%20%E5%A4%9A%E9%A1%B9%E5%BC%8F%E5%9B%9E%E5%BD%92%28%E6%B3%A2%E5%A3%AB%E9%A1%BF%E6%88%BF%E4%BB%B7%E9%A2%84%E6%B5%8B%29_files/02-08%20%E5%A4%9A%E9%A1%B9%E5%BC%8F%E5%9B%9E%E5%BD%92%28%E6%B3%A2%E5%A3%AB%E9%A1%BF%E6%88%BF%E4%BB%B7%E9%A2%84%E6%B5%8B%29_11_0.png)]
上图可以看出三项式的拟合结果优于二项式和线性回归的结果,但是在增加模型复杂度的同时,也需要时刻考虑到是否会出现过拟合的问题。