当前位置: 首页 > news >正文

亦菲喊你来学习之机器学习(6)--逻辑回归算法

文章目录

  • 逻辑回归
    • 逻辑回归模型
    • 实现模型
      • 训练模型
      • 测试模型
  • 总结

逻辑回归

逻辑回归(Logistic Regression)是一种广泛使用的统计方法,用于解决分类问题,尤其是二分类问题。尽管名字中有“回归”二字,但它实际上是一种分类算法,因为它试图通过线性回归的方式去预测一个事件的发生概率(即属于某个类别的概率),然后根据设定的阈值(通常是0.5)来分类。

注意哦!逻辑回归其实是分类算法!!!

逻辑回归模型

逻辑回归模型使用逻辑函数(通常是sigmoid函数)将线性回归的预测值转换为概率值。sigmoid函数的公式如下:

在这里插入图片描述

其中,z 是线性回归模型的预测值,即 z=β0+β1x1+β2x2+⋯+βnxn,其中 β0 是截距,β1,β2,…,βn 是回归系数,x1,x2,…,xn 是特征值。

逻辑回归模型的训练过程主要是找到最佳的回归系数(即 β 值),使得模型的预测概率与实际标签之间的差异最小。这通常通过最大化似然函数(在逻辑回归中,常用的是对数似然函数)来实现,也就是最小化负对数似然损失(Negative Log Likelihood Loss, NLL Loss)。

总的来说:就是通过概率来分类。

实现模型

对于实现一个算法模型,我们一般从以下几个方面来完成:

  1. 训练模型
  2. 测试模型

训练模型

  1. 收集数据

链接:训练数据
提取码:0qw2

  1. 数据预处理
import pandas as pd
data = pd.read_csv('creditcard.csv') #读取数据
data = data.drop('Time',axis=1) #去除无关变量from sklearn.preprocessing import StandardScaler #导入归一化方法
scaler = StandardScaler()
#对需要归一化处理的数据归一化,避免权重影响
data['Amount'] = scaler.fit_transform(data[['Amount']])
  1. 绘制图像,查看正负样本个数
import matplotlib.pyplot as plt
from pylab import mpl#字体调整
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False#对样本中每个类别的数量计数,将其可视化,观察数据
lei_count = pd.value_counts(data['Class'])
plt.title('样本数')
plt.xlabel('类别')
plt.ylabel('数量')lei_count.plot(kind = 'bar')
plt.show()
  1. 随机分割数据集与测试集

使用train_test_split方法,在数据中随机抽取数据作为训练集与测试集

x = data.drop(["Class"],axis=1)
y = data.Classfrom sklearn.model_selection import train_test_splittrain_x,test_x,train_y,test_y = \train_test_split(x,y,test_size=0.3,random_state=0)	#test_size表示抽取的的测试集所占的百分比
  1. 交叉验证,选择较优的惩罚因子

在逻辑回归的算法中,逻辑模型的参数中,有一参数为正则化强度C,越小的数值表示越强的正则化。我们要进行调参数,看看哪个惩罚因子最为合适,使模型拟合效果更好:

#交叉验证选择较优的惩罚因子
scores = []
c_param_range = [0.01,0.1,1,10,100] #参数:一般常用的惩罚因子for i in c_param_range:lr = LogisticRegression(C = i,penalty='l2',solver='lbfgs',max_iter=1000)# C表示正则化强度,越小的数值表示越强的正则化。防止过拟合score = cross_val_score(lr,x_train,y_train,cv = 8,scoring='recall')#交叉验证,将模型和数据集传入,对其进行划分,每份轮流作为测试集来测试模型。返回一个列表对象score_mean = sum(score)/len(score)scores.append(score_mean)
beat_c = c_param_range[np.argmax(scores)] #argmax取出最大值的索引位置
  1. 训练模型
lr = LogisticRegression(C = beat_c,penalty='l2',max_iter=1000)
lr.fit(x_train,y_train) #训练模型

测试模型

  1. 先用训练数据再次进入模型测试,查看他本身的模型训练效果怎么样:
