机器学习之逻辑回归

逻辑回归

分类问题 :预测离散的类别标签,即样本属于哪一个类别。如:垃圾邮件/正常邮件、猫/狗、患病/健康、情感分类(正面/负面/中性)、手势数字识别(0-9)等。

  1. 核心概念:

    • 逻辑回归的本质 :名为回归的分类算法。通过回归方式来计算概率,然后根据概率阈值进行分类。
    • 核心思想 :将线性回归 的输出通过sigmoid函数转化为0到1之间的概率值,然后实现分类功能。
    • 判定边界 :逻辑回归输出是样本属于某个类别的概率,通常默认以 0.5 作为阈值。
      • 概率 ≥0.5,预测为正类(类别1)。
      • 概率 <0.5,预测为负类(类别0)。
  2. sigmoid激活函数【核心】

    函数定义 :

    σ(x)=11+e−x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1

    • 分界点:σ(0)=0.5

    • 单调性:单调递增

    • 值域范围:0,1

  3. 评估模型:

    方法一 :准确率(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

  4. 案例一:垃圾邮件分类器

    python 复制代码
    import 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
    -----------------------------------------------------------------------

    案例二:手写数字识别

    python 复制代码
    from 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
    ----------------------------------------------------------
相关推荐
张彦峰ZYF2 小时前
越过边界之前:Reward Seeker 实验如何改写智能体安全的时间逻辑
人工智能·ai agent·anthropic·智能体安全·reward seeker·“控制评价过程”泛化跨领域策略·envbom
拓恒技术2 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
罗西的思考5 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
字节跳动视频云技术团队5 小时前
720P 直升 8K,解密 2026 抖音美好奇妙夜巨幕超分黑科技
人工智能·音视频开发
打工仔折腾 AI5 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
特别关注外国供应商5 小时前
Qualys TotalAI:AI 安全治理的四大支柱
ai·大模型安全·ai数据安全·qualys·ai安全治理·ai saas 治理·ai代码安全
逐米时代6 小时前
从试点验证到协同深化:制造业AI转型三年路线图设计方法
人工智能
GlobalInfo6 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
stormzhangV6 小时前
AI 越强,失业越严重
人工智能·aigc
夏文强7 小时前
Rerank 与混合检索:怎么让 RAG 从「能用」变成「好用」
人工智能·大模型·向量数据库·rag·检索增强生成