1. 程式人生 > 實用技巧 >02-08 多項式迴歸(波士頓房價預測)

02-08 多項式迴歸(波士頓房價預測)

目錄
更新、更全的《機器學習》的更新網站,更有python、go、資料結構與演算法、爬蟲、人工智慧教學等著你: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即報告決定係數(R2),可以理解成MSE的標準版,R2的公式為

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

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

R2=1MSEVar(y)

R2的取值範圍在01之間,如果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()

上圖可以看出三項式的擬合結果優於二項式和線性迴歸的結果,但是在增加模型複雜度的同時,也需要時刻考慮到是否會出現過擬合的問題。