快速报名
首页 / 干货教程 / Python教程 / python机器学习10 多项式回归(波士顿房价预测)

python机器学习10 多项式回归(波士顿房价预测)

导入模块

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即报告决定系数(R2),可以理解成MSE的标准版,R2的公式为

R2=1−1n∑ni=1(y(i)−y(i)^)21n∑ni=1(y(i)−μ(y))2

其中μ(y)是y的平均值,即1n∑ni=1(y(i)−μ(y))2为y的方差,公式可以写成

R2=1−MSEVar(y)

  R2的取值范围在0−1之间,如果R2=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()

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

抢先报名    优先占座