逻辑回归
分类问题 :预测离散的类别标签,即样本属于哪一个类别。如:垃圾邮件/正常邮件、猫/狗、患病/健康、情感分类(正面/负面/中性)、手势数字识别(0-9)等。
-
核心概念:
- 逻辑回归的本质 :
名为回归的分类算法。通过回归方式来计算概率,然后根据概率阈值进行分类。 - 核心思想 :将线性回归 的输出通过sigmoid函数转化为0到1之间的概率值,然后实现分类功能。
- 判定边界 :逻辑回归输出是样本属于某个类别的概率,通常默认以 0.5 作为阈值。
- 概率 ≥0.5,预测为正类(类别1)。
- 概率 <0.5,预测为负类(类别0)。
- 逻辑回归的本质 :
-
sigmoid激活函数【核心】
函数定义 :
σ(x)=11+e−x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1
-
分界点:σ(0)=0.5
-
单调性:单调递增
-
值域范围:0,1
-
-
评估模型:
方法一 :准确率(Accuracy)
准确率=正确预测数总样本数 准确率 = \frac{正确预测数}{总样本数} 准确率=总样本数正确预测数
方法二 :混淆矩阵
预测值:正类 (1) 预测值:负类 (0) 真实值:正类 (1) 真正例 (TP) 垃圾邮件预测为垃圾邮件 假负例 (FN) 垃圾邮件预测为正常邮件 真实值:负类 (0) 假正例 (FP) 正常邮件预测为垃圾邮件 真负例 (TN) 正常邮件预测为正常邮件 T表示True,F表示False;P表示Positive,N表示Negative
对应代码:confusion_matrix(y_test, predictions)
计算公式:
精确率 (Precision):
精确率 (Precision)=TPTP+FP \text{精确率 (Precision)} = \frac{TP}{TP + FP} 精确率 (Precision)=TP+FPTP
召回率 (Recall):
召回率 (Recall)=TPTP+FN \text{召回率 (Recall)} = \frac{TP}{TP + FN} 召回率 (Recall)=TP+FNTP
F1分数 (F1-Score):综合衡量模型性能
F1=2×Precision×RecallPrecision+Recall F1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1=2×Precision+RecallPrecision×Recall
-
案例一:垃圾邮件分类器
pythonimport jieba from sklearn.feature_extraction.text import CountVectorizer from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from sklearn.metrics import accuracy_score # 1、数据准备 emails = [ # ===== 垃圾邮件 (1) ===== "恭喜中奖!点击领取大奖", "限时优惠!立即购买", "免费领取优惠券,点击链接","您的账户存在异常,请点击验证", "双十一大促,全场五折起", "无门槛抽奖,100%中奖率", "独家福利,仅限今日", "低价代购,加微信详聊", "刷单兼职,日结百元","内部渠道,高额返利", "恭喜您获得一等奖,请点击链接领取", "限时秒杀,全场一折起,快来抢购", "无抵押贷款,极速放款,加微信咨询", "您的信用卡逾期,请点击验证解除冻结", "兼职刷单,每天赚五百,日结工资","免费赠送话费,点击链接立刻到账", "内部渠道,高额返利,稳赚不赔", "海外代购,低价正品,加微信看货", "账户存在安全风险,请登录网址修改密码", "双十二大促,优惠券大放送,立即领取", "您有一笔退税,请点击链接办理","美女荷官在线发牌,点击加入", "免费领取保健品,名额有限", "高薪招聘打字员,在家兼职", "您的快递丢失,我们将进行双倍赔付,请点击链接", "办理大额信用卡,无需审核,快速下卡", "低价出售各类游戏装备,加QQ详聊", "恭喜您成为幸运用户,领取您的奖品", "邀请您加入股票交流群,每天推荐涨停股", "充值返利,充一百返两百","您的手机号被抽中为幸运号码,奖励现金", "零门槛开店,轻松月入过万", "点击链接免费领取100G流量", "您的ETC即将过期,请点击链接重新认证", "全网影视VIP免费送,点击领取", "代办信用卡,包过,额度高","澳门首家线上赌场上线啦", "免费教您炒股,稳赚不亏", "您的账号异地登录,请立即修改密码", "限时抽奖,百分百中奖,快来参与", "低价批发各类名牌服装,加微信", "招聘网络水军,工资日结","您的社保卡异常,请点击完善信息", "免费领取学习资料,仅限前一百名", "投资理财,年化收益百分之二十", "恭喜您,您的店铺已被选中为优质商家", "点击就送,大礼包免费拿", "专业办理各类证件,加微信","您的积分即将清零,请点击兑换礼品", "进群领红包,每天都有", # ===== 正常邮件 (0) ===== "会议时间改到下午3点", "请查收邮件中的项目报告", "项目进度汇报,请查阅附件", "明天早上十点开会,请准时参加", "关于年终总结的通知", "麻烦把昨天会议的纪要发我一下","系统升级通知,请提前保存数据", "你的快递已到菜鸟驿站,请及时取件", "请核对本月的工资单", "下周的团建活动安排", "明天上午九点开部门会议,请准时参加", "请查收附件中的项目进度报告","关于五一放假的通知", "您的快递已放在前台,请及时领取", "请核对本月的工资单,如有问题联系财务", "今天下午三点在会议室接待客户", "系统将于今晚凌晨进行升级维护", "麻烦把昨天的会议纪要发我一下","下周的团建活动定在周五晚上", "请提交您本年度的年终总结", "客户反馈问题已解决,请知悉", "关于报销流程的最新规定", "明天有暴雨,请大家带好雨具", "请安排人员参加明天的培训","您的请假申请已通过审批", "请查收我发给您的合同草案", "项目组周会改到周四下午", "公司体检通知,请合理安排时间", "请将简历发送至人事部邮箱", "服务器维护已完成,服务恢复正常","关于调整作息时间的通知", "请确认下周的出差行程", "这是你要的报表,请查阅", "明天记得带工牌,门禁系统升级", "请各部门提交下季度预算", "您的工位已调整到三楼","关于举办技术分享会的通知", "请查收昨天的会议记录", "同事离职欢送会定在周五下午", "请更新您的个人联系方式", "关于公司年会节目征集的通知", "请在今天下班前回复邮件","您的电脑已修好,请来IT部领取", "关于组织党员学习的通知", "请核对一下考勤记录", "收到,我马上处理", "好的,会议时间没问题", "请尽快提交项目验收材料", "关于食堂菜谱更新的通知", "明天上午十点面试候选人" ] # 1: 垃圾邮件, 0: 正常邮件 y = [1] * 50 + [0] * 50 # 2、文本向量化 # 定义中文分词函数(加入中文分词):把一句话切成词的列表, # 如:"恭喜中奖!点击领取大奖",输出会是 ['恭喜', '中奖', '!', '点击', '领取', '大奖']。 def chinese_tokenizer(text): return jieba.lcut(text) # 使用自定义的分词函数 # tokenizer参数:采用jieba分词函数 # CountVectorizer参数:某个词在邮件里出现了几次 # max_features:限制词汇表的大小,只保留出现频率最高的前1000个词。 vectorizer = CountVectorizer(tokenizer=chinese_tokenizer, max_features=1000) X = vectorizer.fit_transform(emails) # 3、划分训练集和测试集 x_train,x_test,y_train,y_test = train_test_split( X,y,test_size=0.2,random_state=42 ) # 4、模型 model = LogisticRegression() # 5、使用训练数据拟合模型(找到最优参数) model.fit(x_train,y_train) # 6、 评估模型 predictions = model.predict(x_test) # 方式一:分析报告 cm = classification_report(y_test,predictions,target_names=['正常邮件', '垃圾邮件']) print("分析报告:") print(cm) # 方法二:准确率 accuracy = accuracy_score(y_test,predictions) print(f"模型的准确率:{accuracy:.2f}") ----------------------------------------------------------------------- 分析报告: precision recall f1-score support 正常邮件 1.00 0.88 0.93 8 垃圾邮件 0.92 1.00 0.96 12 accuracy 0.95 20 macro avg 0.96 0.94 0.95 20 weighted avg 0.95 0.95 0.95 20 模型的准确率:0.95 -----------------------------------------------------------------------案例二:手写数字识别
pythonfrom sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 数据准备 digits = load_digits() x = digits.data y = digits.target x_train,x_test,y_train,y_test = train_test_split( x,y,test_size=0.2,random_state=42 ) # 数据标准化(均值为0,方差为1,标准的正态分布) from sklearn.preprocessing import StandardScaler scaler = StandardScaler() x_train_scaler = scaler.fit_transform(x_train) x_test_scaler = scaler.transform(x_test) # 模型 # max_iter参数:最大迭代次数,即:让模型多尝试几次 model = LogisticRegression(max_iter=1000) # 训练 model.fit(x_train_scaler,y_train) # 模型评估 predictions = model.predict(x_test_scaler) accuracy = accuracy_score(y_test,predictions) print(f"准确率:{accuracy:.2f}") ---------------------------------------------------------- 准确率:0.97 ----------------------------------------------------------