用 Scikit-Learn 和 Pandas 學習線性回歸

2021-02-19 Python開發者

(點擊上方藍字,快速關注我們)

來源:劉建平Pinard

www.cnblogs.com/pinard/p/6016029.html

如有好文章投稿,請點擊 → 這裡了解詳情

對於想深入了解線性回歸的童鞋,這裡給出一個完整的例子,詳細學完這個例子,對用scikit-learn來運行線性回歸,評估模型不會有什麼問題了。

1. 獲取數據,定義問題

沒有數據,當然沒法研究機器學習啦。:) 這裡我們用UCI大學公開的機器學習數據來跑線性回歸。

數據的介紹在這: http://archive.ics.uci.edu/ml/datasets/Combined+Cycle+Power+Plant

數據的下載地址在這: http://archive.ics.uci.edu/ml/machine-learning-databases/00294/

裡面是一個循環發電場的數據,共有9568個樣本數據,每個數據有5列,分別是:AT(溫度), V(壓力), AP(溼度), RH(壓強), PE(輸出電力)。我們不用糾結於每項具體的意思。

我們的問題是得到一個線性的關係,對應PE是樣本輸出,而AT/V/AP/RH這4個是樣本特徵, 機器學習的目的就是得到一個線性回歸模型,即:

PE=θ_0+θ_1*AT+θ_2*V+θ_3*AP+θ_4*RH

而需要學習的,就是θ_0、θ_1、θ_2、θ_3、θ_4這5個參數。

2. 整理數據

下載後的數據可以發現是一個壓縮文件,解壓後可以看到裡面有一個xlsx文件,我們先用excel把它打開,接著「另存為「」csv格式,保存下來,後面我們就用這個csv來運行線性回歸。

打開這個csv可以發現數據已經整理好,沒有非法數據,因此不需要做預處理。但是這些數據並沒有歸一化,也就是轉化為均值0,方差1的格式。也不用我們搞,後面scikit-learn在線性回歸時會先幫我們把歸一化搞定。

好了,有了這個csv格式的數據,我們就可以大幹一場了。

3. 用pandas來讀取數據

我們先打開ipython notebook,新建一個notebook。當然也可以直接在python的交互式命令行裡面輸入,不過還是推薦用notebook。下面的例子和輸出我都是在notebook裡面跑的。

先把要導入的庫聲明了:

import matplotlib.pyplot as plt

%matplotlib inline

 

import numpy as np

import pandas as pd

from sklearn import datasets, linear_model

接著我們就可以用pandas讀取數據了:

# read_csv裡面的參數是csv在你電腦上的路徑,此處csv文件放在notebook運行目錄下面的CCPP目錄裡

data = pd.read_csv('.\CCPP\ccpp.csv')

測試下讀取數據是否成功:

#讀取前五行數據,如果是最後五行,用data.tail()

data.head()

運行結果應該如下,看到下面的數據,說明pandas讀取數據成功:

4. 準備運行算法的數據

我們看看數據的維度:

data.shape

結果是(9568, 5)。說明我們有9568個樣本,每個樣本有5列。

現在我們開始準備樣本特徵X,我們用AT, V,AP和RH這4個列作為樣本特徵。

X = data[['AT', 'V', 'AP', 'RH']]

X.head()

可以看到X的前五條輸出如下:

接著我們準備樣本輸出y, 我們用PE作為樣本輸出。

y = data[['PE']]

y.head()

可以看到y的前五條輸出如下:

5.劃分訓練集和測試集

我們把X和y的樣本組合劃分成兩部分,一部分是訓練集,一部分是測試集,代碼如下:

from sklearn.cross_validation import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)

查看下訓練集和測試集的維度:

print X_train.shape

print y_train.shape

print X_test.shape

print y_test.shape

結果如下:

(7176, 4)

(7176, 1)

(2392, 4)

(2392, 1)   

可以看到75%的樣本數據被作為訓練集,25%的樣本被作為測試集。

