初探「邏輯回歸」

初探「邏輯回歸」

知識鋪墊:

1>邏輯回歸分類問題:

邏輯回歸分類是用於處理分類問題的一種模型。

生活中許多事物都有兩種結果,對於這種結果的預測就是邏輯回歸分類。我們一般用0和1來把這些結果分為兩類,邏輯回歸就是通過一些特徵來預測其標籤是0還是1,評估模型演算法使用正確率來分類結果的準確性。正確率可以使用測試數據集得到,將預測結果的標籤與測試數據集中的標籤進行比較。

2>決策面

機器學習模型對於分類問題,可以定義一個決策面,有了決策面,就可以針對數據進行分類。

3>邏輯回歸

在線性回歸模型中,輸出一般是連續的,例如

y=f(x)=ax+b

對於每一個輸入的x,都有一個對應的y輸出。x和y都是連續型數據。但是對於邏輯回歸,輸入可以是連續的,但輸出一般是離散的,即只有有限多個輸出值。例如,其值域可以只有兩個值{0, 1},這兩個值可以表示對樣本的某種分類,高/低、患病/健康、陰性/陽性等,這就是最常見的二分類邏輯回歸。

3>邏輯回歸與線性回歸的關係

邏輯回歸與線性回歸模型的形式基本上相同,都具有 ax+b,其中a和b是待求參數,其區別在於他們的因變數不同,線性回歸直接將ax+b作為因變數,即y = ax+b,而logistic回歸則通過函數S將ax+b對應到一個隱狀態p,p= S(ax+b),然後根據p與1-p的大小決定因變數的值。這裡的函數S就是Sigmoid函數。

邏輯回歸其實是在線性回歸的基礎上套用了一個邏輯函數。

邏輯函數圖

通過函數S的作用,我們可以將輸出的值限制在區間[0, 1]上,p(x)則可以用來表示概率p(y=1|x),即當一個x發生時,y被分到1那一組的概率。可是我們上面說y只有兩種取值,但是這裡卻出現了一個區間[0, 1],這是為什麼呢?其實在真實情況下,我們最終得到的y的值是在[0, 1]這個區間上的一個數,然後我們可以選擇一個閾值,通常是0.5,當y>0.5時,就將這個x歸到1這一類,如果y<0.5就將x歸到0這一類。但是閾值是可以調整的,比如說一個比較保守的人,可能將閾值設為0.9,也就是說有超過90%的把握,才相信這個x屬於1這一類。

邏輯回歸分類的項目演練

1、建立數據集

from collections import OrderedDictimport pandas as pd# 創建數據集,記錄每個學生學習時間與考試結果# 為讓數據集有序,使用OrderedDictexamDict={ 學習時間:[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)# 預覽數據examDf.head()

預覽數據

2.提取特徵和標籤

(約定成俗的命名習慣:X是特徵,y是標籤)

# 提取特徵featuresexam_X=examDf.loc[:,學習時間]# 提取標籤labesexam_y=examDf.loc[:,通過考試]

3.建立訓練數據和測試數據

方便後續對模型進行訓練和測試評估

其中train_test_split是交叉驗證中常用的函數,用來從樣本中按比例隨機抽取訓練數據(train)和測試數據(test),

第一個參數:所要劃分的樣本特徵

第二個參數:所要劃分的樣本標籤

train_size:訓練數據佔比,如果是整數的話就是樣本的數量

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)

畫個圖看看

# 繪製散點圖import matplotlib.pyplot as plt# 散點圖plt.scatter(X_train, y_train, color="blue", label="train data")plt.scatter(X_test, y_test, color="red", label="test data")# 添加圖標標籤plt.legend(loc=2)plt.xlabel("Hours")plt.ylabel("Pass")# 顯示圖像plt.show()

散點圖

4.訓練模型

使用訓練數據對模型進行訓練。

同樣的,這裡直接導入訓練數據的話會報錯,因為我們使用是sklearn包要求輸入的特徵為二維數組的類型,但是我們輸入的訓練數據只有一個特徵,所以這裡要先對數據進行reshape。

# 將訓練數據特徵轉換成二維數組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)

5.評估模型(score)

# 評估模型:準確率model.score(X_test , y_test)

因為本案例中主要是學習邏輯回歸的過程,而樣本數據量較少,只有20個,所以準確率可能並不高。

6.進一步了解邏輯函數

使用predict_proba可以返回兩個結果的概率。

# 獲取概率值,輸入一個特徵值,返回標籤值的概率# 第1個值是標籤為0的概率值,第2個值是標籤為1的概率值model.predict_proba(3)

返回的標籤概率值

使用predict函數,會返回標籤結果

# 預測數據:使用模型的predict方法可以進行預測。這裡我們輸入學生的特徵學習時間3小時,模型返回結果標籤是1,就代表預測該學生未通過考試。pred=model.predict([[3]])print(pred)

返回的標籤結果

理解邏輯回歸函數

斜率slope

截距intercept

# 第1步:得到回歸方程的z值# 回歸方程:z=??+??x# 截距a=model.intercept_# 回歸係數b=model.coef_x=3z=a+b*x# 第2步:將z值帶入邏輯回歸函數中,得到概率值y_pred=1/(1+np.exp(-z))print(預測的概率值:,y_pred)


好了,理解了這些,就算入坑了,接下來繼續學習吧!


推薦閱讀:

有關機器學習Malware分類器的那些事
[機器學習入門] 李宏毅機器學習筆記-2 (Regression:Case Study ;回歸:案例研究)
BP神經網路:最快速的理解(一)
Valse2018參會小結——生成對抗網路系列1
邏輯回歸之損失函數與最大似然估計

TAG:機器學習 | Python | 數據分析 |