邏輯回歸(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:正則化力度
- solver:優化求解方式(默認開源的liblinear庫實現,內部使用了坐標軸下降法來迭代優化損失函數)
默認將類別數量少的當做正例
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:每個樣本預測的概率值
- sklearn.metrics.roc_auc_score(y_true, 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非常適合評價樣本不平衡中的分類器性能