1、什么是逻辑回归?
虽然名字叫“逻辑回归”,但是逻辑回归是一个分类算法。只要用于进行二分类,即分类结果只有两种。例如:是否患病?是否为垃圾邮件?广告是否点击?
逻辑回归执行过程如下:
1、输入:线性回归的输出作为逻辑回归的输入,即输入为权重表达式
2、激活函数:回归的结果输入到
s
i
g
m
o
i
d
sigmoid
sigmoid函数中,
s
i
g
m
o
i
d
sigmoid
sigmoid函数表达式为:
1
1
+
e
−
x
\frac1{1+e^{-x}}
1+e−x1,其输出结果是在
(
0
,
1
)
(0,1)
(0,1)之间,默认
0.5
0.5
0.5为阈值
3、假设函数/线性模型:即将线性回归的输出结果(权重表达式)代入到激活函数里面,得到
y
=
1
1
+
e
w
1
x
1
+
w
2
x
2
+
w
3
x
3
+
.
.
.
+
w
j
x
j
+
b
y=\frac1{1+e^{w_1x_1+w_2x_2+w_3x_3+...+w_jx_j}}+b
y=1+ew1x1+w2x2+w3x3+...+wjxj1+b 其中
b
b
b为偏置
4、损失函数:对数似然损失,公式为
L
(
w
,
b
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
log
(
y
^
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
y
^
(
i
)
)
]
\mathcal{L}(\mathbf{w},b)=-\frac{1}{m}\sum_{i=1}^{m}\left[y^{(i)}\log(\hat{y}^{(i)})+(1-y^{(i)})\log(1-\hat{y}^{(i)})\right]
L(w,b)=−m1i=1∑m[y(i)log(y^(i))+(1−y(i))log(1−y^(i))]
其中,
m
是样本数量,
y
^
(
i
)
是第
i
个样本的预测概率,
y
(
i
)
是第
i
个样本的真实
标签。
\begin{aligned}&\text{其中,}m\text{ 是样本数量,}\hat{y}^{(i)}\text{ 是第 }i\text{ 个样本的预测概率,}y^{(i)}\text{ 是第 }i\text{ 个样本的真实}\\&\text{标签。}\end{aligned}
其中,m 是样本数量,y^(i) 是第 i 个样本的预测概率,y(i) 是第 i 个样本的真实标签。
5、优化损失:梯度下降
# 逻辑回归API调用
API:sklearn.linear_model.LogisticRegression(solver='liblinear',penalty='l2',C=1.0)
solver:优化求解方式(默认为开源的liblinear库实现
"""
penalty: 正则化类型。默认值:'l2'
solver: 优化算法。默认值:'lbfgs'
可选值:'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'
描述:用于优化问题的算法。不同的solver支持不同的正则化。
max_iter: 最大迭代次数。
默认值:100
描述:求解器收敛的最大迭代次数。
C: 正则化强度的倒数。
默认值:1.0
描述:必须为正数。较小的值指定更强的正则化。
"""
2、混淆矩阵
在分类任务下,预测结果与正确标记之间存在的四种不同组合,构成混淆矩阵
TP(真正例) ----真实结果为真,预测结果也为真
TN(真反例) ----真实结果为假,预测结果也为假
FP(伪正例) ----真实结果为假,预测结果为真
FN(伪反例) ----真实结果为真,预测结果为假
3、精确率和召回率
精确率:预测结果为正例的结果中真实为正例的比例
精确率
=
T
P
T
P
+
F
P
=\frac{TP}{TP+FP}
=TP+FPTP
召回率:真实为正例的结果中预测结果为正例的比例,反映对正样本的区分能力
召回率
=
T
P
T
P
+
F
N
=\frac{TP}{TP+FN}
=TP+FNTP
F1-score: 衡量模型的稳健性
F
1
−
s
c
o
r
e
=
2
T
P
2
T
P
+
F
N
+
F
P
F1-score=\frac{2TP}{2TP+FN+FP}
F1−score=2TP+FN+FP2TP
sklearn.metrics.classification_report(y_true,y_predict,labels=[],target_names=none)
"""
y_true:真实值
y_predict:预估器的预测值
labels:指定类别对应的数字
target_names:目标类别名称
return:每个类别的精确率和召回率
"""
4、ROC曲线和AUC指标1、TPR和FPR
TPR:
T
P
R
=
T
P
T
P
+
F
N
TPR=\frac{TP}{TP+FN}
TPR=TP+FNTP 所有真实类别为1的样本中,预测类别为1的比例 ----召回率
FPR:
F
P
R
=
F
P
F
P
+
T
N
FPR=\frac{FP}{FP+TN}
FPR=FP+TNFP 所有真实类别为0的样本中,预测类别为1的比例
当TPR等于FPR时,预测效果为Random guess(瞎猜)
ROC曲线(Receiver Operating Characteristic Curve)是通过改变分类阈值绘制出的TPR(True Positive Rate)和FPR(False Positive Rate)之间的关系图。
AUC(Area Under the ROC Curve)是ROC曲线下的面积,反映模型区分正负样本的能力。AUC值在0.5到1之间,越接近1,模型效果越好。
4、逻辑回归案例——癌症预测(数据集点我)
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
from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score
data = pd.read_csv(r"E:\Python_learning\py基础\machine_learning\breastCancer.csv")
# 缺失值处理,缺失值为?先替换为np.nan,再删除缺失值
# 1)替换成np.nan
data = data.replace(to_replace="?", value=np.nan)
# 2)删除确实值,以样本为单位
data.dropna(inplace=True)
# 特征集和目标集切分
x = data.iloc[:, 2:-1]
y = data['class']
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y)
# 归一化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 预估器预测
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
print(f"逻辑回归的偏置为{estimator.intercept_}")
print(f"逻辑回归的参数为{estimator.coef_}")
y_predict = estimator.predict(x_test)
print("预测结果如下", y_predict)
print("预测值与真实值比对:", y_predict == y_test)
print("该模型准确率为", estimator.score(x_test, y_test))
report = classification_report(y_test, y_predict, labels=[2, 4], target_names=['良性', '恶性'])
print(report)
# AUC和ROC计算,每个真是样本必须为0(正例)、1(反例)
# 将y_test 转换0,1
np.where(y_test > 3, 1, 0)
print(f"该模型AUC指标为{roc_auc_score(y_test, y_predict)}")
运行结果如下:
对于癌症检查,虽然正确率已经达到了
95.3
%
95.3\%
95.3%,但是对于这类较为严肃的问题,我们认为还是比较低,读者可以使用网格搜索和交叉验证(GridSearchcv)来找到最佳的超参数和最佳正确率。