[Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)
歡迎大家來到“Python從零到壹”,在這里我將分享約200篇Python系列文章,帶大家一起去學習和玩耍,看看Python這個有趣的世界。所有文章都將結合案例、代碼和作者的經驗講解,真心想把自己近十年的編程經驗分享給大家,希望對您有所幫助,文章中不足之處也請海涵。Python系列整體框架包括基礎語法10篇、網絡爬蟲30篇、可視化分析10篇、機器學習20篇、大數據分析20篇、圖像識別30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的關注、點贊和轉發就是對秀璋最大的支持,知識無價人有情,希望我們都能在人生路上開心快樂、共同成長。
前一篇文章講述了數據分析部分,主要普及網絡數據分析的基本概念,講述數據分析流程和相關技術,同時詳細講解Python提供的若干第三方數據分析庫,包括Numpy、Pandas、Matplotlib、Sklearn等。本文介紹回歸模型的原理知識,包括線性回歸、多項式回歸和邏輯回歸,并詳細介紹Python Sklearn機器學習庫的LinearRegression和LogisticRegression算法及回歸分析實例。進入基礎文章,希望對您有所幫助。
文章目錄
- 一.回歸
- 1.什么是回歸
- 2.線性回歸
- 二.線性回歸分析
- 1.LinearRegression
- 2.線性回歸預測糖尿病
- 三.多項式回歸分析
- 1.基礎概念
- 2.PolynomialFeatures
- 3.多項式回歸預測成本和利潤
- 四.邏輯回歸
- 1.基礎原理
- 2.LogisticRegression
- 3.鳶尾花數據集回歸分析實例
- 五.本章小結
下載地址:
- https://github.com/eastmountyxz/Python-zero2one
前文賞析:
第一部分 基礎語法
- [Python從零到壹] 一.為什么我們要學Python及基礎語法詳解
- [Python從零到壹] 二.語法基礎之條件語句、循環語句和函數
- [Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象
第二部分 網絡爬蟲
- [Python從零到壹] 四.網絡爬蟲之入門基礎及正則表達式抓取博客案例
- [Python從零到壹] 五.網絡爬蟲之BeautifulSoup基礎語法萬字詳解
- [Python從零到壹] 六.網絡爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解
- [Python從零到壹] 七.網絡爬蟲之Requests爬取豆瓣電影TOP250及CSV存儲
- [Python從零到壹] 八.數據庫之MySQL基礎知識及操作萬字詳解
- [Python從零到壹] 九.網絡爬蟲之Selenium基礎技術萬字詳解(定位元素、常用方法、鍵盤鼠標操作)
- [Python從零到壹] 十.網絡爬蟲之Selenium爬取在線百科知識萬字詳解(NLP語料構造必備技能)
第三部分 數據分析和機器學習
- [Python從零到壹] 十一.數據分析之Numpy、Pandas、Matplotlib和Sklearn入門知識萬字詳解(1)
- [Python從零到壹] 十二.機器學習之回歸分析萬字總結全網首發(線性回歸、多項式回歸、邏輯回歸)
作者新開的“娜璋AI安全之家”將專注于Python和安全技術,主要分享Web滲透、系統安全、人工智能、大數據分析、圖像識別、惡意代碼檢測、CVE復現、威脅情報分析等文章。雖然作者是一名技術小白,但會保證每一篇文章都會很用心地撰寫,希望這些基礎性文章對你有所幫助,在Python和安全路上與大家一起進步。
監督學習(Supervised Learning)包括分類算法(Classification)和回歸算法(Regression)兩種,它們是根據類別標簽分布的類型來定義的。回歸算法用于連續型的數據預測,分類算法用于離散型的分布預測。回歸算法作為統計學中最重要的工具之一,它通過建立一個回歸方程用來預測目標值,并求解這個回歸方程的回歸系數。
一.回歸
1.什么是回歸
回歸(Regression)最早是英國生物統計學家高爾頓和他的學生皮爾遜在研究父母和子女的身高遺傳特性時提出的。1855年,他們在《遺傳的身高向平均數方向的回歸》中這樣描述“子女的身高趨向于高于父母的身高的平均值,但一般不會超過父母的身高”,首次提出來回歸的概念。現在的回歸分析已經和這種趨勢效應沒有任何瓜葛了,它只是指源于高爾頓工作,用一個或多個自變量來預測因變量的數學方法。
圖1是一個簡單的回歸模型,X坐標是質量,Y坐標是用戶滿意度,從圖中可知,產品的質量越高其用戶評價越好,這可以擬合一條直線來預測新產品的用戶滿意度。
在回歸模型中,我們需要預測的變量叫做因變量,比如產品質量;選取用來解釋因變量變化的變量叫做自變量,比如用戶滿意度。回歸的目的就是建立一個回歸方程來預測目標值,整個回歸的求解過程就是求這個回歸方程的回歸系數。
簡言之,回歸最簡單的定義就是:
- 給出一個點集,構造一個函數來擬合這個點集,并且盡可能的讓該點集與擬合函數間的誤差最小,如果這個函數曲線是一條直線,那就被稱為線性回歸,如果曲線是一條三次曲線,就被稱為三次多項回歸。
2.線性回歸
首先,作者引用類似于斯坦福大學機器學習公開課線性回歸的例子,給大家講解線性回歸的基礎知識和應用,方便大家的理解。同時,作者強烈推薦大家學習原版Andrew Ng教授的斯坦福機器學習公開課,會讓您非常受益。
假設存在表1的數據集,它是某企業的成本和利潤數據集。數據集中2002年到2016年的數據集稱為訓練集,整個訓練集共15個樣本數據。重點是成本和利潤兩個變量,成本是輸入變量或一個特征,利潤是輸出變量或目標變量,整個回歸模型如圖2所示。
現建立模型,x表示企業成本,y表示企業利潤,h(Hypothesis)表示將輸入變量映射到輸出變量y的函數,對應一個因變量的線性回歸(單變量線性回歸)公式如下:
那么,現在要解決的問題是如何求解的兩個參數和。我們的構想是選取的參數和使得函數盡可能接近y值,這里提出了求訓練集(x,y)的平方誤差函數(Squared Error Function)或最小二乘法。
在回歸方程里,最小化誤差平方和方法是求特征對應回歸系數的最佳方法。誤差是指預測y值和真實y值之間的差值,使用誤差的簡單累加將使得正差值和負差值相互抵消,所采用的平方誤差(最小二乘法)如下:
在數學上,求解過程就轉化為求一組值使上式取到最小值,最常見的求解方法是梯度下降法(Gradient Descent)。根據平方誤差,定義該線性回歸模型的損耗函數(Cost Function)為,公式如下:
選擇適當的參數讓其最小化min,即可實現擬合求解過程。通過上面的這個示例,我們就可以對線性回歸模型進行如下定義:根據樣本x和y的坐標,去預估函數h,尋求變量之間近似的函數關系。公式如下:
其中,n表示特征數目,表示每個訓練樣本的第i個特種值,當只有一個因變量x時,稱為一元線性回歸,類似于;而當多個因變量時,成為多元線性回歸。我們的目的是使最小化,從而最好的將樣本數據集進行擬合,更好地預測新的數據。
多項式回歸或邏輯回歸相關知識將在后面介紹。
二.線性回歸分析
線性回歸是數據挖掘中基礎的算法之一,其核心思想是求解一組因變量和自變量之間的方程,得到回歸函數,同時誤差項通常使用最小二乘法進行計算。在本書常用的Sklaern機器學習包中將調用Linear_model子類的LinearRegression類進行線性回歸模型計算。
1.LinearRegression
LinearRegression回歸模型在Sklearn.linear_model子類下,主要是調用fit(x,y)函數來訓練模型,其中x為數據的屬性,y為所屬類型。sklearn中引用回歸模型的代碼如下:
from sklearn import linear_model #導入線性模型 regr = linear_model.LinearRegression() #使用線性回歸 print(regr)輸出函數的構造方法如下:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)其中參數說明如下:
- copy_X:布爾型,默認為True。是否對X復制,如果選擇False,則直接對原始數據進行覆蓋,即經過中心化、標準化后,把新數據覆蓋到原數據上。
- fit_intercept:布爾型,默認為True。是否對訓練數據進行中心化,如果是True表示對輸入的訓練數據進行中心化處理,如果是False則輸入數據已經中心化處理,后面的過程不再進行中心化處理。
- n_jobs:整型,默認為1。計算時設置的任務個數,如果設置為-1表示使用所有的CPU。該參數對于目標個數大于1且規模足夠大的問題有加速作用。
- normalize:布爾型,默認為False。是否對數據進行標準化處理。
LinearRegression類主要包括如下方法:
- fit(X,y[,n_jobs])
對訓練集X,y進行訓練,分析模型參數,填充數據集。其中X為特征,y為標記或類屬性。 - predict(X)
使用訓練得到的估計器或模型對輸入的X數據集進行預測,返回結果為預測值。數據集X通常劃分為訓練集和測試集。 - decision_function(X)
使用訓練得到的估計器或模型對數據集X進行預測。它與predict(X)區別在于該方法包含了對輸入數據的類型檢查和當前對象是否存在coef_屬性的檢查,更安全。 - score(X, y[,]samples_weight)
返回對于以X為samples、y為target的預測效果評分。 - get_params([deep])
獲取該估計器(Estimator)的參數。 - **set_params(params)
設置該估計器(Estimator)的參數。 - coef_
存放LinearRegression模型的回歸系數。 - intercept_
存放LinearRegression模型的回歸截距。
現在對前面的企業成本和利潤數據集進行線性回歸實驗。完整代碼如下:
# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 from sklearn import linear_model #導入線性模型 import matplotlib.pyplot as plt import numpy as np#X表示企業成本 Y表示企業利潤 X = [[400], [450], [486], [500], [510], [525], [540], [549], [558], [590], [610], [640], [680], [750], [900]] Y = [[80], [89], [92], [102], [121], [160], [180], [189], [199], [203], [247], [250], [259], [289], [356]] print('數據集X: ', X) print('數據集Y: ', Y)#回歸訓練 clf = linear_model.LinearRegression() clf.fit(X, Y)#預測結果 X2 = [[400], [750], [950]] Y2 = clf.predict(X2) print(Y2) res = clf.predict(np.array([1200]).reshape(-1, 1))[0] print('預測成本1200元的利潤:$%.1f' % res) #繪制線性回歸圖形 plt.plot(X, Y, 'ks') #繪制訓練數據集散點圖 plt.plot(X2, Y2, 'g-') #繪制預測數據集直線 plt.show()調用sklearn包中的LinearRegression()回歸函數,fit(X,Y)載入數據集進行訓練,然后通過predict(X2)預測數據集X2的利潤,并將預測結果繪制成直線,(X,Y)數據集繪制成散點圖,如圖3所示。
同時調用代碼預測2017年企業成本為1200元的利潤為575.1元。注意,線性模型的回歸系數會保存在coef_變量中,截距保存在intercept_變量中。clf.score(X, Y) 是一個評分函數,返回一個小于1的得分。評分過程的代碼如下:
print('系數', clf.coef_) print('截距', clf.intercept_) print('評分函數', clf.score(X, Y))''' 系數 [[ 0.62402912]] 截距 [-173.70433885] 評分函數 0.911831188777 '''該直線對應的回歸函數為:y = 0.62402912 * x - 173.70433885,則X2[1]=400這個點預測的利潤值為75.9,而X1中成本為400元對應的真實利潤是80元,預測是基本準確的。
2.線性回歸預測糖尿病
(1).糖尿病數據集
Sklearn機器學習包提供了糖尿病數據集(Diabetes Dataset),該數據集主要包括442行數據,10個特征值,分別是:年齡(Age)、性別(Sex)、體質指數(Body mass index)、平均血壓(Average Blood Pressure)、S1~S6一年后疾病級數指標。預測指標為Target,它表示一年后患疾病的定量指標。原網址的描述如圖4所示:
下面代碼進行簡單的調用及數據規模的測試。
# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 from sklearn import datasets diabetes = datasets.load_diabetes() #載入數據 print(diabetes.data) #數據 print(diabetes.target) #類標 print('總行數: ', len(diabetes.data), len(diabetes.target)) print('特征數: ', len(diabetes.data[0])) #每行數據集維數 print('數據類型: ', diabetes.data.shape) print(type(diabetes.data), type(diabetes.target))調用load_diabetes()函數載入糖尿病數據集,然后輸出其數據data和類標target。輸出總行數442行,特征數共10個,類型為(442L, 10L)。其輸出如下所示:
[[ 0.03807591 0.05068012 0.06169621 ..., -0.00259226 0.01990842 -0.01764613] [-0.00188202 -0.04464164 -0.05147406 ..., -0.03949338 -0.06832974 -0.09220405] ... [-0.04547248 -0.04464164 -0.0730303 ..., -0.03949338 -0.00421986 0.00306441]] [ 151. 75. 141. 206. 135. 97. 138. 63. 110. 310. 101. ... 64. 48. 178. 104. 132. 220. 57.] 總行數: 442 442 特征數: 10 數據類型: (442L, 10L) <type 'numpy.ndarray'> <type 'numpy.ndarray'>(2).代碼實現
現在我們將糖尿病數據集劃分為訓練集和測試集,整個數據集共442行,我們取前422行數據用來線性回歸模型訓練,后20行數據用來預測。其中取預測數據的代碼為diabetes_x_temp[-20:],表示從后20行開始取值,直到數組結束,共取值20個數。
整個數據集共10個特征值,為了方便可視化畫圖我們只獲取其中一個特征進行實驗,這也可以繪制圖形,而真實分析中,通常經過降維處理再繪制圖形。這里獲取第3個特征,對應代碼為:diabetes_x_temp = diabetes.data[:, np.newaxis, 2]。完整代碼如下:
# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 from sklearn import datasets import matplotlib.pyplot as plt from sklearn import linear_model import numpy as np #數據集劃分 diabetes = datasets.load_diabetes() #載入數據 diabetes_x_temp = diabetes.data[:, np.newaxis, 2] #獲取其中一個特征 diabetes_x_train = diabetes_x_temp[:-20] #訓練樣本 diabetes_x_test = diabetes_x_temp[-20:] #測試樣本 后20行 diabetes_y_train = diabetes.target[:-20] #訓練標記 diabetes_y_test = diabetes.target[-20:] #預測對比標記#回歸訓練及預測 clf = linear_model.LinearRegression() clf.fit(diabetes_x_train, diabetes_y_train) #訓練數據集 pre = clf.predict(diabetes_x_test)#繪圖 plt.title(u'LinearRegression Diabetes') #標題 plt.xlabel(u'Attributes') #x軸坐標 plt.ylabel(u'Measure of disease') #y軸坐標 plt.scatter(diabetes_x_test, diabetes_y_test, color = 'black') #散點圖 plt.plot(diabetes_x_test, pre, color='blue', linewidth = 2) #預測直線 plt.show()輸出結果如圖5所示,每個點表示真實的值,而直線表示預測的結果。
(3).代碼優化
下面代碼增加了幾個優化措施,包括增加了斜率、 截距的計算,可視化繪圖增加了散點到線性方程的距離線,增加了保存圖片設置像素代碼等。這些優化都更好地幫助我們分析真實的數據集。
繪制的圖形如圖6所示。
輸出結果如下:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False) 預測結果 [ 196.51241167 109.98667708 121.31742804 245.95568858 204.75295782270.67732703 75.99442421 241.8354155 104.83633574 141.91879342126.46776938 208.8732309 234.62493762 152.21947611 159.42995399161.49009053 229.47459628 221.23405012 129.55797419 100.71606266118.22722323 168.70056841 227.41445974 115.13701842 163.55022706114.10695016 120.28735977 158.39988572 237.71514243 121.3174280498.65592612 123.37756458 205.78302609 95.56572131 154.27961264130.58804246 82.17483382 171.79077322 137.79852034 137.79852034190.33200206 83.20490209] 真實結果 [ 175. 93. 168. 275. 293. 281. 72. 140. 189. 181. 209. 136.261. 113. 131. 174. 257. 55. 84. 42. 146. 212. 233. 91.111. 152. 120. 67. 310. 94. 183. 66. 173. 72. 49. 64.48. 178. 104. 132. 220. 57.]平方和計算: 83.192340827 系數 [ 955.70303385] 截距 153.000183957 方差 0.427204267067其中cost = np.mean(y_test-pre)**2表示計算預測結果和真實結果之間的平方和,為83.192340827,根據系數和截距得出其方程為:y = 955.70303385 * x + 153.000183957。
三.多項式回歸分析
1.基礎概念
線性回歸研究的是一個目標變量和一個自變量之間的回歸問題,但有時候在很多實際問題中,影響目標變量的自變量往往不止一個,而是多個,比如綿羊的產毛量這一變量同時受到綿羊體重、胸圍、體長等多個變量的影響,因此需要設計一個目標變量與多個自變量間的回歸分析,即多元回歸分析。由于線性回歸并不適用于所有的數據,我們需要建立曲線來適應我們的數據,現實世界中的曲線關系很多都是增加多項式實現的,比如一個二次函數模型:
再或者一個三次函數模型:
這兩個模型我們繪制的圖形如下所示:
多項式回歸(Polynomial Regression)是研究一個因變量與一個或多個自變量間多項式的回歸分析方法。如果自變量只有一個時,稱為一元多項式回歸;如果自變量有多個時,稱為多元多項式回歸。在一元回歸分析中,如果依變量y與自變量x的關系為非線性的,但是又找不到適當的函數曲線來擬合,則可以采用一元多項式回歸。17.3小節主要講解一元多次的多項式回歸分析,一元m次多項式方程如下:
其方程的求解過程希望讀者下來自行學習,接下來作者主要講解Python如何代碼實現多項式回歸分析的。
2.PolynomialFeatures
Python的多項式回歸需要導入sklearn.preprocessing子類中PolynomialFeatures類實現。PolynomialFeatures對應的函數原型如下:
class sklearn.preprocessing.PolynomialFeatures(degree=2, interaction_only=False, include_bias=True)PolynomialFeatures類在Sklearn官網給出的解釋是:專門產生多項式的模型或類,并且多項式包含的是相互影響的特征集。共有三個參數,degree表示多項式階數,一般默認值是2;interaction_only如果值是true(默認是False),則會產生相互影響的特征集;include_bias表示是否包含偏差列。
PolynomialFeatures類通過實例化一個多項式,建立等差數列矩陣,然后進行訓練和預測,最后繪制相關圖形,接下來與前面的一元線性回歸分析進行對比試驗。
3.多項式回歸預測成本和利潤
本小節主要講解多項式回歸分析實例,分析的數據集是表17.1提供的企業成本和利潤數據集。下面直接給出線性回歸和多項式回歸分析對比的完整代碼和詳細注釋。
# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures import matplotlib.pyplot as plt import numpy as np#X表示企業成本 Y表示企業利潤 X = [[400], [450], [486], [500], [510], [525], [540], [549], [558], [590], [610], [640], [680], [750], [900]] Y = [[80], [89], [92], [102], [121], [160], [180], [189], [199], [203], [247], [250], [259], [289], [356]] print('數據集X: ', X) print('數據集Y: ', Y)#第一步 線性回歸分析 clf = LinearRegression() clf.fit(X, Y) X2 = [[400], [750], [950]] Y2 = clf.predict(X2) print(Y2) res = clf.predict(np.array([1200]).reshape(-1, 1))[0] print('預測成本1200元的利潤:$%.1f' % res) plt.plot(X, Y, 'ks') #繪制訓練數據集散點圖 plt.plot(X2, Y2, 'g-') #繪制預測數據集直線#第二步 多項式回歸分析 xx = np.linspace(350,950,100) #350到950等差數列 quadratic_featurizer = PolynomialFeatures(degree = 2) #實例化一個二次多項式 x_train_quadratic = quadratic_featurizer.fit_transform(X) #用二次多項式x做變換 X_test_quadratic = quadratic_featurizer.transform(X2) regressor_quadratic = LinearRegression() regressor_quadratic.fit(x_train_quadratic, Y)#把訓練好X值的多項式特征實例應用到一系列點上,形成矩陣 xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1)) plt.plot(xx, regressor_quadratic.predict(xx_quadratic), "r--",label="$y = ax^2 + bx + c$",linewidth=2) plt.legend() plt.show()輸出圖形如下圖所示,其中黑色散點圖表示真實的企業成本和利潤的關系,綠色直線為一元線性回歸方程,紅色虛曲線為二次多項式方程。它更接近真實的散點圖。
這里我們使用R方(R-Squared)來評估多項式回歸預測的效果,R方也叫確定系數(Coefficient of Determination),它表示模型對現實數據擬合的程度。計算R方的方法有幾種,一元線性回歸中R方等于皮爾遜積矩相關系數(Pearson Product Moment Correlation Coefficient)的平方,該方法計算的R方是一定介于0~1之間的正數。另一種是Sklearn庫提供的方法來計算R方。R方計算代碼如下:
print('1 r-squared', clf.score(X, Y)) print('2 r-squared', regressor_quadratic.score(x_train_quadratic, Y))輸出如下所示:
('1 r-squared', 0.9118311887769025) ('2 r-squared', 0.94073599498559335)一元線性回歸的R方值為0.9118,多項式回歸的R方值為0.9407,說明數據集中超過94%的價格都可以通過模型解釋。最后補充5次項的擬合過程,下面只給出核心代碼。
# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures import matplotlib.pyplot as plt import numpy as np#X表示企業成本 Y表示企業利潤 X = [[400], [450], [486], [500], [510], [525], [540], [549], [558], [590], [610], [640], [680], [750], [900]] Y = [[80], [89], [92], [102], [121], [160], [180], [189], [199], [203], [247], [250], [259], [289], [356]] print('數據集X: ', X) print('數據集Y: ', Y)#第一步 線性回歸分析 clf = LinearRegression() clf.fit(X, Y) X2 = [[400], [750], [950]] Y2 = clf.predict(X2) print(Y2) res = clf.predict(np.array([1200]).reshape(-1, 1))[0] print('預測成本1200元的利潤:$%.1f' % res) plt.plot(X, Y, 'ks') #繪制訓練數據集散點圖 plt.plot(X2, Y2, 'g-') #繪制預測數據集直線#第二步 多項式回歸分析 xx = np.linspace(350,950,100) quadratic_featurizer = PolynomialFeatures(degree = 5) x_train_quadratic = quadratic_featurizer.fit_transform(X) X_test_quadratic = quadratic_featurizer.transform(X2) regressor_quadratic = LinearRegression() regressor_quadratic.fit(x_train_quadratic, Y) #把訓練好X值的多項式特征實例應用到一系列點上,形成矩陣 xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1)) plt.plot(xx, regressor_quadratic.predict(xx_quadratic), "r--",label="$y = ax^2 + bx + c$",linewidth=2) plt.legend() plt.show() print('1 r-squared', clf.score(X, Y)) print('5 r-squared', regressor_quadratic.score(x_train_quadratic, Y))# ('1 r-squared', 0.9118311887769025) # ('5 r-squared', 0.98087802460869788)輸出如下所示,其中紅色虛線為五次多項式曲線,它更加接近真實數據集的分布情況,而綠色直線為一元線性回歸方程,顯然相較于五次多項式曲線,線性方程擬合的結果更差。同時,五次多項式曲線的R方值為98.08%,非常準確的預測了數據趨勢。
最后補充一點,建議多項式回歸的階數不要太高,否則會出現過擬合現象。
四.邏輯回歸
1.基礎原理
在前面講述的回歸模型中,處理的因變量都是數值型區間變量,建立的模型描述是因變量的期望與自變量之間的線性關系或多項式曲線關系。比如常見的線性回歸模型:
而在采用回歸模型分析實際問題中,所研究的變量往往不全是區間變量而是順序變量或屬性變量,比如二項分布問題。通過分析年齡、性別、體質指數、平均血壓、疾病指數等指標,判斷一個人是否換糖尿病,Y=0表示未患病,Y=1表示患病,這里的響應變量是一個兩點(0或1)分布變量,它就不能用h函數連續的值來預測因變量Y(Y只能取0或1)。
總之,線性回歸或多項式回歸模型通常是處理因變量為連續變量的問題,如果因變量是定性變量,線性回歸模型就不再適用了,此時需采用邏輯回歸模型解決。
邏輯回歸(Logistic Regression)是用于處理因變量為分類變量的回歸問題,常見的是二分類或二項分布問題,也可以處理多分類問題,它實際上是屬于一種分類方法。
二分類問題的概率與自變量之間的關系圖形往往是一個S型曲線,如圖17.10所示,采用的Sigmoid函數實現。這里我們將該函數定義如下:
函數的定義域為全體實數,值域在[0,1]之間,x軸在0點對應的結果為0.5。當x取值足夠大的時候,可以看成0或1兩類問題,大于0.5可以認為是1類問題,反之是0類問題,而剛好是0.5,則可以劃分至0類或1類。對于0-1型變量,y=1的概率分布公式定義如下:
y=0的概率分布公式定義如下:
其離散型隨機變量期望值公式如下:
采用線性模型進行分析,其公式變換如下:
而實際應用中,概率p與因變量往往是非線性的,為了解決該類問題,我們引入了logit變換,使得logit§與自變量之間存在線性相關的關系,邏輯回歸模型定義如下:
通過推導,概率p變換如下,這與Sigmoid函數相符,也體現了概率p與因變量之間的非線性關系。以0.5為界限,預測p大于0.5時,我們判斷此時y更可能為1,否則y為0。
得到所需的Sigmoid函數后,接下來只需要和前面的線性回歸一樣,擬合出該式中n個參數θ即可。下列為繪制Sigmoid曲線,輸出如圖10所示。
# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 import matplotlib.pyplot as plt import numpy as npdef Sigmoid(x):return 1.0 / (1.0 + np.exp(-x))x= np.arange(-10, 10, 0.1) h = Sigmoid(x) #Sigmoid函數 plt.plot(x, h) plt.axvline(0.0, color='k') #坐標軸上加一條豎直的線(0位置) plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted') plt.axhline(y=0.5, ls='dotted', color='k') plt.yticks([0.0, 0.5, 1.0]) #y軸標度 plt.ylim(-0.1, 1.1) #y軸范圍 plt.show()由于篇幅有限,邏輯回歸構造損失函數J函數,求解最小J函數及回歸參數θ的方法就不在敘述,原理和前面介紹的一樣,請讀者下去深入研究。
2.LogisticRegression
LogisticRegression回歸模型在Sklearn.linear_model子類下,調用sklearn邏輯回歸算法步驟比較簡單,即:
- 導入模型。調用邏輯回歸LogisticRegression()函數。
- fit()訓練。調用fit(x,y)的方法來訓練模型,其中x為數據的屬性,y為所屬類型。
- predict()預測。利用訓練得到的模型對數據集進行預測,返回預測結果。
代碼如下:
# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 from sklearn.linear_model import LogisticRegression #導入邏輯回歸模型 clf = LogisticRegression() print(clf) clf.fit(train_feature,label) predict['label'] = clf.predict(predict_feature)輸出函數的構造方法如下:
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,penalty='l2', random_state=None, solver='liblinear', tol=0.0001,verbose=0, warm_start=False)這里僅介紹兩個參數:參數penalty表示懲罰項,包括兩個可選值L1和L2。L1表示向量中各元素絕對值的和,常用于特征選擇;L2表示向量中各個元素平方之和再開根號,當需要選擇較多的特征時,使用L2參數,使他們都趨近于0。C值的目標函數約束條件為:s.t.||w||1<C,默認值是0,C值越小,則正則化強度越大。
3.鳶尾花數據集回歸分析實例
下面將結合Scikit-learn官網的邏輯回歸模型分析鳶尾花數據集。由于該數據分類標簽劃分為3類(0類、1類、2類),屬于三分類問題,所以能利用邏輯回歸模型對其進行分析。
(1).鳶尾花數據集
在Sklearn機器學習包中,集成了各種各樣的數據集,包括前面的糖尿病數據集,這里引入的是鳶尾花卉(Iris)數據集,它也是一個很常用的數據集。該數據集一共包含4個特征變量,1個類別變量,共有150個樣本。其中四個特征分別是萼片的長度和寬度、花瓣的長度和寬度,一個類別變量是標記鳶尾花所屬的分類情況,該值包含三種情況,即山鳶尾(Iris-setosa)、變色鳶尾(Iris-versicolor)和維吉尼亞鳶尾(Iris-virginica)。鳶尾花數據集詳細介紹如表2所示:
Class 類別變量。0表示山鳶尾,1表示變色鳶尾,2表示維吉尼亞鳶尾。 int
iris里有兩個屬性iris.data,iris.target。data是一個矩陣,每一列代表了萼片或花瓣的長寬,一共4列,每一行代表一個被測量的鳶尾植物,一共采樣了150條記錄,即150朵鳶尾花樣本。
輸出如下所示:
[[ 5.1 3.5 1.4 0.2][ 4.9 3. 1.4 0.2][ 4.7 3.2 1.3 0.2][ 4.6 3.1 1.5 0.2]....[ 6.7 3. 5.2 2.3][ 6.3 2.5 5. 1.9][ 6.5 3. 5.2 2. ][ 6.2 3.4 5.4 2.3][ 5.9 3. 5.1 1.8]]target是一個數組,存儲了每行數據對應的樣本屬于哪一類鳶尾植物,要么是山鳶尾(值為0),要么是變色鳶尾(值為1),要么是維吉尼亞鳶尾(值為2),數組的長度是150。
print(iris.target) #輸出真實標簽 print(len(iris.target)) #150個樣本 每個樣本4個特征 print(iris.data.shape) [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2] 150 (150L, 4L)從輸出結果可以看到,類標共分為三類,前面50個類標位0,中間50個類標位1,后面為2。下面給詳細介紹使用邏輯回歸對這個數據集進行分析的代碼。
(2).散點圖繪制
在載入了鳶尾花數據集(數據data和標簽target)之后,我們需要獲取其中兩列數據或兩個特征,再調用scatter()函數繪制散點圖。其中獲取一個特征的核心代碼為:X = [x[0] for x in DD],將獲取的值賦值給X變量。完整代碼如下:
輸出如圖11所示:
(3).線性回歸分析
下述代碼先獲取鳶尾花數據集的前兩列數據,再調用Sklearn庫中線性回歸模型進行分析,完整代碼如文件所示。
輸出圖形如圖12所示,并且可以看到所有散點到擬合的一元一次方程的距離。
(4).邏輯回歸分析鳶尾花
講解完線性回歸分析之后,那如果用邏輯回歸分析的結果究竟如何呢?下面開始講述。從散點圖(圖11)中可以看出,數據集是線性可分的,劃分為3類,分別對應三種類型的鳶尾花,下面采用邏輯回歸對其進行分析預測。
前面使用X=[x[0] for x in DD]獲取第一列數據,Y=[x[1] for x in DD]獲取第二列數據,這里采用另一種方法,iris.data[:, :2]獲取其中兩列數據或兩個特征,完整代碼如下:
# -*- coding: utf-8 -*- # By:Eastmount CSDN 2021-07-03 import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression #載入數據集 iris = load_iris() X = X = iris.data[:, :2] #獲取花卉兩列數據集 Y = iris.target #邏輯回歸模型 lr = LogisticRegression(C=1e5) lr.fit(X,Y)#meshgrid函數生成兩個網格矩陣 h = .02 x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5 y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))#pcolormesh函數將xx,yy兩個網格矩陣和對應的預測結果Z繪制在圖片上 Z = lr.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.figure(1, figsize=(8,6)) plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)#繪制散點圖 plt.scatter(X[:50,0], X[:50,1], color='red',marker='o', label='setosa') plt.scatter(X[50:100,0], X[50:100,1], color='blue', marker='x', label='versicolor') plt.scatter(X[100:,0], X[100:,1], color='green', marker='s', label='Virginica') plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.xticks(()) plt.yticks(()) plt.legend(loc=2) plt.show()輸出如圖13所示。經過邏輯回歸后劃分為三個區域,左上角部分為紅色的圓點,對應setosa鳶尾花;右上角部分為綠色方塊,對應virginica鳶尾花;中間下部分為藍色星形,對應versicolor鳶尾花。散點圖為各數據點真實的花類型,劃分的三個區域為數據點預測的花類型,預測的分類結果與訓練數據的真實結果結果基本一致,部分鳶尾花出現交叉。
下面作者對導入數據集后的代碼進行詳細講解。
- lr = LogisticRegression(C=1e5)
初始化邏輯回歸模型,C=1e5表示目標函數。 - lr.fit(X,Y)
調用邏輯回歸模型進行訓練,參數X為數據特征,參數Y為數據類標。 - x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
- y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
- xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
獲取鳶尾花數據集的兩列數據,對應為花萼長度和花萼寬度,每個點的坐標就是(x,y)。 先取X二維數組的第一列(長度)的最小值、最大值和步長h(設置為0.02)生成數組,再取X二維數組的第二列(寬度)的最小值、最大值和步長h生成數組, 最后用meshgrid函數生成兩個網格矩陣xx和yy,如下所示:
- Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])
調用ravel()函數將xx和yy的兩個矩陣轉變成一維數組,由于兩個矩陣大小相等,因此兩個一維數組大小也相等。np.c_[xx.ravel(), yy.ravel()]是獲取并合并成矩陣,即:
總之,上述操作是把第一列花萼長度數據按h取等分作為行,并復制多行得到xx網格矩陣;再把第二列花萼寬度數據按h取等分作為列,并復制多列得到yy網格矩陣;最后將xx和yy矩陣都變成兩個一維數組,再調用np.c_[]函數將其組合成一個二維數組進行預測。
- Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])
調用predict()函數進行預測,預測結果賦值給Z。即:
- Z = Z.reshape(xx.shape)
調用reshape()函數修改形狀,將Z變量轉換為兩個特征(長度和寬度),則39501個數據轉換為171*231的矩陣。Z = Z.reshape(xx.shape)輸出如下:
- plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
調用pcolormesh()函數將xx、yy兩個網格矩陣和對應的預測結果Z繪制在圖片上,可以發現輸出為三個顏色區塊,分布表示分類的三類區域。cmap=plt.cm.Paired表示繪圖樣式選擇Paired主題,輸出區域如下圖所示:
- plt.scatter(X[:50,0], X[:50,1], color=‘red’,marker=‘o’, label=‘setosa’)
調用scatter()繪制散點圖,第一個參數為第一列數據(長度),第二個參數為第二列數據(寬度),第三、四個參數為設置點的顏色為紅色,款式為圓圈,最后標記為setosa。
五.本章小結
回歸分析是通過建立一個回歸方程用來預測目標值,并求解這個回歸方程的回歸系數的方法。它是統計學中最重要的工具之一,包括線性回歸、多項式回歸、邏輯回歸、非線性回歸等。常用來確定變量之間是否存在相關關系,并找出數學表達式,也可以通過控制幾個變量的值來預測另一個變量的值,比如房價預測、增長趨勢、是否患病等問題。
在Python中,我們通過調用Sklearn機器學習庫的LinearRegression模型實現線性回歸分析,調用PolynomialFeatures模型實現多項式回歸分析,調用LogisticRegression模型實現邏輯回歸分析。希望讀者實現本章節中的每一部分代碼,從而更好的用于自己的研究領域、解決自己遇到的問題。
該系列所有代碼下載地址:
- https://github.com/eastmountyxz/Python-zero2one
感謝在求學路上的同行者,不負遇見,勿忘初心。這周的留言感慨~
(By:娜璋之家 Eastmount 2021-07-03 夜于武漢 https://blog.csdn.net/Eastmount )
參考文獻:
- [1] 楊秀璋. 專欄:知識圖譜、web數據挖掘及NLP - CSDN博客[EB/OL]. (2016-09-19)[2017-11-07]. http://blog.csdn.net/column/details/eastmount-kgdmnlp.html.
- [2] 張良均,王路,譚立云,蘇劍林. Python數據分析與挖掘實戰[M]. 北京:機械工業出版社,2016.
- [3] (美)Wes McKinney著. 唐學韜等譯. 利用Python進行數據分析[M]. 北京:機械工業出版社,2013.
- [4] Jiawei Han,Micheline Kamber著. 范明,孟小峰譯. 數據挖掘概念與技術. 北京:機械工業出版社,2007.
- [5] 楊秀璋. [Python數據挖掘課] 五.線性回歸知識及預測糖尿病實例[EB/OL].(2016-10-28)[2017-11-07]. http://blog.csdn.net/eastmount/article/details/52929765.
- [6] 楊秀璋. [Python數據挖掘課程] 九.回歸模型LinearRegression簡單分析氧化物數據[EB/OL]. (2017-03-05)[2017-11-07].http://blog.csdn.net/eastmount/article/
details/60468818. - [7] scikit-learn. sklearn.linear_model.LogisticRegression[EB/OL]. (2017)[2017-11-17]. http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html.
- [8] scikit-learn. Logistic Regression 3-class Classifier[EB/OL]. (2017)[2017-11-17]. http://scikit-learn.org/stable/auto_examples/linear_model/plot_iris_logistic.html#sphx-glr-auto-examples-linear-model-plot-iris-logistic-py.
- [9] 吳恩達. Coursera公開課: 斯坦福大學機器學習"[EB/OL]. (2011-2017)[2017-11-15]. http://open.163.com/special/opencourse/machinelearning.html.
- [10] scikit-learn. Sklearn Datasets[EB/OL]. (2017)[2017-11-15]. http://scikit-learn.org/
stable/datasets/. - [11] lsldd. 用Python開始機器學習(7:邏輯回歸分類)[EB/OL]. (2014-11-27)[2017-11-15]. http://blog.csdn.net/lsldd/article/details/41551797.
- [12] 楊秀璋. [python數據挖掘課程] 十六.邏輯回歸LogisticRegression分析鳶尾花數據[EB/OL]. (2017-09-10)[2017-11-15]. http://blog.csdn.net/eastmount/article/details/77920470.
- [13] 楊秀璋. [python數據挖掘課程] 十八.線性回歸及多項式回歸分析四個案例分享[EB/OL]. (2017-11-26)[2017-11-26]. http://blog.csdn.net/eastmount/article/details/78635096.
總結
以上是生活随笔為你收集整理的[Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Python从零到壹] 十一.数据分析
- 下一篇: [Python从零到壹] 十三.机器学习