news 2026/9/26 4:11:23

机器学习4:逻辑回归简介、原理、API函数和案例、分类问题评估、电信客户流失预测案例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器学习4:逻辑回归简介、原理、API函数和案例、分类问题评估、电信客户流失预测案例

逻辑回归简介

原理:把(线性回归处理后的)值->通过Sigmoid激活函数 映射到[0,1]之间->结合阈值,划分正负样本

极大似然估计它的核心思想是找到一个参数值,使得观测到的样本数据出现的概率(即似然函数)最大。

求导是为了找极值使得似然函数值最大,确保估计的准确性,这种只用于似然函数导数存在和单峰值的情况

逻辑回归原理

逻辑回归API函数和案例

''' 案例: 演示逻辑回归模型实现癌症预测 逻辑回归模型介绍: 概述: 属于有监督学习,即:有特征,有标签,且表示是离散的 主要适用于:二分类 原理:把线性回归处理后的预测值->通过Sigmoid激活函数,映射到[0,1]概率->基于自定义的阈值,结合概率来分类 损失函数: 极大似然估计函数的负数形式 回顾:机器学习项目流程 1.加载数据 2.数据预处理 3特征工程(特征提取,特征预处理,特征降维,特征选择,特征组合 4.模型训练 5.模型预测 6.模型评估 ''' #导包 import numpy as np import pandas as pd from sklearn.linear_model import LogisticRegression#逻辑回归模型 from sklearn.preprocessing import StandardScaler#标准化 from sklearn.model_selection import train_test_split#训练集和测试机分割 from sklearn.metrics import accuracy_score#模型评估 # 1.加载数据 data=pd.read_csv('./datas/breast-cancer-wisconsin.csv') data.info()#查看数据信息 # 2.数据预处理 #2.1把?替换成np.nan,参1:要被替换的值,参2:用来替换的值 参3:是否替换源数据,默认为False data.replace('?',np.nan,inplace=True) #2.2缺失值处理->删除 原本有699个数据,但有16个?脏数据,所以删除后,剩683个数据 data.dropna(axis=0,inplace=True)#axis=0表示行,删除包含缺失值的行 #2.3打印处理后的信息 data.info() # 3特征工程(特征提取,特征预处理,特征降维,特征选择,特征组合 #3.1特征提取之提取特征和标签 x=data.iloc[:,1:-1]#按照行号,列索引获取数据,:表示所有行,1:-1表示从第1列到最后1列,包左不包右 y=data.iloc[:,-1]#获取最后一列 # y=data.iloc['Class']#获取最后一列,效果同上 # y=data.Class#获取最后一列,效果同上 #3.2查看下特征和标签 print(x[:5]) print(y[:5]) print(x.shape,y.shape) #3.3切割训练集和测试集 x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=23) #3.4特征工程:标准化 #3.4.1创建标准化对象 transfer=StandardScaler() #3.4.2对训练集进行标准化 训练+标准化 x_train=transfer.fit_transform(x_train) #3.4.3对测试集进行标准化 标准化 x_test=transfer.transform(x_test) # 4.模型训练 #4.1创建模型对象->逻辑回归模型 estimator=LogisticRegression() #4.2模型训练 estimator.fit(x_train,y_train) # 5.模型预测 y_pre=estimator.predict(x_test) print(f'预测值为:{y_pre}') # 6.模型评估 #正确率(准确率),公式为:预测对的/样本总数 print(f'预测前评估,正确率:{estimator.score(x_test,y_test)}') #测试集的特征,标签 print(f'预测后评估,正确率:{accuracy_score(y_test,y_pre)}') #测试集的标签,预测值 #思考:逻辑回归模型能用准确率来评测吗? # 答案: 可以, 但是结果不精准, 因为逻辑回归模型主要用于 二分类, 即: A类还是B类, 不能说 97%的A类, 3%的B类. # 所以要通过 混淆矩阵来评测, 即: 精确率, 召回率, F1值(F1-Score), ROC曲线, AUC值.

分类问题评估

混淆矩阵

True Positive :表示样本真实的类别

Positive :表示样本被预测为的类别

精确率=你抓到的坏人中,真正的坏人占的比例;

召回率: 真正的坏人,你抓到的比率.

精确率、召回率、F1-score

