邏輯迴歸

邏輯迴歸是一種分類算法,雖然名字中帶有迴歸。但是它與迴歸之間有一定的聯繫。

邏輯迴歸的原理:

輸入

邏輯迴歸的輸入就是一個線性迴歸的結果


sigmoid函數(激活函數)

迴歸的結果輸入到sigmoid函數當中
輸出結果:[0, 1]區間中的一個概率值,默認爲0.5爲閾值
邏輯迴歸最終的分類是通過屬於某個類別的概率值來判斷是否屬於某個類別,並且這個類別默認標記爲1(正例),另外的一個類別會標記爲0(反例)。(方便損失計算)

假設有兩個類別A,B,並且假設我們的概率值爲屬於A(1)這個類別的概率值。現在有一個樣本的輸入到邏輯迴歸輸出結果0.6,那麼這個概率值超過0.5,意味着我們訓練或者預測的結果就是A(1)類別。那麼反之,如果得出結果爲0.3那麼,訓練或者預測結果就爲B(0)類別。

 

衡量邏輯迴歸的預測結果與真實結果的差異衡量邏輯迴歸的預測結果與真實結果的差異

損失,稱之爲對數似然損失,公式如下:

當y=1時:

完整損失函數: 

使用梯度下降優化算法,可以減少損失函數的值。更新邏輯迴歸前面對應算法的權重參數,提升原本屬於1類別的概率,降低原本是0類別的概率。

 

邏輯迴歸在sklearn中的API
sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
solver:優化求解方式(默認開源的liblinear庫實現,內部使用了座標軸下降法來迭代優化損失函數)
sag:根據數據集自動選擇,隨機平均梯度下降
penalty:正則化的種類
C:正則化力度
默認將類別數量少的當做正例

 

示例:癌症分類預測

數據集來源:breast-cancer-wisconsin :

數據描述:
699條樣本,共11列數據,第一列用於檢索的id,後9列分別是與腫瘤相關的醫學特徵,最後一列表示腫瘤類型的數值;包含16個缺失值,用”?”標出

完整代碼實現:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression


def logisticregression():
    """
    邏輯迴歸進行癌症預測
    :return: None
    """
    # 1、讀取數據,處理缺失值以及標準化
    column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
                   'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
                   'Normal Nucleoli', 'Mitoses', 'Class']

    data = pd.read_csv(
        "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
        names=column_name
    )

    # 刪除缺失值
    data = data.replace(to_replace='?', value=np.nan)
    data = data.dropna()

    # 取出特徵值
    x = data[column_name[1:10]]
    y = data[column_name[10]]

    # 分割數據集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # 進行標準化
    std = StandardScaler()
    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # 使用邏輯迴歸
    lr = LogisticRegression()
    lr.fit(x_train, y_train)

    print("得出來的權重:", lr.coef_)

    # 預測類別
    print("預測的類別:", lr.predict(x_test))

    # 得出準確率
    print("預測的準確率:", lr.score(x_test, y_test))
    return None


logisticregression()

 

預測結果:

 

分類評估報告
sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
y_true:真實目標值
y_pred:估計器預測目標值
labels:指定類別對應的數字
target_names:目標類別名稱
return:每個類別精確率與召回率

print("精確率和召回率爲:", classification_report(y_test, lr.predict(x_test), labels=[2, 4], target_names=['良性', '惡性']))

評估報告結果:

 

 

 

 

衡量樣本不均衡下的評估---AUC指標

AUC的概率意義是隨機取一對正負樣本,正樣本得分大於負樣本的概率
AUC的最小值爲0.5,最大值爲1,取值越高越好
AUC=1,完美分類器,採用這個預測模型時,不管設定什麼閾值都能得出完美預測。絕大多數預測的場合,不存在完美分類器。
0.5<AUC<1,優於隨機猜測。這個分類器(模型)妥善設定閾值的話,能有預測價值。
AUC=0.5,跟隨機猜測一樣(例:丟銅板),模型沒有預測價值。
AUC<0.5,比隨機猜測還差;但只要總是反預測而行,就優於隨機猜測,因此不存在 AUC<0.5 的情況。
最終AUC的範圍在[0.5, 1]之間,並且越接近1越好

AUC計算API
from sklearn.metrics import roc_auc_score
sklearn.metrics.roc_auc_score(y_true, y_score)
計算ROC曲線面積,即AUC值
y_true:每個樣本的真實類別,必須爲0(反例),1(正例)標記
y_score:每個樣本預測的概率值
# 0.5~1之間,越接近於1約好
y_test = np.where(y_test > 2.5, 1, 0)

 

print("AUC指標:", roc_auc_score(y_test, lr.predict(x_test)))

 AUC指標: 0.959063378758382

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章