!!!笔记自用

逻辑回归

在机器学习有监督学习中大致可以分为两大任务,一种是回归任务,一种是分类任务;那么这两种任务的区别是什么呢?按照较官方些的说法,输入变量与输出变量均为连续变量的预测问题是回归问题,输出变量为有限个离散变量的预测问题成为分类问题。
简单的来说回归问题是连续的变量,分类是离散的。

回归:
举个例子,输入一个人每日的运动时间、睡眠时间、工作时间、饮食等一些特征来预测一个人的体重,一个人的体重的值可以有无限个值。所以预测的结果是无限的、不确定的连续数值。这样的机器学习任务就是回归任务。

分类:
如果利用一个人每日的运动时间、睡眠时间、工作时间、饮食等一些特征来判断这个人的身体状况是否健康,那么最终的判断的结果就只有两种健康和不健康。这样的输出结果为离散值,预测的结果也是一个有限的数值来代表种类。

在这里插入图片描述
在这里插入图片描述
逻辑回归可以看做用回归的方法进行分类。
g(X)g(X)g(X)根据输入的值算出来的值在0到1之间,最后再根据值映射为0或1,比如大于0.5映射为1,小于0.5映射为0。
在这里插入图片描述

损失函数

前面的逻辑回归模型也有了,利用该模型可以对输入的数据特征进行分类判断。但是模型的判断能力的好坏取决于模型中的参数𝑤和𝑏,因此我们需要从提供的数据样本中不断学习,从而更新参数𝑤和𝑏使得预测出的结果全部正确的概率最大,简单来讲就是所有的样本的预测正
确的概率相乘得到数值是最大的,按这样的要求得到数据表达式如下所示,该式就是逻辑回归的损失函数。
L(w,b)=∏i=1m(p(1∣xi))yi(1−p(1∣xi))1−yiL(w,b)=\prod_{i=1}^{m} (p(1|x_i))^{yi}(1-p(1|x_i))^{1-y_i}L(w,b)=i=1m(p(1∣xi))yi(1p(1∣xi))1yi
在这里插入图片描述
在这里插入图片描述
这个时候就有人问了,为什么是连乘形式?
在机器学习中,我们通常假设数据样本是独立同分布的。这意味着每个样本的预测结果不受其他样本影响。因此,整个数据集的联合概率是每个样本个体概率的乘积。
在逻辑回归中,我们使用最大似然估计(Maximum Likelihood Estimation, MLE)来学习参数𝑤和𝑏,目标是使模型对所有样本的预测结果尽可能正确。最大似然估计的核心思想是找到参数值,使得观测到的数据(即样本标签)在给定模型下的概率最大。具体到逻辑回归,我们需要最大化所有样本被正确预测的联合概率。
在逻辑回归中,对于二分类问题,每个样本的预测概率可以写为:
在这里插入图片描述
整个数据集的似然函数(即联合概率)就是所有样本概率的连乘即“损失函数”。

下面贴一下w,b的参数更新:
求解前置公式:
在这里插入图片描述
w:
在这里插入图片描述
b:
在这里插入图片描述

分类模型的评价的指标

上次学统计学习第一章的时候,没有写这里笔记,这里写一下,ps:统计学习方法真的难啃。。。。
二分类常用的评价指标就是精确率和召回率,通常以关注的类为正类,其他类为负类,分类器在测试集上的预测正确或不正确,4种情况出现的总数分别记作: T:true F: false P: 正类 N:负类
TP — 将正类预测为正类数
FN — 将正类预测为负类数
FP — 将负类预测为正类数
TN — 将负类预测为负类数

精确率:
P=TPTP+FPP=\frac {TP} {TP+FP}P=TP+FPTP
召回率:
R=TPTP+FNR=\frac {TP} {TP+FN}R=TP+FNTP
调和均值F1F_1F1:
2F1=1P+1R\frac {2} {F_1}=\frac {1} {P}+\frac {1} {R}F12=P1+R1
F1=2TP2TP+FP+FNF_1=\frac {2TP} {2TP+FP+FN}F1=2TP+FP+FN2TP
精确率和召回率都高时,F1F_1F1值也会高。

