使用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]

我們的模型有了很大的改進。

總結

在本節中,我們學習了探索資料集並將其準備用於擬合迴歸模型的基礎知識。我們評估了其效能,檢測到了其缺點並對其進行了修復。

更新於:2019年7月30日

638 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告