使用Python進行線性迴歸?
線性迴歸是機器學習中最簡單且常用的工具之一,用於指示兩個變數之間是否存在正相關或負相關關係。
線性迴歸是少數幾個用於快速預測分析的優秀工具之一。在本節中,我們將使用python pandas包載入資料,然後估計、解釋和視覺化線性迴歸模型。
在我們深入探討之前,讓我們先討論一下什麼是迴歸?
什麼是迴歸?
迴歸是一種預測建模技術,有助於建立因變數和自變數之間的關係。
迴歸型別
- 線性迴歸
- 邏輯迴歸
- 多項式迴歸
- 逐步迴歸
線性迴歸用於何處?
- 評估趨勢和銷售預測
- 分析價格變化的影響
- 評估風險
構建線性迴歸模型的步驟
首先,我們將構建設定並下載資料集和jupyter(我正在本教程中使用它,您可以使用其他IDE,如anaconda等)。
匯入所需的包和資料集。
載入資料集後,我們將探索資料集。
將使用我們的資料集進行線性迴歸。
然後,我們將探索變數與一天中的時間之間的關係。
總結。
設定
您可以從以下連結下載資料集:
http://en.openei.org/datasets/dataset/649aa6d3-2832-4978-bc6e-fa563568398e/resource/b710e97d-29c9-4ca5-8137-63b7cf447317/download/building1retail.csv
我們將使用它來使用室外空氣溫度 (OAT) 作為解釋變數來模擬建築物的電力消耗。
將csv檔案儲存在jupyter或IDE安裝的同一資料夾中。
匯入所需的庫和資料集
首先,我們將匯入所需的庫,然後使用pandas python庫讀取資料集。
# Importing Necessary Libraries import pandas as pd #Required for numerical functions import numpy as np from scipy import stats from datetime import datetime from sklearn import preprocessing from sklearn.model_selection import KFold from sklearn.linear_model import LinearRegression #For plotting the graph import matplotlib.pyplot as plt %matplotlib inline # Reading Data df = pd.read_csv('building1retail.csv', index_col=[0], date_parser=lambda x: datetime.strptime(x, "%m/%d/%Y %H:%M")) df.head()
輸出
探索資料集
因此,讓我們首先透過使用pandas繪製它來視覺化我們的資料集。
df.plot(figsize=(22,6))
輸出
因此,x軸顯示的是從2010年1月到2011年1月的資料。
如果我們看到上面的輸出,我們可以注意到該圖有兩個奇怪的地方
似乎沒有缺失資料,要檢查它,只需執行
df.isnull().values.any()
輸出
False
False結果告訴我們資料框中沒有空值。
看來資料中有一些異常值(向下的長尖峰)。
異常值或“離群值”通常是實驗錯誤的結果,也可能是真實值。無論哪種情況,我們都將丟棄它,因為它們會嚴重影響迴歸線的斜率。
在我們丟棄“離群值”之前,讓我們首先檢查一下我們的資料表示的是哪種型別的分佈。
df.hist()
輸出
從上面的直方圖可以看出,我們的圖表顯示的資料大致遵循正態分佈。
因此,讓我們刪除所有大於平均值 3 個標準差的值,並繪製新的資料框。
std_dev = 3 df = df[(np.abs(stats.zscore(df)) < float(std_dev)).all(axis=1)] df.plot(figsize=(22, 6))
輸出
因此,從上面的輸出中我們可以看到,我們已經在某種程度上消除了尖峰,並清理了我們的資料。
驗證線性關係
為了找到OAT和電力之間是否存在任何線性關係,讓我們繪製一個簡單的散點圖。
plt.scatter(df['OAT (F)'], df['Power (kW)'])
輸出
線性迴歸
為了執行模型並評估其效能,我們將使用Scikit-learn模組,我們還將使用k倍交叉驗證(k=3)來評估模型的效能。
X = pd.DataFrame(df['OAT (F)']) y = pd.DataFrame(df['Power (kW)']) model = LinearRegression() scores = [] kfold = KFold(n_splits=3, shuffle=True, random_state=42) for i, (train, test) in enumerate(kfold.split(X, y)): model.fit(X.iloc[train,:], y.iloc[train,:]) score = model.score(X.iloc[test,:], y.iloc[test,:]) scores.append(score) print(scores)
輸出
[0.38768927735902703, 0.3852220878090444, 0.38451654781487116]
在上面的程式中,model = LinearRegression() 建立了一個線性迴歸模型,for迴圈將資料集分成三折。然後在迴圈內,我們擬合數據,然後透過將其分數附加到列表中來評估其效能。
但是,結果看起來並不好,我們可以提高其效能。
一天中的時間
電力(變數)高度依賴於一天中的時間。讓我們使用此資訊透過使用獨熱編碼將其合併到我們的迴歸模型中。
model = LinearRegression() scores = [] kfold = KFold(n_splits=3, shuffle=True, random_state=42) for i, (train, test) in enumerate(kfold.split(X, y)): model.fit(X.iloc[train,:], y.iloc[train,:]) scores.append(model.score(X.iloc[test,:], y.iloc[test,:])) print(scores)
輸出
[0.8074246958895391, 0.8139449185141592, 0.8111379602960773]
我們的模型有了很大的改進。
總結
在本節中,我們學習了探索資料集並將其準備用於擬合迴歸模型的基礎知識。我們評估了其效能,檢測到了其缺點並對其進行了修復。