from sklearn import metricstrain_predicted = lr.predict(x_train)
print(metrics.classification_report(y_train,train_predicted)) #绘制混淆矩阵,查看测试参数
---------------------------------------------------------------precision    recall  f1-score   support0       1.00      1.00      1.00    1990191       0.88      0.62      0.73       345accuracy                           1.00    199364macro avg       0.94      0.81      0.86    199364
weighted avg       1.00      1.00      1.00    199364
  1. 再用分割的测试集来测试模型:
test_predicted = lr.predict(x_test)
print(metrics.classification_report(y_test,test_predicted))
----------------------------------------------precision    recall  f1-score   support0       1.00      1.00      1.00     852961       0.88      0.62      0.73       147accuracy                           1.00     85443macro avg       0.94      0.81      0.86     85443
weighted avg       1.00      1.00      1.00     85443

到这为止我们的模型就训练好啦,但是!!通过混淆矩阵我们可以发现,模型对类别为1的召回率只有0.62,这是比较差的,是什么原因导致的呢?

其实,在训练模型时第三步查看样本个数时,我们通过图片可以发现样本数量极度不均衡,致使训练时,类别1的数据训练不够,拟合欠缺,那么我们该如何处理呢?

处理方法有过采样(扩充样本数量)和下采样(数量多的将数据量向数量少的类别数量靠近),可以解决这个问题!我们下篇来介绍。

总结

本篇介绍了:

  1. 什么是逻辑回归:逻辑回归其实是分类算法!!!
  2. 逻辑回归算法如何分类:计算每个数据的属于哪个类别的概率,判断属于哪个类。(默认阈值0.5为分界线)
  3. 训练模型:
    1. 使用train_test_split方法,在数据中随机抽取数据作为训练集与测试集,使测试更有说服力。
    2. 交叉验证,选择较优的惩罚因子

相关文章:

  • 【Python】动态类型、输入和输出、条件语句
  • YSLOW(一款实用的网站性能检测工具)
  • PHPStorm如何使用Phalcon框架的依赖
  • C++策略模式Strategy
  • 【BUG】误删docker内启动文件/opt/nvidia/nvidia_entrypoint.sh
  • 稳定、耐用、美观 一探究竟六角头螺钉螺栓如何选择
  • haproxy实验
  • XSS-Jquery.html()+DOM破坏
  • 安全基础学习-SM4加密算法
  • MySQL 单机和集群环境部署教程
  • RK3588 EC200A-CN【4G模块】调试
  • 【大模型从入门到精通33】开源库框架LangChain RAG 系统中的问答技术3
  • 解决前端访问IIS服务器发生跨域请求报错的方法
  • Mac移动硬盘选什么格式最好 Mac怎么用ntfs移动硬盘
  • 数据恢复新宠儿:2024年新兴软件趋势与亮点解析
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • HTTP中的ETag在移动客户端的应用
  • Java 内存分配及垃圾回收机制初探
  • node.js
  • Vue ES6 Jade Scss Webpack Gulp
  • win10下安装mysql5.7
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 让你的分享飞起来——极光推出社会化分享组件
  • 王永庆:技术创新改变教育未来
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • linux 淘宝开源监控工具tsar
  • ​数据链路层——流量控制可靠传输机制 ​
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (三)elasticsearch 源码之启动流程分析
  • (四)js前端开发中设计模式之工厂方法模式
  • (一)插入排序
  • (轉貼) UML中文FAQ (OO) (UML)
  • ../depcomp: line 571: exec: g++: not found
  • .net framework profiles /.net framework 配置
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET文档生成工具ADB使用图文教程
  • @ModelAttribute 注解
  • [ SNOI 2013 ] Quare
  • [ 数据结构 - C++] AVL树原理及实现
  • [1] 平面(Plane)图形的生成算法
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [BJDCTF2020]EzPHP1
  • [C++进阶]map和set的相关题目
  • [element-ui] el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案
  • [flutter]一键将YAPI生成的api.json文件转为需要的Dart Model类的脚本
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式
  • [JavaWeb玩耍日记]Maven的安装与使用
  • [JavaWeb学习] Spring Ioc和DI概念思想