目錄
一、概述
1、邏輯回歸
2、激活函數??sigmoid函數
3、最大似然估計
二、邏輯回歸
1、原理
2、損失函數
3、代碼
三、混淆矩陣
1、定義
2、舉例
3、代碼
四、分類評估方法
1、精確率(Precision)
2、召回率(Recall)
3、F1(score)
4、代碼
五、ROC曲線、AUC指標
1、ROC曲線
2、ROC 曲線圖像中,4 個特殊點的含義
3、案例:ROC 曲線的繪制
4、AUC指標:曲線下面積
六、每日回顧
一、概述
1、邏輯回歸
????????邏輯回歸是一種廣泛應用于分類任務的統計模型,尤其擅長解決二分類問題(例如預測郵件是否為垃圾郵件、客戶是否會購買產品等)。它通過邏輯函數(如Sigmoid函數)將線性回歸的輸出映射到[0,1]區間,從而得到事件發生的概率。盡管名稱中包含"回歸",但它實際上是一種分類算法。????????
原理:把線性函數的輸出作為激活函數輸入,設置閾值完成分類
2、激活函數??sigmoid函數
????????Sigmoid函數(也叫Logistic函數)是機器學習和神經網絡中一個非常經典的非線性函數。它的核心作用是將任意實數輸入映射到(0,1)區間,這個特性使其特別適合處理概率和二分類問題。
作用:把(-∞, +∞) 映射到 (0, 1),增加模型的非線性因素
單調遞增函數,拐點在x=0,y=0.5(可自定義)的位置
導函數公式:
優點??:
??????????輸出概率解釋??:其輸出值在(0,1)區間,天然適合解釋為概率
????????平滑可導??:函數全程平滑且易于求導,便于在其基礎上進行梯度下降等優化算法
缺點??:
????????梯度消失??:當輸入值的絕對值較大時(對應輸出接近0或1),其導數會趨近于0。在深層神經網絡中,這可能導致梯度在反向傳播過程中逐漸變小并消失,使得網絡訓練困難
????????輸出非零中心??:Sigmoid函數的輸出恒為正值。這可能導致在訓練過程中,權重更新時產生“之”字形抖動,收斂速度變慢
??????????計算成本??:涉及指數運算(e^{-x}
),計算量較大
3、最大似然估計
根據觀測到的結果來估計模型算法中的未知參數
最大似然估計的基本原理是??“既然事件已經發生,就假設它的發生概率是最大的”??。這是一種在已知結果的前提下,反向推測最可能的原因(參數)的思維方式。
例子:
假設有一枚不均勻的硬幣,出現正面的概率和反面的概率是不同的。假定出現正面的概率為𝜃
拋了6次得到如下現象 D = {正面,反面,反面,正面,正面,正面}。每次投擲事件都是相互獨立的。則根據產生的現象D,來估計參數𝜃是多少?
f(𝜃) = θ?(1?θ)2 令導數=0求極值,可估計出𝜃值
二、邏輯回歸
1、原理
??????????利用一個線性回歸模型的計算結果,再通過一個Sigmoid激活函數,將這個結果映射到0到1之間,將其解釋為“屬于某個類的概率”??。
把線性回歸的輸出,作為邏輯回歸的輸入
2、損失函數
損失函數的工作原理:每個樣本預測值有A、B兩個類別,真實類別對應的位置,概率值越大越好
3、代碼
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScalerdata = pd.read_csv("breast-cancer-wisconsin.csv")
print('清洗前數據集大小為:',data.shape)
# 數據清洗處理
# 將數據中的問號("?")替換為NaN值,然后刪除包含NaN值的行
# 這樣可以清理掉無效或缺失的數據記錄
data = data.replace(to_replace="?", value=np.nan)
data = data.dropna()
print('清洗后數據集大小為:', data.shape)# x = data[data.columns[1:-1]]
x = data.iloc[:, 1:-1]
y = data['Class']
X_train, X_test, y_train, y_test = (train_test_split(x, y, test_size=0.2, random_state=22))transfor = StandardScaler()
X_train = transfor.fit_transform(X_train)
X_test = transfor.transform(X_test)es = LogisticRegression()
es.fit(X_train, y_train)y_predict = es.predict(X_test)
print('預測結果:\n', y_predict)
acc = accuracy_score(y_test, es.predict(X_test))
print('準確率:', acc)
三、混淆矩陣
1、定義
真實值是 正例 的樣本中,被分類為 正例 的樣本數量有多少,叫做真正例(TP,True Positive)
真實值是 正例 的樣本中,被分類為 假例 的樣本數量有多少,叫做偽反例(FN,False Negative)
真實值是 假例 的樣本中,被分類為 正例 的樣本數量有多少,叫做偽正例(FP,False Positive)
真實值是 假例 的樣本中,被分類為 假例 的樣本數量有多少,叫做真反例(TN,True Negative)
2、舉例
已知:樣本集10樣本,有 6 個惡性腫瘤樣本,4 個良性腫瘤樣本,我們假設惡性腫瘤為正
模型A:預測對了 3 個惡性腫瘤樣本,4 個良性腫瘤樣本,計算:TP、FN、FP、TN
真正例 TP 為:3???????? 偽反例 FN 為:3
偽正例 FP 為:0? ? ? ? 真反例 TN 為:4
3、代碼
from sklearn.metrics import confusion_matrix
import pandas as pd# 已知:樣本集10個樣本,有 6個惡性腫瘤樣本,4個良性腫瘤樣本,我們假設惡性腫瘤為正
# 1、定義真實數據值,手動設置正反例
y_train = ['惡性', '惡性', '惡性', '惡性', '惡性', '惡性','良性', '良性', '良性', '良性']label = ['惡性', '良性'] # 樣本標簽,標簽1為正例,標簽2為反例
df_label = ['惡性(正例)', '良性(假例)']# 2、定義預測數據集,手動設置正反例
y_pred_A = ['惡性', '惡性', '惡性','良性', '良性', '良性', '良性', '良性', '良性', '良性']# 3、計算混淆矩陣
# 參數1:真實值,參數2:預測值,參數3:標簽
cm_A = confusion_matrix(y_train, y_pred_A, labels=label)
print(f"混淆矩陣為:\n{cm_A}")# 4、將混淆矩陣轉為DataFrame
# 參數1:矩陣,參數2:行標簽,參數3:列標簽
df_cm_A = pd.DataFrame(cm_A, index=df_label, columns=df_label)
print(f"混淆矩陣為:\n{df_cm_A}")y_pred_b = ['惡性', '惡性', '惡性','惡性', '惡性', '惡性','惡性', '惡性', '惡性','良性']
cm_b = confusion_matrix(y_train, y_pred_b, labels=label)
df_cm_b = pd.DataFrame(cm_b, index=df_label, columns=df_label)
print(f"混淆矩陣為:\n{df_cm_b}")
運行結果
四、分類評估方法
1、精確率(Precision)
查準率,對預測的正例樣本準確率。比如:把惡性腫瘤當做正例樣本,想知道模型對惡性腫瘤的預測準確率。
2、召回率(Recall)
也叫查全率,指的是預測為真正例樣本占所有真實正例樣本的比重。
3、F1(score)
若對模型的精度、召回率都有要求,希望知道模型在這兩個評估方向的綜合預測能力
4、代碼
from sklearn.metrics import recall_score, f1_score
from sklearn.metrics import precision_score
y_train = ['惡性', '惡性', '惡性', '惡性', '惡性', '惡性','良性', '良性', '良性', '良性']
y_pred_A = ['惡性', '惡性', '惡性','良性', '良性', '良性', '良性', '良性', '良性', '良性']
y_pred_b = ['惡性', '惡性', '惡性','惡性', '惡性', '惡性','惡性', '惡性', '惡性','良性']
def dm01_precision():result1 = precision_score(y_train, y_pred_A, pos_label='惡性')print('模型A的精確率:', result1)result2 = precision_score(y_train, y_pred_b, pos_label='惡性')print('模型B的精確率:', result2)
def dm02_Recall():result1 = recall_score(y_train, y_pred_A, pos_label='惡性')print('模型A的召回率:', result1)result2 = recall_score(y_train, y_pred_b, pos_label='惡性')print('模型B的召回率:', result2)
def dm03_F1():result1 = f1_score(y_train, y_pred_A, pos_label='惡性')print('模型A的F1:', result1)result2 = f1_score(y_train, y_pred_b, pos_label='惡性')print('模型B的F1:', result2)
if __name__ == '__main__':dm01_precision()dm02_Recall()dm03_F1()
五、ROC曲線、AUC指標
1、ROC曲線
??ROC曲線??(Receiver Operating Characteristic Curve,受試者工作特征曲線)是一種圖形化工具,用于展示二分類模型在不同分類閾值下的性能表現。它的??橫軸是假陽性率(FPR, False Positive Rate)??,??縱軸是真陽性率(TPR, True Positive Rate)??。
??真陽性率 (TPR)??,也稱為??召回率(Recall)??或??靈敏度(Sensitivity)??,計算公式為:TPR = TP / (TP + FN)。它表示??實際為正例的樣本中,被模型正確預測為正例的比例??。
??假陽性率 (FPR)??,計算公式為:FPR = FP / (FP + TN)。它表示??實際為負例的樣本中,被模型錯誤預測為正例的比例。
2、ROC 曲線圖像中,4 個特殊點的含義
3、案例:ROC 曲線的繪制
會得出不同閾值下的點坐標:(0, 0)、(0, 0.5)、(0, 1)、(0.25, 1)、(0.5, 1)、(0.75, 1)
則由 TPR 和 FPR 構成的 ROC 圖像為
4、AUC指標:曲線下面積
??AUC??(Area Under the Curve)則是??ROC曲線下的面積??,用于量化模型的整體分類性能。AUC的取值范圍在0到1之間。
ROC曲線的優劣可以通過曲線下的面積(AUC)來衡量,AUC越大表示分類器性能越好。??AUC與ROC曲線??:AUC就是這條ROC曲線下方的面積。ROC曲線越靠近左上角(即FPR越小,TPR越大),模型的性能通常越好,其AUC值也更接近1。
????????當AUC=0.5時,表示分類器的性能等同于隨機猜測當
????????當AUC=1時,表示分類器的性能完美,能夠完全正確地將正負例分類。
??????(AUC=0時也可以,完美相反地正確預測)
AUC的核心優勢在于其??對類別不平衡不敏感??,且??綜合了模型在所有可能閾值下的表現??。理解其??概率解釋??(隨機正樣本得分高于隨機負樣本的概率)有助于更深刻地把握其內涵。
六、每日回顧
1:邏輯回歸主要解決什么類型的問題?邏輯回歸的流程是什么 ?
2:混淆矩陣的四個基本元素(TP、TN、FP、FN)分別代表什么含義?
3:精確率(Precision)、召回率(Recall)的計算公式是什么?分別反映模型的什么能力?
4:ROC 曲線的橫縱軸分別是什么?曲線上的每個點代表什么含義?
5:AUC 指標的含義是什么?其取值范圍是多少?AUC=0.5、AUC=1 、AUC=0分別說明模型的什么性能?