机器学习之逻辑回归

逻辑回归

分类问题 :预测离散的类别标签,即样本属于哪一个类别。如:垃圾邮件/正常邮件、猫/狗、患病/健康、情感分类(正面/负面/中性)、手势数字识别(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
    ----------------------------------------------------------
相关推荐
二川bro1 小时前
Firecracker
人工智能
秦先生在广东1 小时前
解构 gstack:如何以 23 个 AI 角色重塑全栈开发工作流
人工智能
释厄6231 小时前
学术引用本体论——WorkBuddy 学术科学文化三违反
网络·人工智能·算法
一隅论数智1 小时前
RDF(Resource Description Framework)介绍和使用举例(二)
大数据·人工智能·经验分享·笔记·学习·架构·政务
ccstuck1 小时前
AI安全系列:开源RAG系统测试
人工智能·安全·开源·ai安全
视+老张1 小时前
AI导游怎样把一次问答转成可执行路线:地点实体与任务状态设计
人工智能·ar·增强现实
IT_陈寒2 小时前
SpringBoot自动配置的坑:你以为的捷径可能是弯路
前端·人工智能·后端
xsd202411182 小时前
Open-Magiviz:解决AI长视频角色不一致与画面跳跃
人工智能
XMAIPC_Robot2 小时前
RK3576/RK3588+FPGA+AI数据采集系统:实时性与边缘AI算力兼顾
人工智能·fpga开发·机器人·数据采集·rk3588+fpga·rk3576+fpga