案例

现在有一个深度学习的模型对来检测病人进行是否有肿瘤的判断,很显然这是一个二分类的任务,只有两种结果,第一种结果是判定有肿瘤,第二种是判定没有肿瘤。假设现在有100个其中有10个人是患有肿瘤的,90个人是健康的:现在这个深度学习模型对这100个人的进行判断,最后的判断结果为有10个人患有肿瘤,90个人是健康的。对比真实的结果发现,10个人被判断患有肿瘤的人中间有5人是健康的,另外5个人是患有肿瘤的;而被判断为健康的90人中有85个人是健康的,另外5个人是患有肿瘤的。

在计算评价指标之前先定义一些参数,首先本案例的目标是判定一个人是否有肿瘤,那么有肿瘤就是正类,健康就是反类。定义参数如下:
真实为正类预测为正类,称真正用TP表示。本案例中一共有10个正类(患有肿瘤),其中有5个被预测出来了;因此本案例的TP=5
真实为负类,预测为负类,称为真负,用TN表示。本案例中一共有90个负类(健康),其中有85个被预测出来了;因此本案例的TN=85
真实为负类,预测为正类,称为假正(误报),用FP表示。本案例中一共有90个负类(健康),其中有5个被预测为正类(患有肿瘤);因此本案例的FP=5
真实为正类,预测为负类,称为假负(漏报),用FN表示。本案例中一共有10个正类(患有肿瘤),其中有5个被预测为负类(健康);因此本案例的FN=5

准确率ACC为:
ACC=TP+TNTP+TN+FP+FN=90%ACC=\frac {TP+TN} {TP+TN+FP+FN}=90\%ACC=TP+TN+FP+FNTP+TN=90%
貌似很准确,实际上样本是不均衡的。比如:你去医院说一个人有病,百分之95以上都是有病的。并不能说模型厉害。

精确率: P=50% 可见模型对患有癌症的识别并不准确。
召回率(查全率),召回率告诉我们所有的正类样本中,有多少被识别出来了: R=50% 假如你说这个100个人都是正类,那不炸了,根据公式召回率为百分百,那没用啊,那并不能说明这个模型好。

最后精确率和召回率都高时,F1F_1F1值也会高。

#乳腺癌检测分类
#逻辑回归可以看做用回归的方法进行分类
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

# 读取数据
dataset = pd.read_csv(r'.\逻辑回归实战---乳腺癌检测\breast_cancer_data.csv')
# print(dataset)

#提取特征X
X = dataset.iloc[:, :-1] #把除最后一列的数据全部提取出来 第0列到倒数第一列
#print(X)

Y = dataset['target']
#print(Y)

#划分数据集和测试集 8份训练集 2份测试集(比例)
x_train,x_test,y_train ,y_test = train_test_split(X,Y,test_size = 0.2, random_state = 0)

#数据归一化
sc = MinMaxScaler(feature_range=(0,1)) #归一化到0到1之间
x_train = sc.fit_transform(x_train)
x_test = sc.fit_transform(x_test)
# print(x_train)

#逻辑回归模型搭建
lr = LogisticRegression()
lr.fit(x_train,y_train)


#打印模型的参数
# print('w',lr.coef_)
# print('b',lr.intercept_)

#利用训练好的模型进行推理测试
pre_result=lr.predict(x_test)
# print(pre_result)

#打印预测结果的概率
pre_result_proba = lr.predict_proba(x_test)
# print(pre_result_proba)


#获取恶性肿瘤的概率
pre_list=pre_result_proba[:,1]
# print(pre_list)


#设置阈值
thresholds = 0.3


#设置保存结果的列表
result=[]
result_name = []

for i in range(len(pre_list)):
    if pre_list[i]>thresholds:
        result.append(1)
        result_name.append('恶性')
    else:
        result.append(0)
        result_name.append('良性')


#打印阈值调整后的结果
# print(result)
# print(result_name)


#输出结果的精确率,召回率和f1值
report = classification_report(y_test,result,labels=[0,1],target_names=['良性肿瘤','恶性肿瘤'])
print(report)

输出结果:
在这里插入图片描述

更多推荐