''' 案例: 演示混淆矩阵和精确率,召回率,F1值 回顾:逻辑回归 概述:属于有监督学习,即:有特征,有标签,且标签是离散的 适用于二分类 评估:精确率、召回率、F1值 混淆矩阵: 概述: 用来描述真实值和预测值之间关系的 图解: 预测标签(正例) 预测标签(反例) 真实标签(正例) 真正例 伪反例 真实标签(反例) 伪正例 真反例 单词: True真,False假 Positive正例 Negative反例 结论: 1.模拟使用分类少的充当正例 2.精确率=真正例在预测正例中的占比;tp/(tp+fp) 3.召回率=真正例在真正例中的占比;tp/(tp+fn) 4.F1值=2*(精确率*召回率)/(精确率+召回率) ''' #导包 import pandas as pd from sklearn.metrics import confusion_matrix,precision_score,recall_score,f1_score#混淆矩阵,精确率,召回率,F1值 #需求:已知有10个样本,6个恶性肿瘤(正例),4个良性肿瘤(反例) #模型A预测结果为:预测对了3个恶性肿瘤,预测对了4个良性肿瘤 #模型B预测结果为:预测对了6个恶性肿瘤,预测对了1个良性肿瘤 #请针对于上述的数据集,搭建混淆矩阵,并分别计算模型A、模型B的精确率,召回率,F1值 #1.定义变量,记录样本数据 y_train=['恶性','恶性','恶性','恶性','恶性','恶性', '良性','良性','良性','良性'] #2.定义变量,记录模型A预测结果 y_pre_A=['恶性','恶性','恶性','良性','良性','良性', '良性','良性','良性','良性'] #3.定义变量,记录模型B预测结果 y_pre_B=['恶性','恶性','恶性','恶性','恶性','恶性', '良性','恶性','恶性','恶性'] #4.用标签标记正例和反例 lable=['恶性','良性'] df_lable=['恶性(正例)','良性(反例)'] #5.针对于真实值(y_train)和模型A预测结果(y_pre_A),搭建混淆矩阵 cm_A=confusion_matrix(y_train,y_pre_A) print(f'混淆矩阵A:{cm_A}') #6.为了测试结果更好看,把上述的混淆矩阵转换成DataFrame df_A=pd.DataFrame(cm_A,index=df_lable,columns=df_lable) print(f'混淆矩阵A的DataFrame对象形式:\n{df_A}') #7.针对于真实值(y_train)和模型B预测结果(y_pre_B),搭建混淆矩阵 cm_B=confusion_matrix(y_train,y_pre_B) print(f'混淆矩阵A:{cm_B}') #8.为了测试结果更好看,把上述的混淆矩阵转换成DataFrame df_B=pd.DataFrame(cm_B,index=df_lable,columns=df_lable) print(f'混淆矩阵A的DataFrame对象形式:\n{df_B}') #9.计算模型A的精确率,召回率,F1值 print(f'模型A精确率:{precision_score(y_train,y_pre_A,pos_label='恶性')}')#参1:真实值,参2:预测值,参3:正例标签 print(f'模型A的召回率:{recall_score(y_train,y_pre_A,pos_label='恶性')}')#参1:真实值,参2:预测值,参3:正例标签 print(f'模型A的F1值:{f1_score(y_train,y_pre_A,pos_label='恶性')}')#参1:真实值,参2:预测值,参3:正例标签 #9.计算模型B的精确率,召回率,F1值 print(f'模型B精确率:{precision_score(y_train,y_pre_B,pos_label='恶性')}')#参1:真实值,参2:预测值,参3:正例标签 print(f'模型B的召回率:{recall_score(y_train,y_pre_B,pos_label='恶性')}')#参1:真实值,参2:预测值,参3:正例标签 print(f'模型B的F1值:{f1_score(y_train,y_pre_B,pos_label='恶性')}')#参1:真实值,参2:预测值,参3:正例标签

AUC指标、ROC曲线

电信客户流失预测案例

因为机器学习需要数字类型. 通过热编码把文字0,12..等转为数字, 且编码后的0,1,2不存在大小关系,就不会误导模型, 分类表达和结果才准确