6. 運行scikit-learn的線性模型

終於到了臨門一腳了,我們可以用scikit-learn的線性模型來擬合我們的問題了。scikit-learn的線性回歸算法使用的是最小二乘法來實現的。代碼如下:

from sklearn.linear_model import LinearRegression

linreg = LinearRegression()

linreg.fit(X_train, y_train)

擬合完畢後,我們看看我們的需要的模型係數結果:

print linreg.intercept_

print linreg.coef_

輸出如下:

[ 447.06297099]

[[-1.97376045 -0.23229086  0.0693515  -0.15806957]]

這樣我們就得到了在步驟1裡面需要求得的5個值。也就是說PE和其他4個變量的關係如下:

PE=447.06297099-1.97376045*AT-0.23229086*V+0.0693515*AP-0.15806957*RH

7. 模型評價

我們需要評估我們的模型的好壞程度,對於線性回歸來說,我們一般用均方差(Mean Squared Error, MSE)或者均方根差(Root Mean Squared Error, RMSE)在測試集上的表現來評價模型的好壞。

我們看看我們的模型的MSE和RMSE,代碼如下:

#模型擬合測試集

y_pred = linreg.predict(X_test)

from sklearn import metrics

# 用scikit-learn計算MSE

print "MSE:",metrics.mean_squared_error(y_test, y_pred)

# 用scikit-learn計算RMSE

print "RMSE:",np.sqrt(metrics.mean_squared_error(y_test, y_pred))

輸出如下:

MSE: 20.0804012021

RMSE: 4.48111606657

得到了MSE或者RMSE,如果我們用其他方法得到了不同的係數,需要選擇模型時,就用MSE小的時候對應的參數。

比如這次我們用AT, V,AP這3個列作為樣本特徵。不要RH, 輸出仍然是PE。代碼如下:

X = data[['AT', 'V', 'AP']]

y = data[['PE']]

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)

from sklearn.linear_model import LinearRegression

linreg = LinearRegression()

linreg.fit(X_train, y_train)

#模型擬合測試集

y_pred = linreg.predict(X_test)

from sklearn import metrics

# 用scikit-learn計算MSE

print "MSE:",metrics.mean_squared_error(y_test, y_pred)

# 用scikit-learn計算RMSE

print "RMSE:",np.sqrt(metrics.mean_squared_error(y_test, y_pred))

輸出如下:

MSE: 23.2089074701

RMSE: 4.81756239919

可以看出,去掉RH後,模型擬合的沒有加上RH的好,MSE變大了。

8. 交叉驗證

我們可以通過交叉驗證來持續優化模型,代碼如下,我們採用10折交叉驗證,即cross_val_predict中的cv參數為10:

X = data[['AT', 'V', 'AP', 'RH']]

y = data[['PE']]

from sklearn.model_selection import cross_val_predict

predicted = cross_val_predict(linreg, X, y, cv=10)

# 用scikit-learn計算MSE

print "MSE:",metrics.mean_squared_error(y, predicted)

# 用scikit-learn計算RMSE

print "RMSE:",np.sqrt(metrics.mean_squared_error(y, predicted))

輸出如下:

MSE: 20.7955974619

RMSE: 4.56021901469

可以看出,採用交叉驗證模型的MSE比第6節的大,主要原因是我們這裡是對所有折的樣本做測試集對應的預測值的MSE,而第6節僅僅對25%的測試集做了MSE。兩者的先決條件並不同。

9. 畫圖觀察結果

這裡畫圖真實值和預測值的變化關係,離中間的直線y=x直接越近的點代表預測損失越低。代碼如下:

fig, ax = plt.subplots()

ax.scatter(y, predicted)

ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)

ax.set_xlabel('Measured')

ax.set_ylabel('Predicted')

plt.show()

輸出的圖像如下:

以上就是用scikit-learn和pandas學習線性回歸的過程,希望可以對初學者有所幫助。 

看完本文有收穫?請轉發分享給更多人

