使用線性回歸構(gòu)建波士頓房價預(yù)測模型
描述
波士頓房價數(shù)據(jù)集統(tǒng)計了波士頓地區(qū)506套房屋的特征以及它們的成交價格,這些特征包括周邊犯罪率、房間數(shù)量、房屋是否靠河、交通便利性、空氣質(zhì)量、房產(chǎn)稅率、社區(qū)師生比例(即教育水平)、周邊低收入人口比例等 。我們的任務(wù)是根據(jù)上述數(shù)據(jù)集建立模型,能夠預(yù)測房屋價格及其走勢。
本任務(wù)涉及的主要實踐內(nèi)容:
1、 線性回歸預(yù)測模型的構(gòu)建
2、 模型的預(yù)測與評估
3、 使用matplotlib繪制房價預(yù)測曲線
源碼下載
環(huán)境
-
操作系統(tǒng):Windows 10、Ubuntu18.04
-
工具軟件:Anaconda3 2019、Python3.7
-
硬件環(huán)境:無特殊要求
-
依賴庫列表
matplotlib 3.3.4 numpy 1.19.5 pandas 1.1.5 scikit-learn 0.24.2 mglearn 0.1.9
分析
任務(wù)的輸出(房價)是個連續(xù)值,因此這是一個回歸問題,算法的目的是尋找房屋的特征數(shù)據(jù)和房價之間的規(guī)律(即回歸函數(shù))。
本任務(wù)涉及以下幾個環(huán)節(jié):
a)加載、查看波士頓房價數(shù)據(jù)集
b)將數(shù)據(jù)拆分為訓(xùn)練集與測試集
d)構(gòu)建線性回歸模型,擬合訓(xùn)練數(shù)據(jù)、
e)預(yù)測房價
f)評估模型
g)利用Matplotlib生成房價預(yù)測走勢曲線
實施
1、加載、查看波士頓房價數(shù)據(jù)集
from sklearn.datasets import load_boston # 引入load_boston函數(shù)
from sklearn.model_selection import train_test_split # 引入數(shù)據(jù)集拆分函數(shù)
from sklearn.linear_model import LinearRegression # 引入LinearRegression類
# 加載boston數(shù)據(jù)集
boston = load_boston()
print(boston.keys()) # 查看boston數(shù)據(jù)集的組成
print(boston.data.shape) # 查看輸入數(shù)據(jù)的形狀-(506套房屋數(shù)據(jù),每條數(shù)據(jù)包含13個特征值)
print(boston.target.shape) # 查看標(biāo)簽數(shù)組的形狀-(506套房屋的成交價格)
print(boston.feature_names) # 查看特征名稱(房屋的13個特征名稱)
輸出結(jié)果:
dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])
(506, 13)
(506,)
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
'B' 'LSTAT']
通過keys()函數(shù)可以查看數(shù)據(jù)集中有哪些Keys(即數(shù)據(jù)項),依次查看其數(shù)據(jù)項。
通過觀察,我們可以看到,波士頓數(shù)據(jù)集的特征數(shù)據(jù)(data數(shù)組)包含506套房屋的數(shù)據(jù),有“犯罪率”、“房間數(shù)量”、“房屋年齡”、“師生比”等13個特征值,這506套房屋對應(yīng)的成交價格(即數(shù)據(jù)的標(biāo)簽)存放在target數(shù)組中。我們的任務(wù)是基于這506套房屋的交易數(shù)據(jù)建立一個回歸模型,能夠?qū)Σㄊ款D地區(qū)的房價數(shù)據(jù)進(jìn)行預(yù)測。(即尋找房屋的特征與房價之間的線性規(guī)律)
2、數(shù)據(jù)集拆分
# 將data和target隨機(jī)拆分為訓(xùn)練集和測試集(test_size=0.25代表25%的數(shù)據(jù)作為測試集,75%為訓(xùn)練集)
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target,
test_size=0.25, random_state=0)
print(X_train.shape, X_test.shape) # 查看拆分結(jié)果
print(y_train.shape, y_test.shape)
輸出結(jié)果:
(379, 13) (127, 13)
(379,) (127,) # 379+127=506
通過scikit-learn中的train_test_split函數(shù)將數(shù)據(jù)集隨機(jī)拆分成訓(xùn)練集與測試集。注意掌握train_test_split函數(shù)的參數(shù)含義及返回值定義。另外,在機(jī)器學(xué)習(xí)中,一般用大寫X_表示輸入數(shù)據(jù)(即特征數(shù)據(jù)),小寫的y_表示輸出數(shù)據(jù)(即標(biāo)簽)。
3、創(chuàng)建線性回歸模型,擬合訓(xùn)練數(shù)據(jù)
# 創(chuàng)建模型
model = LinearRegression()
# 擬合訓(xùn)練數(shù)據(jù)(即將特征數(shù)據(jù)和標(biāo)簽數(shù)據(jù)交給模型去訓(xùn)練)
model.fit(X_train, y_train)
# 注意:上面兩步也可以合并寫成這樣
# model = LinearRegression().fit(X_train, y_train)
注意:Scikit-learn中所有模型的使用都是同樣的過程。因此,學(xué)習(xí)機(jī)器學(xué)習(xí)最重要的是在熟悉模型的思想原理、參數(shù)及優(yōu)缺點的前提下,根據(jù)任務(wù)選擇不同的模型來實現(xiàn)。
4、使用模型預(yù)測房屋價格
import numpy as np
# 預(yù)測測試集的輸出(即測試集中房屋的房價)
y_pred = model.predict(X_test)
print(y_pred[:10])# 預(yù)測前10套房屋的價格
# 將預(yù)測結(jié)果與實際價格做對比
print('\n預(yù)測價格:', np.round(y_pred[:10])) # np.round()-四舍五入取整
print('實際價格:', np.round(y_test[:10]))
輸出結(jié)果:
[10.92635315 34.36995076 30.80593435 43.33525222 19.107834 18.8326957
22.14409312 20.47370887 36.85094144 17.84471519]
預(yù)測價格: [11. 34. 31. 43. 19. 19. 22. 20. 37. 18.]
實際價格: [16. 44. 24. 50. 20. 20. 17. 22. 42. 13.]
在Scikit-learn中,模型的預(yù)測使用predict方法,但僅看預(yù)測結(jié)果我們無法得知模型的準(zhǔn)確率,所以還需要進(jìn)行模型的準(zhǔn)確性評估。另外,我們還會使用Matplotlib繪圖,將房價預(yù)測曲線與實際房價曲線做對比,結(jié)果一目了然。(Matplotlib是機(jī)器學(xué)習(xí)中不可或缺的可視化利器)
5、評估模型
# 使用score方法評估模型的成績
train_score = model.score(X_train, y_train) # 獲得模型在訓(xùn)練集上的成績
test_score = model.score(X_test, y_test) # 獲得模型在測試集上的成績
print('Train set score:', train_score)
print('Test set score:', test_score)
輸出結(jié)果:
Train set score: 0.7697699488741149
Test set score: 0.6354638433202116
Scikit-learn中,模型的評估使用score方法,參數(shù)1為輸入特征數(shù)據(jù),參數(shù)2為標(biāo)簽(即實際房價)。本任務(wù)沒有對數(shù)據(jù)進(jìn)行預(yù)處理,經(jīng)過預(yù)處理后模型的準(zhǔn)確性還會有所提高。數(shù)據(jù)預(yù)處理(縮放)會有一個專門的章節(jié)講述,屆時我們會做個對比。
6、使用Matplotlib生成房價預(yù)測走勢曲線
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4)) # 設(shè)置畫板尺寸
plt.rcParams['font.sans-serif'] = 'FangSong' # 設(shè)置中文字體
plt.title('波士頓房價預(yù)測曲線與實際曲線對比圖', fontsize=15)
x = range(len(y_test)) # x軸數(shù)據(jù)
plt.plot(x, y_test, color='r', label='實際價格') # 實際價格曲線
plt.plot(x, y_pred, color='g', ls='--', label='預(yù)測價格') # 預(yù)測價格曲線
plt.legend(fontsize=12, loc=1) # 顯示圖例
plt.show()
顯示結(jié)果:
7、使用嶺回歸(Ridge)建模
LinearRegression(標(biāo)準(zhǔn)線性回歸)、Ridge、Lasso都在sklearn.linear_model模塊中。Ridge和Lasso回歸是在標(biāo)準(zhǔn)線性回歸函數(shù)中加入正則化項,以降低過擬合現(xiàn)象。文章來源:http://www.zghlxwxcb.cn/news/detail-413095.html
from sklearn.datasets import load_boston # 引入load_boston函數(shù)
from sklearn.model_selection import train_test_split # 引入數(shù)據(jù)集拆分函數(shù)
from sklearn.linear_model import Ridge # 引入Ridge模型
# 加載boston數(shù)據(jù)集
boston = load_boston()
# 拆分?jǐn)?shù)據(jù)集
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target,
test_size=0.25, random_state=66)
# 構(gòu)建模型
model = Ridge(alpha=10).fit(X_train, y_train)
# 評估模型
train_score = model.score(X_train, y_train)
test_score = model.score(X_test, y_test)
print('train score:{:.2f}'.format(train_score), '\ntest score:{:.2f}'.format(test_score))
輸出結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-413095.html
train score:0.70
test score:0.81
到了這里,關(guān)于使用線性回歸構(gòu)建波士頓房價預(yù)測模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!