一. 邏輯回歸
在前面講述的回歸模型中,處理的因變量都是數值型區間變量,建立的模型描述是因變量的期望與自變量之間的線性關系。比如常見的線性回歸模型:
而在采用回歸模型分析實際問題中,所研究的變量往往不全是區間變量而是順序變量或屬性變量,比如二項分布問題。通過分析年齡、性別、體質指數、平均血壓、疾病指數等指標,判斷一個人是否換糖尿病,Y=0表示未患病,Y=1表示患病,這里的響應變量是一個兩點(0-1)分布變量,它就不能用h函數連續的值來預測因變量Y(只能取0或1)。
總之,線性回歸模型通常是處理因變量是連續變量的問題,如果因變量是定性變量,線性回歸模型就不再適用了,需采用邏輯回歸模型解決。
邏輯回歸(Logistic Regression)是用於處理因變量為分類變量的回歸問題,常見的是二分類或二項分布問題,也可以處理多分類問題,它實際上是屬於一種分類方法。
二分類問題的概率與自變量之間的關系圖形往往是一個S型曲線,如圖所示,采用的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)與自變量之
間存在線性相關的關系,邏輯回歸模型定義如下:
通過推導,概率p變換如下,這與Sigmoid函數相符,也體現了概率p與因變量之間的非線性關系。以0.5為界限,預測p大於0.5時,我們判斷此時y更可能為1,否則y為0。
得到所需的Sigmoid函數后,接下來只需要和前面的線性回歸一樣,擬合出該式中n個參數θ即可。test17_05.py為繪制Sigmoid曲線,輸出上圖所示。
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函數
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函數及回歸參數θ的方法就不在敘述,原理和前面小節一樣,請讀者下去深入研究。
二. LogisticRegression回歸算法
LogisticRegression回歸模型在Sklearn.linear_model子類下,調用sklearn邏輯回歸算法步驟比較簡單,即:
(1) 導入模型。調用邏輯回歸LogisticRegression()函數。
(2) fit()訓練。調用fit(x,y)的方法來訓練模型,其中x為數據的屬性,y為所屬類型。
(3) predict()預測。利用訓練得到的模型對數據集進行預測,返回預測結果。
代碼如下:
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向量中各元素絕對值的和,作用是產生少量的特征,而其他特征都是0,常用於特征選擇;L2向量中各個元素平方之和再開根號,作用是選擇較多的特征,使他們都趨近於0。); C值的目標函數約束條件:s.t.||w||1<C,默認值是0,C值越小,則正則化強度越大。
三. 分析鳶尾花數據集
下面將結合Scikit-learn官網的邏輯回歸模型分析鳶尾花示例,給大家進行詳細講解及拓展。由於該數據集分類標簽划分為3類(0類、1類、2類),很好的適用於邏輯回歸模型。
1. 鳶尾花數據集
在Sklearn機器學習包中,集成了各種各樣的數據集,包括前面的糖尿病數據集,這里引入的是鳶尾花卉(Iris)數據集,它是很常用的一個數據集。鳶尾花有三個亞屬,分別是山鳶尾(Iris-setosa)、變色鳶尾(Iris-versicolor)和維吉尼亞鳶尾(Iris-virginica)。
該數據集一共包含4個特征變量,1個類別變量。共有150個樣本,iris是鳶尾植物,這里存儲了其萼片和花瓣的長寬,共4個屬性,鳶尾植物分三類。如表17.2所示:
iris里有兩個屬性iris.data,iris.target。data是一個矩陣,每一列代表了萼片或花瓣的長寬,一共4列,每一列代表某個被測量的鳶尾植物,一共采樣了150條記錄。
from sklearn.datasets import load_iris #導入數據集iris
iris = load_iris() #載入數據集
print iris.data
輸出如下所示:
[[ 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是一個數組,存儲了data中每條記錄屬於哪一類鳶尾植物,所以數組的長度是150,數組元素的值因為共有3類鳶尾植物,所以不同值只有3個。種類為山鳶尾、雜色鳶尾、維吉尼亞鳶尾。
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 0
0 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 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 1 1 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 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
150
(150L, 4L)
從輸出結果可以看到,類標共分為三類,前面50個類標位0,中間50個類標位1,后面為2。下面給詳細介紹使用決策樹進行對這個數據集進行測試的代碼。
2. 散點圖繪制
下列代碼主要是載入鳶尾花數據集,包括數據data和標簽target,然后獲取其中兩列數據或兩個特征,核心代碼為:X = [x[0] for x in DD],獲取的值賦值給X變量,最后調用scatter()函數繪制散點圖。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris #導入數據集iris
#載入數據集
iris = load_iris()
print iris.data #輸出數據集
print iris.target #輸出真實標簽
#獲取花卉兩列數據集
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()
繪制散點圖如圖所示:
3. 邏輯回歸分析
從圖中可以看出,數據集線性可分的,可以划分為3類,分別對應三種類型的鳶尾花,下面采用邏輯回歸對其進行分類預測。前面使用X=[x[0] for x in DD]獲取第一列數據,Y=[x[1] for x in DD]獲取第二列數據,這里采用另一種方法,iris.data[:, :2]獲取其中兩列數據(兩個特征),完整代碼如下:
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()
下面作者對導入數據集后的代碼進行詳細講解。
lr = LogisticRegression(C=1e5)
lr.fit(X,Y)
初始化邏輯回歸模型並進行訓練,C=1e5表示目標函數。
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,如下所示:
[[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]
[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]
...,
[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]
[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]]
[[ 1.5 1.5 1.5 ..., 1.5 1.5 1.5 ]
[ 1.52 1.52 1.52 ..., 1.52 1.52 1.52]
...,
[ 4.88 4.88 4.88 ..., 4.88 4.88 4.88]
[ 4.9 4.9 4.9 ..., 4.9 4.9 4.9 ]]
Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])
調用ravel()函數將xx和yy的兩個矩陣轉變成一維數組,由於兩個矩陣大小相等,因此兩個一維數組大小也相等。np.c_[xx.ravel(), yy.ravel()]是獲取矩陣,即:
xx.ravel()
[ 3.8 3.82 3.84 ..., 8.36 8.38 8.4 ]
yy.ravel()
[ 1.5 1.5 1.5 ..., 4.9 4.9 4.9]
np.c_[xx.ravel(), yy.ravel()]
[[ 3.8 1.5 ]
[ 3.82 1.5 ]
[ 3.84 1.5 ]
...,
[ 8.36 4.9 ]
[ 8.38 4.9 ]
[ 8.4 4.9 ]]
總結下:上述操作是把第一列花萼長度數據按h取等分作為行,並復制多行得到xx網格矩陣;再把第二列花萼寬度數據按h取等分,作為列,並復制多列得到yy網格矩陣;最后將xx和yy矩陣都變成兩個一維數組,調用np.c_[]函數組合成一個二維數組進行預測。
調用predict()函數進行預測,預測結果賦值給Z。即:
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])
[1 1 1 ..., 2 2 2]
size: 39501
Z = Z.reshape(xx.shape)
調用reshape()函數修改形狀,將其Z轉換為兩個特征(長度和寬度),則39501個數據轉換為171*231的矩陣。Z = Z.reshape(xx.shape)輸出如下:
[[1 1 1 ..., 2 2 2]
[1 1 1 ..., 2 2 2]
[0 1 1 ..., 2 2 2]
...,
[0 0 0 ..., 2 2 2]
[0 0 0 ..., 2 2 2]
[0 0 0 ..., 2 2 2]]
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。
輸出如下圖所示,經過邏輯回歸后划分為三個區域,左上角部分為紅色的圓點,對應setosa鳶尾花;右上角部分為綠色方塊,對應virginica鳶尾花;中間下部分為藍色星形,對應versicolor鳶尾花。散點圖為各數據點真實的花類型,划分的三個區域為數據點預測的花類型,預測的分類結果與訓練數據的真實結果結果基本一致,部分鳶尾花出現交叉。
回歸算法作為統計學中最重要的工具之一,它通過建立一個回歸方程用來預測目標值,並求解這個回歸方程的回歸系數。本篇文章詳細講解了邏輯回歸模型的原理知識,結合Sklearn機器學習庫的LogisticRegression算法分析了鳶尾花分類情況。
————————————————
https://blog.csdn.net/Eastmount/article/details/77920470?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase 邏輯回歸LogisticRegression分析鳶尾花數據
https://blog.csdn.net/c369624808/article/details/78474104?utm_medium=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase 機器學習之路——logistic回歸python實現
https://blog.csdn.net/Trisyp/article/details/89318333?utm_medium=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase Python實現邏輯回歸(LogisticRegression)完整過程
https://blog.csdn.net/google19890102/article/details/26074827?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase 簡單易學的機器學習算法——線性回歸(1)
https://blog.csdn.net/hohaizx/article/details/81013985?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2 訓練集、測試集、驗證集與模型選擇
https://blog.csdn.net/u014248127/article/details/78875013 機器學習模型訓練測試完整步驟
https://www.cbedai.net/ 人工智能網校