''' 案例: 电信客户流失案例分析 目的: 1. 演示逻辑回归的相关操作, 主要是: 二分法(流失, 不流失) 2. 演示逻辑回归的评估操作, 主要是: 混淆矩阵, 准确率, 召回率, F1值, ROC曲线, AUC值, 分类评估报告(了解) ''' #导包 import pandas as pd import numpy as np from matplotlib import pyplot as plt import seaborn as sns from sklearn.linear_model import LogisticRegression #混淆矩阵,准确率,精确率,召回率,F1值,ROC曲线,AUC值,分类评估报告(了解) from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, f1_score, roc_curve, auc, \ classification_report, recall_score, roc_auc_score from sklearn.model_selection import train_test_split #1.定义函数,用于实现数据预处理 def data_preprocess(): #1.读取数据 data=pd.read_csv('./datas/churn.csv') data.info() print(data.head(5))#原来的字符串列是Churn和gender #2.因为上述的Churn,gender是字符串类型的,我们要对其进行热编码(one-hot)处理 data=pd.get_dummies(data) data.info() print(data.head(5))#热编码后的结果:将上面的两列换成了4列:Churn_No,Churn_Yes,gender_Male,gender_Female;这是bool类型 #但是上面4列太冗余了,我们可以删除其中的一列 #3.删除列 参数1:要删除的列名 参数2:删除的是列 参数3:是否在原数据上进行修改 data.drop(['Churn_No','gender_Male'],axis=1,inplace=True) data.info() print(data.head(5)) #4.修改列名,将Churn_Yes定义为标签列flag data.rename(columns={'Churn_Yes':'flag'},inplace=True) data.info() print(data.head(5)) #5.查看一下数据集中,标签是否是均衡的 print(data['flag'].value_counts())#False:不流失,True:流失 #2.定义函数,用于数据的可视化,显示:月度会员的流失情况 def data_visualization(): #1.读取数据 data=pd.read_csv('./datas/churn.csv') #2.对上述数据做热编码处理 data=pd.get_dummies(data) #3.删除冗余列 data.drop(['Churn_No','gender_Male'],axis=1,inplace=True) #4.修改列名,将Churn_Yes定义为标签列flag data.rename(columns={'Churn_Yes':'flag'},inplace=True) #5.查看数据集的分布情况 print(data.flag.value_counts()) print(data.columns)#查看数据集的列名 #6.通过技术柱状图,绘制(月度会员的流失情况) sns.countplot(data,x='Contract_Month',huez ='flag') plt.show() #3.定义函数,用于实现逻辑回归模型的训练与评估 def data_LogisticRegressionModel(): #1.读取数据 data=pd.read_csv('./datas/churn.csv') #2.数据预处理 #2.1对上述数据做热编码处理 data=pd.get_dummies(data) #2.2删除冗余列 data.drop(['Churn_No','gender_Male'],axis=1,inplace=True) #2.3修改列名,将Churn_Yes定义为标签列flag data.rename(columns={'Churn_Yes':'flag'},inplace=True) #3.特征工程(特征提取,特征预处理:标准还、归一化...)这里不用 #划分数据集为训练集和测试集 x=data[['Contract_Month','PaymentElectronic','internet_other']] y=data[['flag']] x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=42) #4.创建逻辑回归模型并训练 #4.1创建逻辑回归对象 estimator=LogisticRegression() #4.2训练模型 estimator.fit(x_train,y_train) #5.模型预测 y_pre=estimator.predict(x_test) print(f'预测值为:{y_pre}') #6.模型评估 #6.1准确率 print(f'准确率:{accuracy_score(y_test,y_pre)}')#真实值,预测值 #6.2精确率 print(f'精确率:{precision_score(y_test,y_pre)}')#真实值,预测值 #6.3召回率 print(f'召回率:{recall_score(y_test,y_pre)}')#真实值,预测值 #6.4F1值 print(f'F1值:{f1_score(y_test,y_pre)}')#真实值,预测值 #6.5roc曲线 print(f'roc曲线:{roc_auc_score(y_test,y_pre)}')#真实值,预测值 #6.6分类评估报告 #参数macro avg意思是:宏平均,是指:所有的分类器,都按照macro的方式计算平均值 #不考虑样本的权重,直接平均,跟样本的数量、权重无关,所有特征权重都一样,适合于数据集比较平衡的情况 #参数weighted avg意思是:加权平均,是指:所有的分类器,都按照weighted的方式计算平均值 #考虑样本的权重,根据样本的数量,计算出样本的权重,再进行平均,适合于数据集比较不均衡的情况 print(classification_report(y_test,y_pre))#真实值,预测值 #4.在main函数中测试 if __name__ == '__main__': # data_preprocess() # data_visualization() data_LogisticRegressionModel()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 4:09:33

MCP Server 开发全流程指南:从架构到部署

这份关于 MCP 开发全流程的指南, 将从架构设计一直到最终的部署工作, 一步步为你展开详细的介绍, 首先我们要对 MCP 的核心概念进行深入且清晰的解析。MCP, 也就是Multi-, 作为一种在分布式系统里面所使用到的那种核心的通信协议机制, 它主要的用途是拿来去实现多个节点彼此之间…

作者头像 李华
网站建设 2026/9/26 4:09:18

Python AES文件加密实战:aes-file-encryption库详解与踩坑指南

1. 为什么要用aes-file-encryption:文件加密的真实需求与选型复盘先说个实际场景。去年我接了个小项目,客户要求把所有导出的业务报表在落盘之前做加密处理,防止运维人员或者第三方外包团队直接从服务器上拷走明文数据。需求本身不复杂&#…

作者头像 李华
网站建设 2026/9/26 4:08:48

国内网站统计工具注册与接入全流程,手把手教你跑通

注册国内统计工具一共五步:注册账号、创建站点、获取代码、部署到网站、验证生效。这篇文章我用456数据、51LA的公开流程为例,把每一步的要点和常见坑都标出来,跟着走一遍就能跑通。说实话,我见过不少网站建了好几年,连…

作者头像 李华
网站建设 2026/9/26 4:08:29

Python agntcy-iomapper 包详解与实战案例

1. 引言agntcy-iomapper 是一个面向 Python 开发者的输入输出映射工具包,专注于在复杂数据处理流程中建立字段之间的映射关系。它通过声明式配置和灵活的转换规则,帮助开发者减少手写数据搬运代码,提升数据管道和接口对接的开发效率。本文将从…

作者头像 李华
网站建设 2026/9/26 4:07:52

GPU服务器租用多人协作实战:Linux目录权限与文件隔离配置

多人共用GPU服务器租用实例时,最常见的故障往往不是显卡性能不足,而是“代码能看不能改”“训练输出属于root”“数据被误删”。尤其在深度学习项目中,数据集、模型权重和日志交叉存放,一次不当的chmod -R 777就可能留下安全隐患。…

作者头像 李华