波士頓房價預測


波士頓房屋數據集:
可視化數據集的重要特征:
探索性數據分析(Exploratory Data Analysis,EDA)是機器學習模型訓練之前的一個重要步驟。
在本節的后續內容中,借助EDA圖形工具箱中那些簡單且有效的技術,可以幫助我們直觀地發現數據中的異常情況、數據的分布情況,以及特征間的相互關系。

首先,借助散點圖矩陣,我們以可視化的方法匯總顯示各不同特征兩兩之間的關系。為了繪制散點圖矩陣,我們需要用到seaborn庫中的pairplot函數,
它是在matplotlib基礎上繪制統計圖像的Python庫。
sns.pairplot(df[cols],size=2.5)

導入seaborn庫后,會覆蓋當前Python會話中matplotlib默認的圖像顯示方式。
如果讀者不希望使用seaborn風格的設置,可以通過如下命令重設為matplotlib的風格:
sns.reset_orig()

散點圖矩陣以圖形的方式對數據集中特征間關系進行了描述
通過此散點圖矩陣,我們可以快速了解數據是如何分布的,以及其中是否包含異常值。
例如,我們可直觀看出RM和房屋價格MEDV(第5列和第4行)之間存在線性關系。
此外,從MEDV直方圖(散點圖矩陣的右下角子圖)中可以發現:MEDV看似呈正態分布,但包含幾個異常值。

請注意,不同於人們通常的理解,訓練一個線性回歸模型並不需要解釋數量或者目標變量呈正態分布。正態假設僅適用於某些統計檢驗和假設檢驗。

為了量化特征之間的關系,我們創建一個相關系數矩陣。相關系數矩陣與我們第5章“主成分分析”一節中討論過的協方差矩陣是密切相關的。
直觀上來看,我們可以把相關系數矩陣看作協方差矩陣的標准化版本。實際上,相關系數矩陣就是在將數據標准化后得到的協方差矩陣。

相關系數矩陣是一個包含皮爾遜積矩相關系數(Pearson product-moment correlation coefficient,通常記為Pearson抯r)的方陣,
它用來衡量兩兩特征間的線性依賴關系。相關系數的取值范圍為-1到1。
如果r=1,代表兩個特征完全正相關;如果r=0,則不存在相關關系;如果r=-1,則兩個特征完全負相關。
如前所述,皮爾遜相關系數可用兩個特征x和y間的協方差(分子)除以它們標准差的乘積(分母)來計算。
r = σxy/σx*σy
可以證明:經標准化各特征間的協方差實際上等價於它們的線性相關系數。

使用NumPy的corrcoef函數計算前面散點圖矩陣中5個特征間的相關系數矩陣,並使用seaborn的heatmap函數繪制其對應的熱度圖:
cm = np.corrcoef(df[cols].values.T)
sns.set(font_scale=1.5)
hm = sns.heatmap(cm,cbar=True,annot=True,square=True,fmt='.2f',annot_kws={'size':15},yticklabels=cols,xticklabels=cols)

從結果圖像中可見,相關系數矩陣為我們提供了另外一種有用的圖形化數據描述方式,由此可以根據各特征間的線性相關性進行特征選擇:

為了擬合線性回歸模型,我們主要關注那些跟目標變量MEDV高度相關的特征。觀察前面的相關系數矩陣,可以發現MEDV與變量LSTAT的相關性最大(-0.74)。
大家應該還記得,前面的散點圖矩陣顯示LSTAT和MEDV之間存在明顯的非線性關系。另一方面,正如散點圖矩陣所示,RM和MEDV間的相關性也較高(0.70),
考慮到從散點圖中觀察到了這兩個變量之間的線性關系,因此,在后續小節,中使用RM作為解釋變量進行簡單線性回歸模型訓練,是一個較好的選擇。

基於最小二乘法構建線性回歸模型:
在本章開始時討論過,可將線性回歸模型看作通過訓練數據的樣本點來尋找一條最佳擬合直線。
不過,在此既沒有對最佳擬合做出定義,也沒有研究擬合類似模型的各種技術。
在接下來的小節中,我們將消除讀者對上述問題的疑惑:通過最小二乘法(Ordinary Least Squares,OLS)估計回歸曲線的參數,
使得回歸曲線到樣本點垂直距離(殘差或誤差)的平方和最小。

