- 深度學習訓練營 21天實戰TensorFlow+Keras+scikit-learn
- 張強
- 1740字
- 2020-04-14 15:04:07
1.1 數據準備
數據集是公開的,可以在前言所提供的鏈接下找到。本章使用的數據集是早期的房屋統計數據集,作為項目數據集來講解也較為經典。波士頓的房屋數據集文件是housing.csv,北京的房屋數據集文件是bj_housing.csv。開始的時候,我們會用scikit-learn庫來分析和預測,然后會用TensorFlow下的Keras的神經網絡模型來預測,在預測結束后,都會使用一張對照圖來直觀地查看。
1.1.1 環境準備
◇ numpy=1.14.6。
◇ pandas=0.22.0。
◇ sklearn=0.19.2。
◇ seaborn=0.7.1。
◇ matplotlib=2.1.2。
◇ tensorflow=1.10.0。
1.1.2 預處理數據
在訓練人工智能模型前,我們需要先觀察和分析要訓練的數據集,然后進行必要的預處理。這里我們先通過pandas的read_csv()函數加載housing.csv數據,獲得489行乘以4列的數據,返回的是一個pandas的DataFrame對象(DataFrame可以簡單地理解成類似Excel表格的數據對象,但它并不是Excel表格),然后查看前5行數據以觀察。
import pandas as pd # 加載數據集 data=pd.read_csv('housing.csv') print("波士頓房屋數據有{}行x{}列。".format(data.shape[0],data.shape[1])) # 查看前5行數據 data.head()
輸出如下。
波士頓房屋數據有489行x4列。
輸出前5行數據,如圖1.1所示。

圖1.1 波士頓房屋數據集的前5行數據
圖中該數據集的4列數據的含義分別如下。
◇ RM:該地區每座房屋的平均房間數量。
◇ LSTAT:該地區的房主中低收入階層(有工作但收入微薄)所占百分比。
◇ PTRATIO:該地區的中小學里,學生和老師的人數之比(學生數/老師數)。
◇ MEDV:該地區業主自住房屋的價格中位數。
輸出結果還有其他的字段(列),此處附圖中只顯示了主要的字段。然后,我們通過describe()函數來觀察數據的基本統計信息,代碼如下。
data.describe()
輸出如圖1.2所示。

圖1.2 波士頓房屋數據基本統計信息
如果我們想自己寫代碼統計房屋價格的信息,可以這樣寫。
import numpy as np # 計算最低價格 minimum_price=np.min(data["MEDV"]) # 計算最高價格 maximum_price=np.max(data["MEDV"]) # 計算均值 mean_price=np.mean(data["MEDV"]) # 計算中間價格 median_price=np.median(data["MEDV"]) # 計算標準差價格 std_price=np.std(data["MEDV"]) # 打印輸出所有計算的價格統計 print("波士頓房價數據的統計:") print("最低價格:${}".format(minimum_price)) print("最高價格:${}".format(maximum_price)) print("均價:${}".format(mean_price)) print("中間價格:${}".format(median_price)) print("標準差價格:${}".format(std_price))
輸出如下。
波士頓房價數據的統計: 最低價格:$105000.0 最高價格:$1024800.0 均價:$454342.9447852761 中間價格:$438900.0 標準差價格:$165171.13154429474
然后,我們來分割一下訓練集的訓練數據X和y,也就是房屋特征數據features和房屋價格prices。變量data是一個DataFrame對象,它可以通過調用drop()函數來丟棄某個列。所以我們先取出MEDV列作為訓練數據y,而訓練數據X就是將MEDV列丟棄后的數據。
# 獲取房屋價格 prices=data['MEDV'] # 獲取房屋特征 features=data.drop('MEDV',axis=1)
1.1.3 數據可視化分析
我們接下來分別分析RM列、LSTAT列和PTRATIO列與MEDV列的相關性,會使用到seaborn庫。seaborn庫是一個用于統計數據可視化的庫,它是基于Matplotlib庫編寫而來的,提供了更為方便、高級的封裝和調用。這里就用seaborn來繪圖顯示。
首先,我們來分析RM列和MEDV列的相關性。先導入Matplotlib庫,再導入seaborn庫,最后調用regplot()函數,它會根據數據和線性回歸的模型進行擬合。
import matplotlib.pyplot as plt import seaborn as sns # regplot()函數根據數據繪制線性回歸(Linear Regression)模型圖 # 參數1:X軸,表示每座房屋的平均房間數量 # 參數2:y軸,表示房屋價格 # 參數3:繪圖時使用的顏色,這里是紅色 sns.regplot(data['RM'],prices,color='red') # 顯示繪圖 plt.show()
輸出結果如圖1.3所示。

圖1.3 RM列與MEDV列的相關性模型圖
通過這個線性回歸模型圖,我們可以觀察到,房間的數量越多,房屋價格就越高,也就是空間越大越舒適;還可以看到大部分房屋的房間數量在6個左右。
然后,我們分析LSTAT列和MEDV列的相關性。
# regplot()函數根據數據繪制線性回歸(Linear Regression)模型圖 # 參數1:X軸,表示該地區的房主中低收入階層所占百分比 # 參數2:y軸,表示房屋價格 # 參數3:表示繪制的圖是用什么標記繪制出來的,這里是“+” # 參數4:繪圖時使用的顏色,這里是綠色 sns.regplot(data['LSTAT'],prices,marker='+',color='green')# 顯示繪圖 plt.show()
輸出如圖1.4所示。

圖1.4 LSTAT列和MEDV列的相關性模型圖
通過這個線性回歸模型圖,我們可以看到LSTAT列的數值越高,房屋價格就越低。LSTAT列表示該地區的房主中低收入階層所占百分比,低收入階層所占百分比的值越高,就意味著,周邊的消費水平越低,房屋價格自然也會越低。
最后,我們來分析一下PTRATIO列和MEDV列的相關性。
# regplot()函數根據數據繪制線性回歸(Linear Regression)模型圖 # 參數1:X軸,表示該地區的中小學里,學生和老師的人數之比 # 參數2:y軸,表示房屋價格 # 參數3:表示繪制的圖是用什么標記繪制出來的,這里是“^” # 參數4:繪圖時使用的顏色,這里是藍色 sns.regplot(data['PTRATIO'],prices,marker='^',color='blue') # 顯示繪圖 plt.show()
輸出如圖1.5所示。

圖1.5 PTRATIO列和MEDV列的相關性模型圖
通過這個線性回歸模型圖,我們得知PTRATIO列的值的增加會降低房屋價格。這是因為擁有學生和老師的人數之比較高表明該地區缺乏教學設施或資源;相反的是,學生和老師的人數之比較低的地方,教學設施或資源較好,該地區的房屋價格也就高一些。