歡迎大家來到“Python從零到壹”,在這里我將分享約200篇Python系列文章,帶大家一起去學(xué)習(xí)和玩耍,看看Python這個有趣的世界。Python系列整體框架包括基礎(chǔ)語法10篇、網(wǎng)絡(luò)爬蟲30篇、可視化分析10篇、機器學(xué)習(xí)20篇、大數(shù)據(jù)分析20篇、圖像識別30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的關(guān)注、點贊和轉(zhuǎn)發(fā)就是對秀璋最大的支持,知識無價人有情,希望我們都能在人生路上開心快樂、共同成長。
前一篇文章講述了數(shù)據(jù)分析部分,主要普及網(wǎng)絡(luò)數(shù)據(jù)分析的基本概念,講述數(shù)據(jù)分析流程和相關(guān)技術(shù),同時詳細講解Python提供的若干第三方數(shù)據(jù)分析庫,包括Numpy、Pandas、Matplotlib、Sklearn等。本文介紹回歸模型的原理知識,包括線性回歸、多項式回歸和邏輯回歸,并詳細介紹Python Sklearn機器學(xué)習(xí)庫的LinearRegression和LogisticRegression算法及回歸分析實例。進入基礎(chǔ)文章,希望對您有所幫助。
下載地址:
前文賞析:
第一部分 基礎(chǔ)語法
第二部分 網(wǎng)絡(luò)爬蟲
第三部分 數(shù)據(jù)分析+機器學(xué)習(xí)
監(jiān)督學(xué)習(xí)(Supervised Learning)包括分類算法(Classification)和回歸算法(Regression)兩種,它們是根據(jù)類別標(biāo)簽分布的類型來定義的?;貧w算法用于連續(xù)型的數(shù)據(jù)預(yù)測,分類算法用于離散型的分布預(yù)測。
回歸(Regression)最早是英國生物統(tǒng)計學(xué)家高爾頓和他的學(xué)生皮爾遜在研究父母和子女的身高遺傳特性時提出的。1855年,他們在《遺傳的身高向平均數(shù)方向的回歸》中這樣描述“子女的身高趨向于高于父母的身高的平均值,但一般不會超過父母的身高”,首次提出來回歸的概念?,F(xiàn)在的回歸分析已經(jīng)和這種趨勢效應(yīng)沒有任何瓜葛了,它只是指源于高爾頓工作,用一個或多個自變量來預(yù)測因變量的數(shù)學(xué)方法。
圖1是一個簡單的回歸模型,X坐標(biāo)是質(zhì)量,Y坐標(biāo)是用戶滿意度,從圖中可知,產(chǎn)品的質(zhì)量越高其用戶評價越好,這可以擬合一條直線來預(yù)測新產(chǎn)品的用戶滿意度。
在回歸模型中,我們需要預(yù)測的變量叫做因變量,比如產(chǎn)品質(zhì)量;選取用來解釋因變量變化的變量叫做自變量,比如用戶滿意度?;貧w的目的就是建立一個回歸方程來預(yù)測目標(biāo)值,整個回歸的求解過程就是求這個回歸方程的回歸系數(shù)。
簡言之,回歸最簡單的定義就是:
首先,作者引用類似于斯坦福大學(xué)機器學(xué)習(xí)公開課線性回歸的例子,給大家講解線性回歸的基礎(chǔ)知識和應(yīng)用,方便大家的理解。同時,作者強烈推薦大家學(xué)習(xí)原版Andrew Ng教授的斯坦福機器學(xué)習(xí)公開課,會讓您非常受益。
假設(shè)存在表1的數(shù)據(jù)集,它是某企業(yè)的成本和利潤數(shù)據(jù)集。數(shù)據(jù)集中2002年到2016年的數(shù)據(jù)集稱為訓(xùn)練集,整個訓(xùn)練集共15個樣本數(shù)據(jù)。重點是成本和利潤兩個變量,成本是輸入變量或一個特征,利潤是輸出變量或目標(biāo)變量,整個回歸模型如圖2所示。
現(xiàn)建立模型,x表示企業(yè)成本,y表示企業(yè)利潤,h(Hypothesis)表示將輸入變量映射到輸出變量y的函數(shù),對應(yīng)一個因變量的線性回歸(單變量線性回歸)公式如下:
那么,現(xiàn)在要解決的問題是如何求解的兩個參數(shù)和。我們的構(gòu)想是選取的參數(shù)和使得函數(shù)盡可能接近y值,這里提出了求訓(xùn)練集(x,y)的平方誤差函數(shù)(Squared Error Function)或最小二乘法。
在回歸方程里,最小化誤差平方和方法是求特征對應(yīng)回歸系數(shù)的最佳方法。誤差是指預(yù)測y值和真實y值之間的差值,使用誤差的簡單累加將使得正差值和負差值相互抵消,所采用的平方誤差(最小二乘法)如下:
在數(shù)學(xué)上,求解過程就轉(zhuǎn)化為求一組值使上式取到最小值,最常見的求解方法是梯度下降法(Gradient Descent)。根據(jù)平方誤差,定義該線性回歸模型的損耗函數(shù)(Cost Function)為,公式如下:
選擇適當(dāng)?shù)膮?shù)讓其最小化min,即可實現(xiàn)擬合求解過程。通過上面的這個示例,我們就可以對線性回歸模型進行如下定義:根據(jù)樣本x和y的坐標(biāo),去預(yù)估函數(shù)h,尋求變量之間近似的函數(shù)關(guān)系。公式如下:
其中,n表示特征數(shù)目,表示每個訓(xùn)練樣本的第i個特種值,當(dāng)只有一個因變量x時,稱為一元線性回歸,類似于;而當(dāng)多個因變量時,成為多元線性回歸。我們的目的是使最小化,從而最好的將樣本數(shù)據(jù)集進行擬合,更好地預(yù)測新的數(shù)據(jù)。
線性回歸是數(shù)據(jù)挖掘中基礎(chǔ)的算法之一,其核心思想是求解一組因變量和自變量之間的方程,得到回歸函數(shù),同時誤差項通常使用最小二乘法進行計算。在本書常用的Sklaern機器學(xué)習(xí)包中將調(diào)用Linear_model子類的LinearRegression類進行線性回歸模型計算。
LinearRegression回歸模型在Sklearn.linear_model子類下,主要是調(diào)用fit(x,y)函數(shù)來訓(xùn)練模型,其中x為數(shù)據(jù)的屬性,y為所屬類型。sklearn中引用回歸模型的代碼如下:
from sklearn import linear_model #導(dǎo)入線性模型
regr = linear_model.LinearRegression() #使用線性回歸
print(regr)
輸出函數(shù)的構(gòu)造方法如下:
其中參數(shù)說明如下:
LinearRegression類主要包括如下方法:
現(xiàn)在對前面的企業(yè)成本和利潤數(shù)據(jù)集進行線性回歸實驗。完整代碼如下:
# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
from sklearn import linear_model #導(dǎo)入線性模型
import matplotlib.pyplot as plt
import numpy as np
#X表示企業(yè)成本 Y表示企業(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('數(shù)據(jù)集X: ', X)
print('數(shù)據(jù)集Y: ', Y)
#回歸訓(xùn)練
clf = linear_model.LinearRegression()
clf.fit(X, Y)
#預(yù)測結(jié)果
X2 = [[400], [750], [950]]
Y2 = clf.predict(X2)
print(Y2)
res = clf.predict(np.array([1200]).reshape(-1, 1))[0]
print('預(yù)測成本1200元的利潤:$%.1f' % res)
#繪制線性回歸圖形
plt.plot(X, Y, 'ks') #繪制訓(xùn)練數(shù)據(jù)集散點圖
plt.plot(X2, Y2, 'g-') #繪制預(yù)測數(shù)據(jù)集直線
plt.show()
調(diào)用sklearn包中的LinearRegression()回歸函數(shù),fit(X,Y)載入數(shù)據(jù)集進行訓(xùn)練,然后通過predict(X2)預(yù)測數(shù)據(jù)集X2的利潤,并將預(yù)測結(jié)果繪制成直線,(X,Y)數(shù)據(jù)集繪制成散點圖,如圖3所示。
同時調(diào)用代碼預(yù)測2017年企業(yè)成本為1200元的利潤為575.1元。注意,線性模型的回歸系數(shù)會保存在coef_變量中,截距保存在intercept_變量中。clf.score(X, Y) 是一個評分函數(shù),返回一個小于1的得分。評分過程的代碼如下:
該直線對應(yīng)的回歸函數(shù)為:y = 0.62402912 * x - 173.70433885,則X2[1]=400這個點預(yù)測的利潤值為75.9,而X1中成本為400元對應(yīng)的真實利潤是80元,預(yù)測是基本準(zhǔn)確的。
(1).糖尿病數(shù)據(jù)集
Sklearn機器學(xué)習(xí)包提供了糖尿病數(shù)據(jù)集(Diabetes Dataset),該數(shù)據(jù)集主要包括442行數(shù)據(jù),10個特征值,分別是:年齡(Age)、性別(Sex)、體質(zhì)指數(shù)(Body mass index)、平均血壓(Average Blood Pressure)、S1~S6一年后疾病級數(shù)指標(biāo)。預(yù)測指標(biāo)為Target,它表示一年后患疾病的定量指標(biāo)。原網(wǎng)址的描述如圖4所示:
下面代碼進行簡單的調(diào)用及數(shù)據(jù)規(guī)模的測試。
調(diào)用load_diabetes()函數(shù)載入糖尿病數(shù)據(jù)集,然后輸出其數(shù)據(jù)data和類標(biāo)target。輸出總行數(shù)442行,特征數(shù)共10個,類型為(442L, 10L)。其輸出如下所示:
(2).代碼實現(xiàn)
現(xiàn)在我們將糖尿病數(shù)據(jù)集劃分為訓(xùn)練集和測試集,整個數(shù)據(jù)集共442行,我們?nèi)∏?22行數(shù)據(jù)用來線性回歸模型訓(xùn)練,后20行數(shù)據(jù)用來預(yù)測。其中取預(yù)測數(shù)據(jù)的代碼為diabetes_x_temp[-20:],表示從后20行開始取值,直到數(shù)組結(jié)束,共取值20個數(shù)。
整個數(shù)據(jù)集共10個特征值,為了方便可視化畫圖我們只獲取其中一個特征進行實驗,這也可以繪制圖形,而真實分析中,通常經(jīng)過降維處理再繪制圖形。這里獲取第3個特征,對應(yīng)代碼為: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
#數(shù)據(jù)集劃分
diabetes = datasets.load_diabetes() #載入數(shù)據(jù)
diabetes_x_temp = diabetes.data[:, np.newaxis, 2] #獲取其中一個特征
diabetes_x_train = diabetes_x_temp[:-20] #訓(xùn)練樣本
diabetes_x_test = diabetes_x_temp[-20:] #測試樣本 后20行
diabetes_y_train = diabetes.target[:-20] #訓(xùn)練標(biāo)記
diabetes_y_test = diabetes.target[-20:] #預(yù)測對比標(biāo)記
#回歸訓(xùn)練及預(yù)測
clf = linear_model.LinearRegression()
clf.fit(diabetes_x_train, diabetes_y_train) #訓(xùn)練數(shù)據(jù)集
pre = clf.predict(diabetes_x_test)
#繪圖
plt.title(u'LinearRegression Diabetes') #標(biāo)題
plt.xlabel(u'Attributes') #x軸坐標(biāo)
plt.ylabel(u'Measure of disease') #y軸坐標(biāo)
plt.scatter(diabetes_x_test, diabetes_y_test, color = 'black') #散點圖
plt.plot(diabetes_x_test, pre, color='blue', linewidth = 2) #預(yù)測直線
plt.show()
輸出結(jié)果如圖5所示,每個點表示真實的值,而直線表示預(yù)測的結(jié)果。
(3).代碼優(yōu)化
下面代碼增加了幾個優(yōu)化措施,包括增加了斜率、 截距的計算,可視化繪圖增加了散點到線性方程的距離線,增加了保存圖片設(shè)置像素代碼等。這些優(yōu)化都更好地幫助我們分析真實的數(shù)據(jù)集。
# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
from sklearn import datasets
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt
#第一步 數(shù)據(jù)集劃分
d = datasets.load_diabetes() #數(shù)據(jù) 10*442
x = d.data
x_one = x[:,np.newaxis, 2] #獲取一個特征 第3列數(shù)據(jù)
y = d.target #獲取的正確結(jié)果
x_train = x_one[:-42] #訓(xùn)練集X [ 0:400]
x_test = x_one[-42:] #預(yù)測集X [401:442]
y_train = y[:-42] #訓(xùn)練集Y [ 0:400]
y_test = y[-42:] #預(yù)測集Y [401:442]
#第二步 線性回歸實現(xiàn)
clf = linear_model.LinearRegression()
print(clf)
clf.fit(x_train, y_train)
pre = clf.predict(x_test)
print('預(yù)測結(jié)果', pre)
print('真實結(jié)果', y_test)
#第三步 評價結(jié)果
cost = np.mean(y_test-pre)**2 #2次方
print('平方和計算:', cost)
print('系數(shù)', clf.coef_)
print('截距', clf.intercept_)
print('方差', clf.score(x_test, y_test))
#第四步 繪圖
plt.plot(x_test, y_test, 'k.') #散點圖
plt.plot(x_test, pre, 'g-') #預(yù)測回歸直線
#繪制點到直線距離
for idx, m in enumerate(x_test):
plt.plot([m, m],[y_test[idx], pre[idx]], 'r-')
plt.savefig('blog12-01.png', dpi=300) #保存圖片
plt.show()
繪制的圖形如圖6所示。
輸出結(jié)果如下:
其中cost = np.mean(y_test-pre)**2表示計算預(yù)測結(jié)果和真實結(jié)果之間的平方和,為83.192340827,根據(jù)系數(shù)和截距得出其方程為:y = 955.70303385 * x + 153.000183957。
線性回歸研究的是一個目標(biāo)變量和一個自變量之間的回歸問題,但有時候在很多實際問題中,影響目標(biāo)變量的自變量往往不止一個,而是多個,比如綿羊的產(chǎn)毛量這一變量同時受到綿羊體重、胸圍、體長等多個變量的影響,因此需要設(shè)計一個目標(biāo)變量與多個自變量間的回歸分析,即多元回歸分析。由于線性回歸并不適用于所有的數(shù)據(jù),我們需要建立曲線來適應(yīng)我們的數(shù)據(jù),現(xiàn)實世界中的曲線關(guān)系很多都是增加多項式實現(xiàn)的,比如一個二次函數(shù)模型:
再或者一個三次函數(shù)模型:
這兩個模型我們繪制的圖形如下所示:
多項式回歸(Polynomial Regression)是研究一個因變量與一個或多個自變量間多項式的回歸分析方法。如果自變量只有一個時,稱為一元多項式回歸;如果自變量有多個時,稱為多元多項式回歸。在一元回歸分析中,如果依變量y與自變量x的關(guān)系為非線性的,但是又找不到適當(dāng)?shù)暮瘮?shù)曲線來擬合,則可以采用一元多項式回歸。17.3小節(jié)主要講解一元多次的多項式回歸分析,一元m次多項式方程如下:
其方程的求解過程希望讀者下來自行學(xué)習(xí),接下來作者主要講解Python如何代碼實現(xiàn)多項式回歸分析的。
Python的多項式回歸需要導(dǎo)入sklearn.preprocessing子類中PolynomialFeatures類實現(xiàn)。PolynomialFeatures對應(yīng)的函數(shù)原型如下:
class sklearn.preprocessing.PolynomialFeatures(degree=2,
interaction_only=False,
include_bias=True)
PolynomialFeatures類在Sklearn官網(wǎng)給出的解釋是:專門產(chǎn)生多項式的模型或類,并且多項式包含的是相互影響的特征集。共有三個參數(shù),degree表示多項式階數(shù),一般默認值是2;interaction_only如果值是true(默認是False),則會產(chǎn)生相互影響的特征集;include_bias表示是否包含偏差列。
PolynomialFeatures類通過實例化一個多項式,建立等差數(shù)列矩陣,然后進行訓(xùn)練和預(yù)測,最后繪制相關(guān)圖形,接下來與前面的一元線性回歸分析進行對比試驗。
本小節(jié)主要講解多項式回歸分析實例,分析的數(shù)據(jù)集是表17.1提供的企業(yè)成本和利潤數(shù)據(jù)集。下面直接給出線性回歸和多項式回歸分析對比的完整代碼和詳細注釋。
# -*- 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è)成本 Y表示企業(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('數(shù)據(jù)集X: ', X)
print('數(shù)據(jù)集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('預(yù)測成本1200元的利潤:$%.1f' % res)
plt.plot(X, Y, 'ks') #繪制訓(xùn)練數(shù)據(jù)集散點圖
plt.plot(X2, Y2, 'g-') #繪制預(yù)測數(shù)據(jù)集直線
#第二步 多項式回歸分析
xx = np.linspace(350,950,100) #350到950等差數(shù)列
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ùn)練好X值的多項式特征實例應(yīng)用到一系列點上,形成矩陣
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()
輸出圖形如下圖所示,其中黑色散點圖表示真實的企業(yè)成本和利潤的關(guān)系,綠色直線為一元線性回歸方程,紅色虛曲線為二次多項式方程。它更接近真實的散點圖。
這里我們使用R方(R-Squared)來評估多項式回歸預(yù)測的效果,R方也叫確定系數(shù)(Coefficient of Determination),它表示模型對現(xiàn)實數(shù)據(jù)擬合的程度。計算R方的方法有幾種,一元線性回歸中R方等于皮爾遜積矩相關(guān)系數(shù)(Pearson Product Moment Correlation Coefficient)的平方,該方法計算的R方是一定介于0~1之間的正數(shù)。另一種是Sklearn庫提供的方法來計算R方。R方計算代碼如下:
輸出如下所示:
一元線性回歸的R方值為0.9118,多項式回歸的R方值為0.9407,說明數(shù)據(jù)集中超過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è)成本 Y表示企業(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('數(shù)據(jù)集X: ', X)
print('數(shù)據(jù)集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('預(yù)測成本1200元的利潤:$%.1f' % res)
plt.plot(X, Y, 'ks') #繪制訓(xùn)練數(shù)據(jù)集散點圖
plt.plot(X2, Y2, 'g-') #繪制預(yù)測數(shù)據(jù)集直線
#第二步 多項式回歸分析
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ùn)練好X值的多項式特征實例應(yīng)用到一系列點上,形成矩陣
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)
輸出如下所示,其中紅色虛線為五次多項式曲線,它更加接近真實數(shù)據(jù)集的分布情況,而綠色直線為一元線性回歸方程,顯然相較于五次多項式曲線,線性方程擬合的結(jié)果更差。同時,五次多項式曲線的R方值為98.08%,非常準(zhǔn)確的預(yù)測了數(shù)據(jù)趨勢。
最后補充一點,建議多項式回歸的階數(shù)不要太高,否則會出現(xiàn)過擬合現(xiàn)象。
在前面講述的回歸模型中,處理的因變量都是數(shù)值型區(qū)間變量,建立的模型描述是因變量的期望與自變量之間的線性關(guān)系或多項式曲線關(guān)系。比如常見的線性回歸模型:
而在采用回歸模型分析實際問題中,所研究的變量往往不全是區(qū)間變量而是順序變量或?qū)傩宰兞?,比如二項分布問題。通過分析年齡、性別、體質(zhì)指數(shù)、平均血壓、疾病指數(shù)等指標(biāo),判斷一個人是否換糖尿病,Y=0表示未患病,Y=1表示患病,這里的響應(yīng)變量是一個兩點(0或1)分布變量,它就不能用h函數(shù)連續(xù)的值來預(yù)測因變量Y(Y只能取0或1)。
總之,線性回歸或多項式回歸模型通常是處理因變量為連續(xù)變量的問題,如果因變量是定性變量,線性回歸模型就不再適用了,此時需采用邏輯回歸模型解決。
邏輯回歸(Logistic Regression)是用于處理因變量為分類變量的回歸問題,常見的是二分類或二項分布問題,也可以處理多分類問題,它實際上是屬于一種分類方法。
二分類問題的概率與自變量之間的關(guān)系圖形往往是一個S型曲線,如圖17.10所示,采用的Sigmoid函數(shù)實現(xiàn)。這里我們將該函數(shù)定義如下:
函數(shù)的定義域為全體實數(shù),值域在[0,1]之間,x軸在0點對應(yīng)的結(jié)果為0.5。當(dāng)x取值足夠大的時候,可以看成0或1兩類問題,大于0.5可以認為是1類問題,反之是0類問題,而剛好是0.5,則可以劃分至0類或1類。對于0-1型變量,y=1的概率分布公式定義如下:
y=0的概率分布公式定義如下:
其離散型隨機變量期望值公式如下:
采用線性模型進行分析,其公式變換如下:
而實際應(yīng)用中,概率p與因變量往往是非線性的,為了解決該類問題,我們引入了logit變換,使得logit§與自變量之間存在線性相關(guān)的關(guān)系,邏輯回歸模型定義如下:
通過推導(dǎo),概率p變換如下,這與Sigmoid函數(shù)相符,也體現(xiàn)了概率p與因變量之間的非線性關(guān)系。以0.5為界限,預(yù)測p大于0.5時,我們判斷此時y更可能為1,否則y為0。
得到所需的Sigmoid函數(shù)后,接下來只需要和前面的線性回歸一樣,擬合出該式中n個參數(shù)θ即可。下列為繪制Sigmoid曲線,輸出如圖10所示。
# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
import matplotlib.pyplot as plt
import numpy as np
def Sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
x= np.arange(-10, 10, 0.1)
h = Sigmoid(x) #Sigmoid函數(shù)
plt.plot(x, h)
plt.axvline(0.0, color='k') #坐標(biāo)軸上加一條豎直的線(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軸標(biāo)度
plt.ylim(-0.1, 1.1) #y軸范圍
plt.show()
由于篇幅有限,邏輯回歸構(gòu)造損失函數(shù)J函數(shù),求解最小J函數(shù)及回歸參數(shù)θ的方法就不在敘述,原理和前面介紹的一樣,請讀者下去深入研究。
LogisticRegression回歸模型在Sklearn.linear_model子類下,調(diào)用sklearn邏輯回歸算法步驟比較簡單,即:
代碼如下:
# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
from sklearn.linear_model import LogisticRegression #導(dǎo)入邏輯回歸模型
clf = LogisticRegression()
print(clf)
clf.fit(train_feature,label)
predict['label'] = clf.predict(predict_feature)
輸出函數(shù)的構(gòu)造方法如下:
這里僅介紹兩個參數(shù):參數(shù)penalty表示懲罰項,包括兩個可選值L1和L2。L1表示向量中各元素絕對值的和,常用于特征選擇;L2表示向量中各個元素平方之和再開根號,當(dāng)需要選擇較多的特征時,使用L2參數(shù),使他們都趨近于0。C值的目標(biāo)函數(shù)約束條件為:s.t.||w||1<C,默認值是0,C值越小,則正則化強度越大。
下面將結(jié)合Scikit-learn官網(wǎng)的邏輯回歸模型分析鳶尾花數(shù)據(jù)集。由于該數(shù)據(jù)分類標(biāo)簽劃分為3類(0類、1類、2類),屬于三分類問題,所以能利用邏輯回歸模型對其進行分析。
(1).鳶尾花數(shù)據(jù)集
在Sklearn機器學(xué)習(xí)包中,集成了各種各樣的數(shù)據(jù)集,包括前面的糖尿病數(shù)據(jù)集,這里引入的是鳶尾花卉(Iris)數(shù)據(jù)集,它也是一個很常用的數(shù)據(jù)集。該數(shù)據(jù)集一共包含4個特征變量,1個類別變量,共有150個樣本。其中四個特征分別是萼片的長度和寬度、花瓣的長度和寬度,一個類別變量是標(biāo)記鳶尾花所屬的分類情況,該值包含三種情況,即山鳶尾(Iris-setosa)、變色鳶尾(Iris-versicolor)和維吉尼亞鳶尾(Iris-virginica)。鳶尾花數(shù)據(jù)集詳細介紹如表2所示:
Class 類別變量。0表示山鳶尾,1表示變色鳶尾,2表示維吉尼亞鳶尾。 int iris里有兩個屬性iris.data,iris.target。data是一個矩陣,每一列代表了萼片或花瓣的長寬,一共4列,每一行代表一個被測量的鳶尾植物,一共采樣了150條記錄,即150朵鳶尾花樣本。
from sklearn.datasets import load_iris #導(dǎo)入數(shù)據(jù)集iris
iris = load_iris() #載入數(shù)據(jù)集
print(iris.data)
輸出如下所示:
target是一個數(shù)組,存儲了每行數(shù)據(jù)對應(yīng)的樣本屬于哪一類鳶尾植物,要么是山鳶尾(值為0),要么是變色鳶尾(值為1),要么是維吉尼亞鳶尾(值為2),數(shù)組的長度是150。
從輸出結(jié)果可以看到,類標(biāo)共分為三類,前面50個類標(biāo)位0,中間50個類標(biāo)位1,后面為2。下面給詳細介紹使用邏輯回歸對這個數(shù)據(jù)集進行分析的代碼。
(2).散點圖繪制
在載入了鳶尾花數(shù)據(jù)集(數(shù)據(jù)data和標(biāo)簽target)之后,我們需要獲取其中兩列數(shù)據(jù)或兩個特征,再調(diào)用scatter()函數(shù)繪制散點圖。其中獲取一個特征的核心代碼為:X = [x[0] for x in DD],將獲取的值賦值給X變量。完整代碼如下:
# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris #導(dǎo)入數(shù)據(jù)集iris
#載入數(shù)據(jù)集
iris = load_iris()
print(iris.data) #輸出數(shù)據(jù)集
print(iris.target) #輸出真實標(biāo)簽
#獲取花卉兩列數(shù)據(jù)集
DD = iris.data
X = [x[0] for x in DD]
print(X)
Y = [x[1] for x in DD]
print(Y)
#plt.scatter(X, Y, c=iris.target, marker='x')
plt.scatter(X[:50], Y[:50], color='red', marker='o', label='setosa') #前50個樣本
plt.scatter(X[50:100], Y[50:100], color='blue', marker='x', label='versicolor') #中間50個
plt.scatter(X[100:], Y[100:],color='green', marker='+', label='Virginica') #后50個樣本
plt.legend(loc=2) #左上角
plt.show()
輸出如圖11所示:
(3).線性回歸分析
下述代碼先獲取鳶尾花數(shù)據(jù)集的前兩列數(shù)據(jù),再調(diào)用Sklearn庫中線性回歸模型進行分析,完整代碼如文件所示。
# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-07-03
#第一步 導(dǎo)入數(shù)據(jù)集
from sklearn.datasets import load_iris
hua = load_iris()
#獲取花瓣的長和寬
x = [n[0] for n in hua.data]
y = [n[1] for n in hua.data]
import numpy as np #轉(zhuǎn)換成數(shù)組
x = np.array(x).reshape(len(x),1)
y = np.array(y).reshape(len(y),1)
#第二步 線性回歸分析
from sklearn.linear_model import LinearRegression
clf = LinearRegression()
clf.fit(x,y)
pre = clf.predict(x)
print(pre)
#第三步 畫圖
import matplotlib.pyplot as plt
plt.scatter(x,y,s=100)
plt.plot(x,pre,'r-',linewidth=4)
for idx, m in enumerate(x):
plt.plot([m,m],[y[idx],pre[idx]], 'g-')
plt.show()
輸出圖形如圖12所示,并且可以看到所有散點到擬合的一元一次方程的距離。
(4).邏輯回歸分析鳶尾花
講解完線性回歸分析之后,那如果用邏輯回歸分析的結(jié)果究竟如何呢?下面開始講述。從散點圖(圖11)中可以看出,數(shù)據(jù)集是線性可分的,劃分為3類,分別對應(yīng)三種類型的鳶尾花,下面采用邏輯回歸對其進行分析預(yù)測。
前面使用X=[x[0] for x in DD]獲取第一列數(shù)據(jù),Y=[x[1] for x in DD]獲取第二列數(shù)據(jù),這里采用另一種方法,iris.data[:, :2]獲取其中兩列數(shù)據(jù)或兩個特征,完整代碼如下:
# -*- 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
#載入數(shù)據(jù)集
iris = load_iris()
X = X = iris.data[:, :2] #獲取花卉兩列數(shù)據(jù)集
Y = iris.target
#邏輯回歸模型
lr = LogisticRegression(C=1e5)
lr.fit(X,Y)
#meshgrid函數(shù)生成兩個網(wǎng)格矩陣
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函數(shù)將xx,yy兩個網(wǎng)格矩陣和對應(yīng)的預(yù)測結(jié)果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所示。經(jīng)過邏輯回歸后劃分為三個區(qū)域,左上角部分為紅色的圓點,對應(yīng)setosa鳶尾花;右上角部分為綠色方塊,對應(yīng)virginica鳶尾花;中間下部分為藍色星形,對應(yīng)versicolor鳶尾花。散點圖為各數(shù)據(jù)點真實的花類型,劃分的三個區(qū)域為數(shù)據(jù)點預(yù)測的花類型,預(yù)測的分類結(jié)果與訓(xùn)練數(shù)據(jù)的真實結(jié)果結(jié)果基本一致,部分鳶尾花出現(xiàn)交叉。
下面作者對導(dǎo)入數(shù)據(jù)集后的代碼進行詳細講解。
總之,上述操作是把第一列花萼長度數(shù)據(jù)按h取等分作為行,并復(fù)制多行得到xx網(wǎng)格矩陣;再把第二列花萼寬度數(shù)據(jù)按h取等分作為列,并復(fù)制多列得到y(tǒng)y網(wǎng)格矩陣;最后將xx和yy矩陣都變成兩個一維數(shù)組,再調(diào)用np.c_[]函數(shù)將其組合成一個二維數(shù)組進行預(yù)測。
回歸分析是通過建立一個回歸方程用來預(yù)測目標(biāo)值,并求解這個回歸方程的回歸系數(shù)的方法。它是統(tǒng)計學(xué)中最重要的工具之一,包括線性回歸、多項式回歸、邏輯回歸、非線性回歸等。常用來確定變量之間是否存在相關(guān)關(guān)系,并找出數(shù)學(xué)表達式,也可以通過控制幾個變量的值來預(yù)測另一個變量的值,比如房價預(yù)測、增長趨勢、是否患病等問題。
在Python中,我們通過調(diào)用Sklearn機器學(xué)習(xí)庫的LinearRegression模型實現(xiàn)線性回歸分析,調(diào)用PolynomialFeatures模型實現(xiàn)多項式回歸分析,調(diào)用LogisticRegression模型實現(xiàn)邏輯回歸分析。希望讀者實現(xiàn)本章節(jié)中的每一部分代碼,從而更好的用于自己的研究領(lǐng)域、解決自己遇到的問題。
該系列所有代碼下載地址:
感恩能與大家在華為云遇見!
希望能與大家一起在華為云社區(qū)共同成長,原文地址:https://blog.csdn.net/Eastmount/article/details/118435877
【百變AI秀】有獎?wù)魑幕馃徇M行中:https://bbs.huaweicloud.com/blogs/29670
(By:娜璋之家 Eastmount 2021-08-24 夜于貴陽)
參考文獻:
聯(lián)系客服