關注「大數據與機器學習文摘」,成為Top 1%

相關焦點

  • 用 Scikit-learn 與 Pandas 進行線性回歸預測
    ,這裡給出一個完整的例子,詳細學完這個例子,對用scikit-learn來運行線性回歸,評估模型不會有什麼問題了。:) 這裡我們用UCI大學公開的機器學習數據來跑線性回歸。也不用我們搞,後面scikit-learn在線性回歸時會先幫我們把歸一化搞定。好了,有了這個csv格式的數據,我們就可以大幹一場了。我們先打開ipython notebook,新建一個notebook。當然也可以直接在python的交互式命令行裡面輸入,不過還是推薦用notebook。下面的例子和輸出我都是在notebook裡面跑的。
  • 機器學習之 scikit-learn 開發入門(1)
    機器學習之 scikit-learn 開發入門 - 監督學習 - 線性回歸
  • 教程 | 如何在Python中用scikit-learn生成測試數據集
    數據集中的數據有完整的定義(例如線性或非線性)使你可以探索特定的算法行為。scikit-learn Python 庫提供一套函數,用於從可配置測試問題中生成樣本來進行回歸和分類。在本教程中,你將學習測試問題及如何在 Python 中使用 scikit-learn 進行測試。
  • 簡單幾步,教你使用scikit-learn做分類和回歸預測
    前言 scikit-learn是基於Python的一個機器學習庫,你可以在scikit-learn庫中選擇合適的模型,使用它訓練數據集並對新數據集作出預測。對於初學者來說,有一個共同的困惑:怎麼使用scikit-learn庫中的模型做預測?
  • 極簡Scikit-Learn入門
    100天搞定機器學習|Day3多元線性回歸感覺可以擴展的東西很多,後臺也有朋友發私信提了一些建議怎奈時間精力有限,多元線性回歸的模型診斷再次延遲。Scikit-Learn高清全景圖傳送:http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html在機器學習和數據挖掘的應用中
  • 7個常用的Scikit-learn使用技巧
    Scikit learn,或sklearn,是機器學習一個強大的庫學習sklearn的關鍵技巧、和訣竅,掌握該庫,成為一名高效的數據科學家介紹這一切都始於掌握
  • Python + Scikit-learn 完美入門機器學習指南 ​
    但我們都知道,機器學習常用的算法有很多,例如:線性回歸、支持向量機、k 近鄰、決策樹、樸素貝葉斯、邏輯回歸等。其中的一些算法都有著比較複雜的數學過程,如果每一次都需要自己通過代碼實現這些算法,那麼機器學的門檻就變得很高了。這時,scikit-learn 來了。
  • 使用scikit-learn進行機器學習
    1.基本用例:訓練和測試分類器練習2.更高級的用例:在訓練和測試分類器之前預處理數據2.1 標準化您的數據2.2 錯誤的預處理模式2.3 保持簡單,愚蠢:使用scikit-learn的管道連接器練習3.當更多優於更少時:交叉驗證而不是單獨拆分練習4.超參數優化:微調管道內部練習5.總結:我的scikit-learn管道只有不到10行代碼(跳過import語句)6.異構數據:當您使用數字以外的數據時練習
  • 使用 scikit-learn 玩轉機器學習——集成學習
    於是某天之後,小華又召集了班裡的其他4個學霸 B、C、D、E 為他提供答案。有了5名學霸作業答案的小明一開始曾不知所措,因為當各個學霸的答案不一致時他不知道該抄誰的,於是他想到一個少數服從多數的原則來確定最後答案,之後小華的作業的得分果然更進一步。
  • 如何使用scikit-learn進行機器學習?
    scikit-learn提供最先進的機器學習算法。 但是,這些算法不能直接用於原始數據。 原始數據需要事先進行預處理。 因此,除了機器學習算法之外,scikit-learn還提供了一套預處理方法。此外,scikit-learn提供用於流水線化這些估計器的連接器(即變壓器,回歸器,分類器,聚類器等)。
  • scikit-learn — 特徵選擇
    值(或對於SelectKBest和 SelectPercentile來說,僅僅返回分數):對於回歸:f_regression,mutual_info_regression對於分類:chi2,f_classif,mutual_info_classif基於F-檢驗的方法可以估計兩個隨機變量之間的線性依賴度(linear dependency)。
  • 評估線性回歸
    預測的問題是結果的準確性,那麼線性回歸的常用評價指標主要有:MSE、RMSE、MAE、R-Squared。
  • scikit-learn機器學習簡介
    機器學習:問題設置通常,一個機器學習問題會通過學習n個數據樣本,然後去預測未知數據的屬性。如果每個樣本都不止一個屬性,即一個多維屬性(也稱為多元 數據),則稱其具有多個屬性或特徵。監督學習,數據包含有我們要預測的額外屬性(單擊此處 轉到scikit-learn監督學習頁面)。
  • scikit-learn 1.0 版本重要新特性一覽
    在pypi上釋放了其1.0rc1版本,這裡給大家科普一下,版本號中的rc是Release Candidate的簡稱,代表當前的版本是一個候選發布版本,一旦到了這個階段,scikit-learn對於1.0版本的開發設計就基本上不會再新增功能,而是全力投入到查缺補漏的測試中去也就意味著:❝經歷了十餘年的開發進程,scikit-learn即將迎來其頗具裡程碑意義的一次大版本發布!
  • Python 機器學習:多元線性回歸
    python機器學習:線性回歸往下講,這篇文章要講解的多元線性回歸。1、什麼是多元線性回歸模型?當y值的影響因素不唯一時,採用多元線性回歸模型。例如商品的銷售額可能不電視廣告投入,收音機廣告投入,報紙廣告投入有關係,可以有 sales =β0+β1*TV+β2* radio+β3*newspaper.
  • 使用scikit-learn對文本數據進行挖掘與分析
    教程設置在開始學習本教程之前,您必須先安裝 scikit-learn及其所有必需的依賴。請參閱安裝說明 (https://scikit-learn.org/stable/install.html#installation-instructions)頁面以獲取更多信息和各作業系統的說明。
  • 【下載】Scikit-learn作者新書《Python機器學習導論》, 教程+代碼手把手帶你實踐機器學習算法
    Müller同時也是著名機器學習Python包scikit-learn的主要貢獻者 Andreas Muller 和 Reonomy 公司數據科學家 Sarah Guido 的新書《Python機器學習導論》(Introduction to machine learning with Python)從實戰角度出髮帶你用Python快速上手機器學習方法。
  • Python 機器學習 Scikit-learn 完全入門指南
    安裝和導入 Scikit-learn此步僅為了文章對 Python 小白友好,老鳥請大膽跳過此步,直接開始學習下面的內容。由於 Scikit-learn 是基於 Numpy 與 Scipy 等包的支持,所以需要在安裝 Scikit-learn 之前安裝這些工具包,由於安裝這些工具包的過程繁瑣,個人建議使用環境管理工具進行安裝。
  • 【他山之石】使用 scikit-learn 的 train_test_split() 拆分數據集
    訓練、驗證和測試集拆分數據集對於無偏見地評估預測性能至關重要。在大多數情況下,將數據集隨機分成三個子集就足夠了:1. 訓練集用於訓練或擬合您的模型。例如,您使用訓練集來查找線性回歸、邏輯回歸或神經網絡的最佳權重或係數。2. 驗證集用於在超參數調整期間進行無偏模型評估。例如,當您想找到神經網絡中的最佳神經元數量或支持向量機的最佳內核時,您可以嘗試不同的值。
  • 使用python+sklearn實現線性回歸示例
    在圖中可以看到線性回歸如何嘗試繪製一條直線,該直線將最大程度地減少數據集中的目標值(responses)與線性近似預測值之間的殘差平方和(residual sum of squares)。還要計算殘差平方和(residual sum of squares),和確定係數(coefficient of determination)。