nickchen121

人工智能从入门到放弃完整教程目录:https://www.cnblogs.com/nickchen121/p/11686958.html

多项式回归(波士顿房价预测)

一、导入模块

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

3.1 报告决定系数

r2_score即报告决定系数\((R^2)\),可以理解成MSE的标准版,\(R^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} } \]

其中\(\mu_{(y)}\)\(y\)的平均值,即\({{\frac{1}{n}}\sum_{i=1}^n(y^{(i)}-\mu_{(y)})^2}\)\(y\)的方差,公式可以写成

\[R^2 = 1-{\frac{MSE}{Var(y)}} \]

\(R^2\)的取值范围在\(0-1\)之间,如果\(R^2=1\),则均方误差\(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()

上图可以看出三项式的拟合结果优于二项式和线性回归的结果,但是在增加模型复杂度的同时,也需要时刻考虑到是否会出现过拟合的问题。

分类:

技术点:

相关文章:

  • 2021-08-19
  • 2022-01-07
  • 2021-07-20
  • 2021-09-14
  • 2022-02-05
  • 2021-09-25
猜你喜欢
  • 2021-12-21
  • 2022-01-09
  • 2022-01-02
  • 2021-12-09
相关资源
相似解决方案