標籤:

邏輯回歸分類

邏輯回歸分類

1.什麼是邏輯回歸

邏輯回歸分本質不是回歸演算法,而是分類演算法。邏輯回歸本質上是運用二分分類的演算法,即標籤只有兩個。例如對於一首歌,我們喜歡或者不喜歡;一次考試,結果是通過或者不通過;一場比賽,結果實晉級或者淘汰。

2.分類與回歸的區別

分類和回歸有三點不同:

1)分類輸出的是離散數據,e.g. 考試結果通過或者不通過;回歸輸出的是連續數據,例如考試分數。

線性回歸的表達式是y=ax+b,如下圖所示,邏輯回歸的表達式是y=S(z),函數S是Sigmoid函數,參數z=ax+b是回歸函數。

2)分類得到的是決策面,決策面是不同類別數據分割的邊界,邊界兩邊是不同類別的數據;回歸演算法得到的是最佳擬合線。

3)用正確率最為指標監督分類,即正確數據在總數據中的比例;在回歸中用決定係數R平方評估模型。

3. 邏輯回歸實例

本案例是根據訓練數據建立邏輯回歸模型,以判斷考試是否通過。案例也會利用測試數據對模型進行檢驗,判斷模型的效果。

首先導入包和創立數據集

from collections import OrderedDict

import pandas as pd

examDict={

學習時間:[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50,

2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],

通過考試:[0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]

}

examOrderDict=OrderedDict(examDict)

examDf=pd.DataFrame(examOrderDict)

以學習時間為特徵,是否通過考試為標籤。

#特徵features

exam_X=examDf.loc[:,學習時間]

#標籤labes

exam_y=examDf.loc[:,通過考試]

繪製散點圖,觀察兩個變數分布情況。

import matplotlib.pyplot as plt

#散點圖

plt.scatter(exam_X, exam_y, color="c", label="exam data")

#添加圖標標籤

plt.xlabel("Hours")

plt.ylabel("Pass")

#顯示圖像

plt.show()

建立訓練數據集和測試數據集

from sklearn.cross_validation import train_test_split

#建立訓練數據和測試數據

X_train , X_test , y_train , y_test = train_test_split(exam_X ,

exam_y ,

train_size = .8)

#輸出數據大小

print(原始數據特徵:,exam_X.shape ,

,訓練數據特徵:, X_train.shape ,

,測試數據特徵:,X_test.shape )

print(原始數據標籤:,exam_y.shape ,

訓練數據標籤:, y_train.shape ,

測試數據標籤: ,y_test.shape)

原始數據特徵: (20,) ,訓練數據特徵: (16,) ,測試數據特徵: (4,)

原始數據標籤: (20,) 訓練數據標籤: (16,) 測試數據標籤: (4,)

訓練模型,先使用reshape將數據變為n行1列。

#將訓練數據特徵轉換成二維數組XX行*1列

X_train=X_train.values.reshape(-1,1)

#將測試數據特徵轉換成二維數組行數*1列

X_test=X_test.values.reshape(-1,1)

#導入邏輯回歸

from sklearn.linear_model import LogisticRegression

#創建模型:邏輯回歸

model = LogisticRegression()

#訓練模型

model.fit(X_train , y_train)

模型評估

model.score(X_test , y_test)

輸出

0.25

測試數據的值

X_test

輸出

array([[5. ],

[3. ],

[3.5],

[2. ]])

y_test

輸出

18 1

11 0

13 0

7 0

Name: 通過考試, dtype: int64

模型準確率僅為0.25.原因在於數據量太小。因此需要增大數據量,這樣才能提高模型準確率。正如大數定律所說的:

統計的數據足夠大,那麼事物出現的頻率就會無限接近它的期望。

進一步理解邏輯函數

model.predict_proba(3)

輸出

array([[0.25736965, 0.74263035]])

array中第1個值是標籤為0的概率值,第2個值是標籤為1的概率值,這兩個值的和是1.

預測數據

pred=model.predict([[3]])

print(pred)

輸出

[1]

用predict方法得到的分類結果是1,而測試數據中3對應的標籤值是0,因此這個預測結果是錯誤的。

邏輯函數中的Z是回歸方程,用intercept和coef得到截距和回歸係數,再代入Sigmoid函數中得到概率值。

#第1步:得到回歸方程的z值

#回歸方程:z=??+??x

#截距

a=model.intercept_

#回歸係數

b=model.coef_

x=3.5

z=a+b*x

#第2步:將z值帶入邏輯回歸函數中,得到概率值

y_pred=1/(1+np.exp(-z))

print(預測的概率值:,y_pred)

輸出

預測的概率值: [[0.74263035]]


推薦閱讀:

初探機器學習之邏輯回歸
邏輯回歸初體驗
python與機器學習入門(6)邏輯回歸
廣告CTR預估中預測點擊率的校準

TAG:邏輯回歸 |