通過梯度下降計算回歸參數:
第2章中介紹的自適應線性神經元(Adaptive Linear Neuron,Adaline):人工神經元中使用了一個線性激勵函數,同時還定義了一個代價函數J(·),
通過梯度下降(Gradient Descent,GD)、隨機梯度下降(Stochastic Gradient Descent,GD)等優化算法使得代價函數最小,從而得到相應的權重。
Adaline中的代價函數就是誤差平方和(Sum of Squared Error,SSE),它等同於我們這里定義的OLS代價函數

注意,此處的系數1/2僅是為了方便推導GD更新規則

本質上,OLS線性回歸可以理解為無單位階躍函數的Adaline,這樣我們得到的是連續型的輸出值,而不是以-1和1來代表的類標。

為了說明兩者的相似程度,使用第2章中實現的GD方法,並且移除其單位階躍函數來實現我們第一個線性回歸模型
def predict(self,X):
return self.net_input(X) # np.where(self.activation(X)>=0.0,1,-1)

為了在實踐中熟悉LinearRegressionGD類,我們使用了房屋數據集中的RM(房間數量)作為解釋變量來訓練模型以預測MEDV(房屋價格)。
此外,為了使得梯度下降算法收斂性更佳,在此對相關變量做了標准化處理。

第2章中曾介紹過,梯度下降算法能夠進行收斂性檢查,使用這類優化算法時,
將代價看作迭代次數的函數(基於訓練數據集),並將其繪制成圖是個非常好的做法。
簡而言之,我們將再次繪制迭代次數對應的代價函數的值,以檢查線性回歸是否收斂:

接下來,我們將線性回歸曲線與訓練數據擬合情況繪制成圖。
為達到此目的,我們定義了一個輔助函數用來繪制訓練樣本的散點圖,同時繪制出相應的回歸曲線
def lin_regplot(X,y,model):
plt.scatter(X,y,c="blue")
plt.plot(X,model.predict(X),color='red')

上述結論是基於直覺觀察得到的,但是數據也同樣告訴我們,房間數在很多情況下並不能很好地解釋房價。
本章后續內容將討論如何量化回歸模型的性能。有趣的是,我們觀察到一條奇怪的直線y=3,這意味着房價被限定了上界。
在某些應用中,給出變量在原始取值區間上的預測值也是非常重要的。
為了將預測價格縮放到以1000美元為價格單位的坐標軸上,我們使用了StandardScaler的inverse_transform方法:
num_rooms_std = sc_x.transform(np.array([5.0]).reshape(-1,1))
price_std = lr.predict(num_rooms_std)
print(sc_y.inverse_transform(price_std))

值得一提的是:對於經過標准化處理的變量,我們無需更新其截距的權重,因為它們在y軸上的截距始終為0。我們可以通過輸出其權重來快速確認這一點

使用scikit-learn估計回歸模型的系數:
上一小節中,我們實現了一個可用的回歸分析模型。不過在實際應用中,我們可能會更關注如何高效地實現模型,
例如,scikit-learn中的LinearRegression對象使用了LIBLINEAR庫以及先進的優化算法,可以更好地使用經過標准化處理的變量。
slr = LinearRegression()
slr.fit(X,y)
執行上述代碼后可見,使用經過標准化處理的RM和MEDV數據擬合scikit-learn中的LinearRegression模型得到了不同的模型系數。

在大多數介紹統計科學的教科書中,都可以找到使用最小二乘法求解線性方程組的封閉方法:
w_1 = (XTX)^-1 XTy
w_0 = uy-uy^uy^
這種方法的優點在於:它一定能夠分析找到最優解。
不過,如果要處理的數據集量很大,公式中逆矩陣的計算成本會非常高,或者矩陣本身為奇異矩陣(不可逆),
這就是在特定情況下我們更傾向於使用交互式方法的原因。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM