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

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

导入模块

在这里插入图片描述

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=1n1i=1n(y(i)μ(y))2n1i=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} n1i=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=1Var(y)MSE
   R 2 R^2 R2的取值范围在 0 − 1 0-1 01之间,如果 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)]

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

在这里插入图片描述

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
多项式回归是一种回归分析方法,它是将一个自变量的高次幂作为新的自变量加入到线性回归模型中进行拟合,以提高模型的拟合度。在波士顿房价预测中,多项式回归可以帮助我们更好地描述房价与其他因素之间的复杂关系。 以下是一个使用多项式回归预测波士顿房价的 Python 代码示例: ``` # 导入必要的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.model_selection import train_test_split # 读取数据集 data = pd.read_csv('boston.csv') # 准备数据集 x = data.iloc[:, :-1].values y = data.iloc[:, -1].values # 将数据集拆分为训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0) # 将特征转换为多项式特征 poly = PolynomialFeatures(degree=2) x_poly_train = poly.fit_transform(x_train) x_poly_test = poly.transform(x_test) # 训练模型 model = LinearRegression() model.fit(x_poly_train, y_train) # 预测测试集结果 y_pred = model.predict(x_poly_test) # 计算模型评估指标 print('Mean Absolute Error:', np.mean(np.abs(y_pred - y_test))) print('Mean Squared Error:', np.mean((y_pred - y_test) ** 2)) print('Root Mean Squared Error:', np.sqrt(np.mean((y_pred - y_test) ** 2))) # 可视化结果 plt.scatter(x_test[:, 5], y_test, color='red') plt.plot(x_test[:, 5], y_pred, color='blue') plt.title('Boston House Prices Prediction') plt.xlabel('Number of Rooms') plt.ylabel('Price') plt.show() ``` 这段代码使用了 `sklearn` 库中的 `PolynomialFeatures` 方法将特征转换为多项式特征,然后使用线性回归模型进行训练和预测。最后,计算了模型评估指标并可视化了预测结果。如果需要进一步了解该代码的细节和实现,请参考相关文档和教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值