1. 程式人生 > >【python資料分析】波士頓房價分析小例子

【python資料分析】波士頓房價分析小例子

一、匯入模組

%matplotlib inline             #將生成的圖片嵌入網頁中
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.feature_selection import SelectKBest,f_regression
from sklearn.linear_model import LinearRegression              #匯入先行迴歸模型
from sklearn.svm import SVR                                    #匯入svm模型
from sklearn.ensemble import RandomForestRegressor             #匯入隨機森林模型

我們用到的模組有matplotlib視覺化,還有sklearn機器學習模組,其中也用到了LinearRegression線性迴歸模型、SVM(支援向量機)迴歸模型和RandomForestRegressor隨機森林模型。

  • 線性迴歸:,線性迴歸(Linear Regression)是利用稱為線性迴歸方程的最小平方函式對一個或多個自變數因變數之間關係進行建模的一種迴歸分析。這種函式是一個或多個稱為迴歸係數的模型引數的線性組合。只有一個自變數的情況稱為簡單迴歸,大於一個自變數情況的叫做多元迴歸。
  • 支援向量機:支援向量機(SVM,還支援向量網路)是與相關的學習演算法有關的監督學習模型,可以分析資料,識別模式,用於分類和迴歸分析。給定一組訓練樣本,每個標記為屬於兩類,一個SVM訓練演算法建立了一個模型,分配新的例項為一類或其他類,使其成為非概率二元線性分類。
  • 隨機森林:隨機森林是一種多功能的機器學習演算法,能夠執行迴歸和分類的任務。同時,它也是一種資料降維手段,用於處理缺失值、異常值以及其他資料探索中的重要步驟,並取得了不錯的成效。

二、載入資料

boston_data = datasets.load_boston()
x_full = boston_data.data               #載入load_boston()中所有資料,一共有506條記錄,13條特徵(變數)
y = boston_data.target             #載入load_boston()中的目標值,即標籤
print(x_full.shape)
print(y.shape)

#輸出:
(506, 13)
(506,)

我們載入機器學習模組sklearn中自帶的資料load_boston()波士頓房價資料。這一步也可以對資料進行初步的分析,.data載入資料中的所有記錄,.target檢視資料中的目標值,即標籤。然後用.shape檢視所有記錄和目標值的維度,可以看到一共有506條記錄,13條特徵,也就是有506條目標值,在這裡目標值指的是房價。

三、轉換和分析

selector = SelectKBest(f_regression,k=1)            #選出相關性最強的SelectKBest類作為特徵
selector.fit(x,y)                                   #採用fit()方法進行資料擬合
x = x_full[:,selector.get_support()]                     #採用get_support()將資料縮減成一個向量,即資料降維
print(x.shape)

#輸出:
(506, 1)

在這一步,我們用SelectKBest類選出相關性最強的一個特徵,也就是一個向量。採用fit()方法將資料擬合,然後用get_support()將資料縮減成一個向量,即資料降維。

四、視覺化

def plot_scatter(x,y,R=None):
    plt.scatter(x,y,s=32,marker='o',facecolors='blue')
    if R is not None:
        plt.scatter(x,R,color='red',linewidth=0.5)
plt.show()

plot_scatter(x,y)

由於目標是一個向量,所以我們可以看看輸入(特徵)和輸出(房價)之間是都存線上性關係。

根據輸出的結果,我們可以看到隨著x的增加,y在減少,但是這種變化比率不是恆定的。這是一個非線性情況,我們可以利用一個迴歸模型進一步將它視覺化。

五、模型分析

#線性迴歸模型
regressor = LinearRegression(normalize=True).fit(x,y)                  
plot_scatter(x,y,regressor.predict(x))

這一步,我們建立並訓練了一個線性迴歸模型,紅色畫出了輸入和輸出之間的最佳線性關係。很顯然我們看到這個效果並不是很好,它只是一個近似值。

接下來我們看看支援向量機和隨機森林的模型效果。

#SVM迴歸模型
regressor = SVR().fit(x,y)
plot_scatter(x,y,regressor.predict(x))

支援向量機是一種用來解決非線性問題的模型,可以看到在這種情況下,支援向量機的效果比線性迴歸的效果更好一點。

最後再看看隨機森林。

#隨機森林迴歸模型
regressor =RandomForestRegressor().fit(x,y)
plot_scatter(x,y,regressor.predict(x))

我們看到這種情況下利用隨機森林的效果比前面兩個好多了,隨機森林是一種四棟解決非線性問題的模型。