1. 程式人生 > 實用技巧 >分類演算法-邏輯迴歸與二分類

分類演算法-邏輯迴歸與二分類

邏輯迴歸(Logistic Regression)是機器學習中的一種分類模型,邏輯迴歸是一種分類演算法,雖然名字中帶有迴歸,但是它與迴歸之間有一定的聯絡。由於演算法的簡單和高效,在實際中應用非常廣泛。

1、邏輯迴歸的應用場景

  • 廣告點選率
  • 是否為垃圾郵件
  • 是否患病
  • 金融詐騙
  • 虛假賬號

看到上面的例子,我們可以發現其中的特點,那就是都屬於兩個類別之間的判斷。邏輯迴歸就是解決二分類問題的利器

2、 邏輯迴歸的原理

2.1 輸入

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

2.2 啟用函式

  • sigmoid函式

  • 分析
    • 迴歸的結果輸入到sigmoid函式當中
    • 輸出結果:[0, 1]區間中的一個概率值,預設為0.5為閾值

邏輯迴歸最終的分類是通過屬於某個類別的概率值來判斷是否屬於某個類別,並且這個類別預設標記為1(正例),另外的一個類別會標記為0(反例)。(方便損失計算)

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

所以接下來我們回憶之前的線性迴歸預測結果我們用均方誤差衡量,那如果對於邏輯迴歸,我們預測的結果不對該怎麼去衡量這個損失呢?我們來看這樣一張圖

那麼如何去衡量邏輯迴歸的預測結果與真實結果的差異呢?

2.3 損失以及優化

2.3.1 損失

邏輯迴歸的損失,稱之為對數似然損失,公式如下:

  • 分開類別:

怎麼理解單個的式子呢?這個要根據log的函式影象來理解

  • 綜合完整損失函式

看到這個式子,其實跟我們講的資訊熵類似。

接下來我們呢就帶入上面那個例子來計算一遍,就能理解意義了。

我們已經知道,log(P), P值越大,結果越小,所以我們可以對著這個損失的式子去分析

2.3.2 優化

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

3、邏輯迴歸API

  • sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
    • solver:優化求解方式(預設開源的liblinear庫實現,內部使用了座標軸下降法來迭代優化損失函式)
      • sag:根據資料集自動選擇,隨機平均梯度下降
    • penalty:正則化的種類
    • C:正則化力度

預設將類別數量少的當做正例

LogisticRegression方法相當於 SGDClassifier(loss="log", penalty=" "),SGDClassifier實現了一個普通的隨機梯度下降學習,也支援平均隨機梯度下降法(ASGD),可以通過設定average=True。而使用LogisticRegression(實現了SAG)

4、 案例:癌症分類預測-良/惡性乳腺癌腫瘤預測

  • 資料介紹

原始資料的下載地址:https://archive.ics.uci.edu/ml/machine-learning-databases/

資料描述

(1)699條樣本,共11列資料,第一列用語檢索的id,後9列分別是與腫瘤

相關的醫學特徵,最後一列表示腫瘤型別的數值。

(2)包含16個缺失值,用”?”標出。

4.1 分析

  • 缺失值處理
  • 標準化處理
  • 邏輯迴歸預測

4.2 程式碼

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

在很多分類場景當中我們不一定只關注預測的準確率!!!!!

比如以這個癌症舉例子!!!我們並不關注預測的準確率,而是關注在所有的樣本當中,癌症患者有沒有被全部預測(檢測)出來。

5、分類的評估方法

5.1 精確率與召回率

5.1.1混淆矩陣

在分類任務下,預測結果(Predicted Condition)與正確標記(True Condition)之間存在四種不同的組合,構成混淆矩陣(適用於多分類)

5.1.2 精確率(Precision)與召回率(Recall)

  • 精確率:預測結果為正例樣本中真實為正例的比例(瞭解)

  • 召回率:真實為正例的樣本中預測結果為正例的比例(查的全,對正樣本的區分能力)

那麼怎麼更好理解這個兩個概念

還有其他的評估標準,F1-score,反映了模型的穩健型

5.1.3 分類評估報告API

  • 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=['良性', '惡性']))

假設這樣一個情況,如果99個樣本癌症,1個樣本非癌症,不管怎樣我全都預測正例(預設癌症為正例),準確率就為99%但是這樣效果並不好,這就是樣本不均衡下的評估問題

問題:如何衡量樣本不均衡下的評估?

5.2 ROC曲線與AUC指標

5.2.1 知道TPR與FPR

  • TPR = TP / (TP + FN)
    • 所有真實類別為1的樣本中,預測類別為1的比例
  • FPR = FP / (FP + FN)
    • 所有真實類別為0的樣本中,預測類別為1的比例

5.2.2 ROC曲線

  • ROC曲線的橫軸就是FPRate,縱軸就是TPRate,當二者相等時,表示的意義則是:對於不論真實類別是1還是0的樣本,分類器預測為1的概率是相等的,此時AUC為0.5

5.2.3AUC指標

  • AUC的概率意義是隨機取一對正負樣本,正樣本得分大於負樣本的概率
  • AUC的最小值為0.5,最大值為1,取值越高越好
  • AUC=1,完美分類器,採用這個預測模型時,不管設定什麼閾值都能得出完美預測。絕大多數預測的場合,不存在完美分類器。
  • **0.5

最終AUC的範圍在[0.5, 1]之間,並且越接近1越好

5.2.4 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)))

5.2.5、總結

  • AUC只能用來評價二分類
  • AUC非常適合評價樣本不平衡中的分類器效能