邏輯迴歸是一種分類算法,雖然名字中帶有迴歸。可是它與迴歸之間有必定的聯繫。python
邏輯迴歸的原理:算法
輸入函數
邏輯迴歸的輸入就是一個線性迴歸的結果優化
sigmoid函數(激活函數)spa
迴歸的結果輸入到sigmoid函數當中
輸出結果:[0, 1]區間中的一個機率值,默認爲0.5爲閾值
邏輯迴歸最終的分類是經過屬於某個類別的機率值來判斷是否屬於某個類別,而且這個類別默認標記爲1(正例),另外的一個類別會標記爲0(反例)。(方便損失計算)3d
假設有兩個類別A,B,而且假設咱們的機率值爲屬於A(1)這個類別的機率值。如今有一個樣本的輸入到邏輯迴歸輸出結果0.6,那麼這個機率值超過0.5,意味着咱們訓練或者預測的結果就是A(1)類別。那麼反之,若是得出結果爲0.3那麼,訓練或者預測結果就爲B(0)類別。code
衡量邏輯迴歸的預測結果與真實結果的差別衡量邏輯迴歸的預測結果與真實結果的差別orm
損失,稱之爲對數似然損失,公式以下:blog
當y=1時:ci
完整損失函數:
使用梯度降低優化算法,能夠減小損失函數的值。更新邏輯迴歸前面對應算法的權重參數,提高本來屬於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
"""
# 一、讀取數據,處理缺失值以及標準化
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