介绍
- 首先要了解线性回归(你一定要看):线性回归与岭回归。
- 逻辑回归(分类算法):以线性回归的式子作为公式基础,接受特征值并输入后,通过sigmoid函数可将目标值值转化为0~1之间的某一个值,即为逻辑回归的公式。所以你可以理解逻辑回归公式为:ho(x) = sigmoid(f(x)),(f(x) = w’x 是线性回归公式),通俗来说:逻辑回归比线性回归多了一个sigmoid函数。
- sigmoid函数介绍:
- 公式:

- 公式介绍:g(z)为sigmoid函数,ho(x)为逻辑回归公式,e为常量2.71,z为线性回归的结果。
- sigmoid函数图像:z是自变量,g(z)是因变量。

- 逻辑回归应用场景:广告点击率,是否为垃圾邮件,是否患病,金融诈骗,虚假账号,(只能解决二分类问题,亦是解决二分类问题的利器)。
- 逻辑回归特点:
1、通过公式计算,能够得出样本对应目标值的概率值;
2、逻辑回归仍然会有过拟合问题;也有自己的权重值;也有自己的损失函数(ps:虽说与线性回归原理相同,但是由于是分类问题,损失函数不一样,所以其损失函数只能通过梯度下降求解)。
3、逻辑回归预测的概率为样本中占少数的类别的概率,此时此类别为正例。(这样是方便模型构建,如果预测为样本多数类别的概率,那么参与计算的数据就会更多) - 逻辑回归预测目标值的原理:通过线性回归公式,配合sigmoid函数,可计算出每个样本的概率,然后就可将测试集样本的预测转换为二分类问题,指定一个阈值(一般为0.5),那样本的概率与阈值对比,大于这个阈值为一类,小于这个阈值为另一类。
- 损失函数(误差大小):对数似然损失函数介绍:
- 公式1:

- 公式1参数解释:ho(x)(逻辑回归公式的预测结果(此时假设ho(x)代表了属于1类的概率))为自变量,cost为因变量(损失值)。
- if y=1(目标值为1类)的函数图像:
- if y=1(目标值为1类)的总结:样本的目标值属于1类的概率越大,ho(x)越大,cost损失值越小,样本的目标值越接近1类。

- if y=0(目标值为0类)的函数图像:
- if y=0(目标值为0类)的总结:样本的目标值属于1类的概率越大,ho(x)越大,cost损失值越大,样本的目标值越接近1类(换言之:样本的目标值属于0类的概率越大,属于1类的概率越小,ho(x)越小,cost损失值越小,样本的目标值越接近0类)。

- 公式1 的总结:
1、对于逻辑回归公式而言,只会判断一个类别,即:“是1类为1类,非1类即0类”。
2、损失值越小,越接近目标值。
3、公式1是公式2的铺垫,因为公式2求的是总损失值最小情况。 - 公式2(完整的损失函数):

- 公式介绍:cost值越小,那么预测的类别的精准度就越高。
- 公式2参数解释(假设ho(x)为预测为1类的概率):ho(x):为预测为1类的概率,yi:为样本的目标值,此计算的过程为:通过求出最小的cost,而确定每个训练样本的ho(x)的概率。
- 公式2理解:其实就是将每个样本的损失值相加起来,求出最终的损失值,当cost的结果最小的时候,代表精度最高(具体要参考对数函数在a>1时的函数图像来理解)。
- 损失函数求解:梯度下降:最通俗理解梯度下降
python实现逻辑回归的Api介绍:
- API: from sklearn.linear_model import LogisticRegression
- 重要参数介绍:penalty:正则化方案(l2或者l1正则化); C:正则化力度。
- 特点:可解决过拟合问题。
案例
- 需求:良恶性肿瘤检测。
- 数据集:预测案例数据集
- 数据描述:
1、699条样本,共11列数据,第一列用于检索的id,后9列分别是与肿瘤
相关的医学特征,最后一列表示肿瘤类型的数值。
2、包含16个缺失值,用”?”标出。
3、目标值:(2为良性,4为恶性)
4、良性和恶性的数据分布为:良性:458(65.5%);恶性:241(34.5%),根据逻辑回归算法的第三个特点,得出:此案例,逻辑回归预测的样本概率为是恶性的概率,即恶性为正例。 - 案例流程:
1、获取数据
2、缺失值 ,标准化处理…
3、估计器估计流程
import os
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
def log_cancer():
"""
逻辑回归预测良性恶性案例(特征为细胞的属性)
:return:None
"""
columns = ['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=columns
)
data = data.replace(to_replace="?", value=np.nan)
data = data.dropna()
x_train, x_test, y_train, y_test = train_test_split(data[columns[1:-1]], data[columns[-1]], test_size=0.25)
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
lg = LogisticRegression(C=1.0)
lg.fit(x_train, y_train)
print(f"回归系数:{os.linesep}", lg.coef_)
y_predict = lg.predict(x_test)
print(f"准确率:{os.linesep}", lg.score(x_test, y_test))
print(f"召回率:{os.linesep}", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]))
return None
if __name__ == '__main__':
log_cancer()
补充
- 没有阀值的概念,这是个错词,只有阈值。
- 写go写多了,顺手图像的单词写错了,不改了,正确的为:cost。
- 逻辑森林可以做多分类问题。但是没人会去那样干,因为相当于把一个三分类问题化为两个二分类问题,这样很无聊。