分類演算法-邏輯迴歸與二分類
1、邏輯迴歸的應用場景
- 廣告點選率
- 是否為垃圾郵件
- 是否患病
- 金融詐騙
- 虛假賬號
看到上面的例子,我們可以發現其中的特點,那就是都屬於兩個類別之間的判斷。邏輯迴歸就是解決二分類問題的利器
2、 邏輯迴歸的原理
2.1 輸入
邏輯迴歸的輸入就是一個線性迴歸的結果,然後把這個結果對映到0-1之間。
2.2 啟用函式
- 分析
- 迴歸的結果輸入到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(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
返回結果:
得出來的權重: [[1.52208964 0.07495703 0.81846456 0.74113955 0.14261545 1.06740282
1.19233134 0.70059655 0.69993072]]
預測的類別: [2 2 4 2 4 2 4 2 4 2 2 2 2 4 2 2 2 2 2 2 2 2 2 4 2 2 2 2 4 4 2 4 2 2 2 4 2
4 4 4 2 4 2 4 2 2 2 2 2 2 4 4 2 4 2 4 2 2 2 2 2 4 4 2 4 2 4 2 2 4 2 4 2 4
4 2 4 4 4 2 4 2 2 4 4 2 4 4 2 2 4 2 4 2 2 4 2 4 4 2 4 2 2 2 2 2 4 2 2 2 4
4 2 2 2 2 2 4 4 2 2 2 2 2 2 4 4 4 2 2 2 2 2 2 2 2 2 4 4 4 2 4 4 4 2 2 2 2
2 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 4 2 4 4 2 4 2 2 4 4 4 4 2 2 2 2 4 2 2 4 4
4 4 4 4 2 4 2 2 4 2 4 2 2 4 2 4 2 2 2 4]
預測的準確率: 0.9804878048780488
5、分類的評估方法
5.1 精確率與召回率
5.1.1混淆矩陣
在分類任務下,預測結果(Predicted Condition)與正確標記(True Condition)之間存在四種不同的組合,構成混淆矩陣(適用於多分類)
![image-20220404225416011]
5.1.2 精確率(Precision)與召回率(Recall)
- 精確率:預測結果為正例樣本中真實為正例的比例(瞭解)
- 召回率:真實為正例的樣本中預測結果為正例的比例(查的全,對正樣本的區分能力)
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指標
ROC全稱是“受試者工作特徵”(Receiver Operating Characteristic)。ROC曲線的面積就是AUC(Area Under the Curve)。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.3 AUC指標
- AUC的概率意義是隨機取一對正負樣本,正樣本得分大於負樣本的概率
- AUC的最小值為0.5,最大值為1,取值越高越好
- AUC=1,完美分類器,採用這個預測模型時,不管設定什麼閾值都能得出完美預測。絕大多數預測的場合,不存在完美分類器。
- 0.5<AUC<1,優於隨機猜測。這個分類器(模型)妥善設定閾值的話,能有預測價值。
最終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)))
案例(邏輯迴歸進行癌症預測)
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))
print("精確率和召回率為:", classification_report(y_test, lr.predict(x_test), labels=[2, 4], target_names=['良性', '惡性']))
# 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)))
return None
返回結果:
得出來的權重: [[1.18088011 0.17960576 0.64716029 0.84256205 0.13629304 1.40238555
1.05954948 0.68190687 0.86153865]]
預測的類別: [4 4 2 2 4 2 4 2 2 2 2 2 2 4 4 4 2 4 2 4 2 2 4 2 2 2 2 2 2 4 2 4 2 2 2 2 2
2 4 2 4 2 2 2 4 2 2 2 2 2 2 4 4 2 2 2 2 2 2 2 4 2 4 2 2 2 2 2 4 2 4 2 2 2
2 4 4 2 4 2 2 2 4 2 2 4 4 2 2 2 2 4 2 2 2 2 4 2 2 2 2 2 2 2 2 2 2 4 4 2 2
2 4 2 2 2 4 2 2 2 4 2 2 2 2 4 2 4 2 2 2 4 2 2 2 4 2 2 2 2 2 4 2 2 2 2 2 2
2 4 4 2 2 4 2 2 2 2 2 4 4 4 4 2 2 2 2 2 2 2 2 2 2 2 4 4 2 2 2 4 2 2 4 4 2
4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 2 4 4 4]
預測的準確率: 0.9707317073170731
精確率和召回率為: precision recall f1-score support
良性 0.98 0.98 0.98 142
惡性 0.95 0.95 0.95 63
accuracy 0.97 205
macro avg 0.97 0.97 0.97 205
weighted avg 0.97 0.97 0.97 205
AUC指標: 0.965627095908786
5.2.5 小結
- AUC只能用來評價二分類
- AUC非常適合評價樣本不平衡中的分類器效能
注:參考了黑馬程式設計師的資料