机器学习:逻辑回归--下采样

目录

前言

一、为什么使用下采样

1.例如:

2.导致:

3.办法:

4.结果:

二、代码实现

1.完整代码

2.导入库

3.可视化混淆矩阵

4.导入数据

5数据预处理

6.下采样

7.取出训练集和测试集

8.建立模型

9.进行测试

总结


前言

        下采样(Downsampling)是一种在数据处理中减少样本数量的技术。这种方法通常用于减少数据集的大小,以便进行更高效的计算或处理。下采样可以应用于不同类型的数据,包括信号、图像和分类数据。 

 

一、为什么使用下采样

  • creditcard(点击这里下载文件)
  • 有时我们的标签数据两极分化太严重

1.例如

        标签为0的数据28w条,为1的数据只有400多条

 

2.导致:

        这样训练出来的模型,使用测试集进行测试之后,对不同真实值的数据预测的结果差别很大,那么这个模型也就是一个不可用的模型

 

3.办法:

这时就需要使用下采样方法:

  • 从数据量多的标签数据里随机选择与数据量少的标签数据等量的数据,并组合成小数据集

 

4.结果:

使用下采样训练模型之后,测试集的召回率有了很大提高。

 

 

二、代码实现

1.完整代码

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np# 可视化混淆矩阵
def cm_plot(y, yp):from sklearn.metrics import confusion_matriximport matplotlib.pyplot as pltcm = confusion_matrix(y, yp)plt.matshow(cm, cmap=plt.cm.Blues)plt.colorbar()for x in range(len(cm)):for y in range(len(cm)):plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',verticalalignment='center')plt.ylabel('True label')plt.xlabel('Predicted label')return plt# 导入数据
data = pd.read_csv("creditcard.csv")# 数据标准化: Z标准化
from sklearn.preprocessing import StandardScaler  # 可对多列进行标准化scaler = StandardScaler()
a = data[['Amount']]  # 取出来变成df数据 因为fit_transform()需要传入df数据
data['Amount'] = scaler.fit_transform(a)  # 对Amount列数据进行标准化
data = data.drop(['Time'], axis=1)  # 删除无用列"""下采样"""
positive_eg = data[data['Class'] == 0]
negative_eg = data[data['Class'] == 1]
np.random.seed(seed=22)  # 随机种子
positive_eg = positive_eg.sample(len(negative_eg))  # 从标签为0的样本中随机抽取与标签1数量相同的样本
data_c = pd.concat([positive_eg, negative_eg])  # 拼接数据 成为小数据集plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体
plt.rcParams['axes.unicode_minus'] = False  # 解决符号显示为方块的问题
labels_count = pd.value_counts(data_c['Class'])  # 统计0有多少个数据,1有多个数据
plt.title("正负例样本数")
plt.xlabel("类别")
plt.ylabel("频数")
labels_count.plot(kind='bar')  # 生成一个条形图,展示每个类别的样本数量。
plt.show()# 随机取数据
from sklearn.model_selection import train_test_split# 从小数据集中取出训练集和测试集
x_c = data_c.drop('Class', axis=1)
y_c = data_c.Class
x_c_train, x_c_test, y_c_train, y_c_test = \train_test_split(x_c, y_c, test_size=0.3, random_state=0)  # 随机取数据# 从大数据集里取出训练集和测试集
x_w = data.drop('Class', axis=1)
y_w = data.Class
x_w_train, x_w_test, y_w_train, y_w_test = \train_test_split(x_w, y_w, test_size=0.3, random_state=0)  # 随机取数据# 交叉验证选择较优惩罚因子 λ
from sklearn.model_selection import cross_val_score  # 交叉验证的函数
from sklearn.linear_model import LogisticRegression# k折交叉验证选择C参数   使用小数据集
scores = []
c_param_range = [0.01, 0.1, 1, 10, 100]  # 待选C参数
for i in c_param_range:lr = LogisticRegression(C=i, penalty='l2', solver='lbfgs', max_iter=1000)  # 创建逻辑回归模型  lbfgs 拟牛顿法score = cross_val_score(lr, x_c_train, y_c_train, cv=8, scoring='recall')  # k折交叉验证 比较召回率score_mean = sum(score) / len(score)scores.append(score_mean)# print(score_mean)best_c = c_param_range[np.argmax(scores)]  # 寻找到scores中最大值的对应的C参数
print(f"最优惩罚因子为:{best_c}")# 建立最优模型  使用小数据集训练模型
lr = LogisticRegression(C=best_c, penalty='l2', max_iter=1000)
lr.fit(x_c_train, y_c_train)"""绘制混淆矩阵"""
from sklearn import metrics# 使用小数据集的训练集进行出厂前测试
train_predicted = lr.predict(x_c_train)  # 训练集特征数据x的预测值
# print(metrics.classification_report(y_c_train, train_predicted))  # 传入训练集真实的结果数据 与预测值组成矩阵
# cm_plot(y_train, train_predicted).show()   # 可视化混淆矩阵# 使用小数据集的训练集进行测试
test_predicted = lr.predict(x_c_test)
# print(metrics.classification_report(y_c_test, test_predicted))
# cm_plot(y_test, test_predicted).show()# 使用大数据集进行测试
w_test_predicted = lr.predict(x_w_test)
print(metrics.classification_report(y_w_test, w_test_predicted))# 设置阈值  比较每个阈值的召回率 选出最优阈值  测试模型的阈值 用小数据集的测试集
thresholds = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
recalls = []
for i in thresholds:y_predict_proba = lr.predict_proba(x_w_test)  # 每条数据分类的预测概率y_predict_proba = pd.DataFrame(y_predict_proba)y_predict_proba = y_predict_proba.drop([0], axis=1)  # axis=1 表示删除列而不是行 与下面两行代码联动y_predict_proba[y_predict_proba[[1]] > i] = 1  # 数据大于i即判断为1类 人为设置阈值y_predict_proba[y_predict_proba[[1]] <= i] = 0a = y_predict_proba[y_predict_proba[1] > i]# cm_plot(y_w_test, y_predict_proba[1]).show()recall = metrics.recall_score(y_w_test, y_predict_proba[1])  # 计算召回率recalls.append(recall)print(f"{i} Recall metric in the testing dataset: {recall:.3f}")

 

2.导入库

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

 

3.可视化混淆矩阵

  • 这是通用代码
# 可视化混淆矩阵
def cm_plot(y, yp):from sklearn.metrics import confusion_matriximport matplotlib.pyplot as pltcm = confusion_matrix(y, yp)plt.matshow(cm, cmap=plt.cm.Blues)plt.colorbar()for x in range(len(cm)):for y in range(len(cm)):plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',verticalalignment='center')plt.ylabel('True label')plt.xlabel('Predicted label')return plt

 

4.导入数据

# 导入数据
data = pd.read_csv("creditcard.csv")

 

5数据预处理

  • 对特征数据进行标准化
  • 去除无用数据
# 数据标准化: Z标准化
from sklearn.preprocessing import StandardScaler  # 可对多列进行标准化scaler = StandardScaler()
a = data[['Amount']]  # 取出来变成df数据 因为fit_transform()需要传入df数据
data['Amount'] = scaler.fit_transform(a)  # 对Amount列数据进行标准化
data = data.drop(['Time'], axis=1)  # 删除无用列

 

6.下采样

  • 分别取出各标签的数据
  • 随机种子可以保证每一次取出来的随机数据是固定的
  • 使用sample函数进行下采样操作
  • 拼接数据 组成小数据集
  • 绘制各标签数据条形图
"""下采样"""
positive_eg = data[data['Class'] == 0]
negative_eg = data[data['Class'] == 1]
np.random.seed(seed=22)  # 随机种子
positive_eg = positive_eg.sample(len(negative_eg))  # 从标签为0的样本中随机抽取与标签1数量相同的样本
data_c = pd.concat([positive_eg, negative_eg])  # 拼接数据 成为小数据集plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体
plt.rcParams['axes.unicode_minus'] = False  # 解决符号显示为方块的问题
labels_count = pd.value_counts(data_c['Class'])  # 统计0有多少个数据,1有多个数据
plt.title("正负例样本数")
plt.xlabel("类别")
plt.ylabel("频数")
labels_count.plot(kind='bar')  # 生成一个条形图,展示每个类别的样本数量。
plt.show()

 

7.取出训练集和测试集

  • 分别取出小数据集和大数据集的训练集和测试集
# 随机取数据
from sklearn.model_selection import train_test_split# 从小数据集中取出训练集和测试集
x_c = data_c.drop('Class', axis=1)
y_c = data_c.Class
x_c_train, x_c_test, y_c_train, y_c_test = \train_test_split(x_c, y_c, test_size=0.3, random_state=0)  # 随机取数据# 从大数据集里取出训练集和测试集
x_w = data.drop('Class', axis=1)
y_w = data.Class
x_w_train, x_w_test, y_w_train, y_w_test = \train_test_split(x_w, y_w, test_size=0.3, random_state=0)  # 随机取数据

 

8.建立模型

  • 使用k折交叉验证获取最佳C参数,使用的是小数据集
  • 使用最佳C参数建立逻辑回归模型
# 交叉验证选择较优惩罚因子 λ
from sklearn.model_selection import cross_val_score  # 交叉验证的函数
from sklearn.linear_model import LogisticRegression# k折交叉验证选择C参数   使用小数据集
scores = []
c_param_range = [0.01, 0.1, 1, 10, 100]  # 待选C参数
for i in c_param_range:lr = LogisticRegression(C=i, penalty='l2', solver='lbfgs', max_iter=1000)  # 创建逻辑回归模型  lbfgs 拟牛顿法score = cross_val_score(lr, x_c_train, y_c_train, cv=8, scoring='recall')  # k折交叉验证 比较召回率score_mean = sum(score) / len(score)scores.append(score_mean)# print(score_mean)best_c = c_param_range[np.argmax(scores)]  # 寻找到scores中最大值的对应的C参数
print(f"最优惩罚因子为:{best_c}")

 

9.进行测试

代码:

"""绘制混淆矩阵"""
from sklearn import metrics# 使用小数据集的训练集进行出厂前测试
train_predicted = lr.predict(x_c_train)  # 训练集特征数据x的预测值
# print(metrics.classification_report(y_c_train, train_predicted))  # 传入训练集真实的结果数据 与预测值组成矩阵
# cm_plot(y_train, train_predicted).show()   # 可视化混淆矩阵# 使用小数据集的训练集进行测试
test_predicted = lr.predict(x_c_test)
# print(metrics.classification_report(y_c_test, test_predicted))
# cm_plot(y_test, test_predicted).show()# 使用大数据集进行测试
w_test_predicted = lr.predict(x_w_test)
print(metrics.classification_report(y_w_test, w_test_predicted))

结果:

        显然,测试集的召回率大大提高,且更加平均,模型更加优秀

 

总结

        下采样方法适用于数据集中类别分布极不均衡的情况,能够平衡类别分布,可以减少过拟合的风险,使训练出的模型更加优秀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/405296.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码签名证书:软件安全的守护者

在数字化时代&#xff0c;软件的安全性和用户信任度成为了不可忽视的关键因素。为了确保软件的真实性和完整性&#xff0c;代码签名证书&#xff08;Code Signing Certificate&#xff09;应运而生&#xff0c;成为开发者不可或缺的工具。 什么是代码签名证书&#xff1f; 代…

Vue 3 的 emit 简单使用

在 Vue 3 中使用 emit&#xff0c;子组件可以将事件通知父组件&#xff0c;父组件可以在响应这些事件时执行特定的逻辑。 emit 是一种非常灵活的通信方式&#xff0c;允许组件之间以解耦的方式进行交互。 1. 基本用法 1、使用 defineEmits 子组件 <template><div…

Spring之@Bean注解

1. 使用方式 1.1 Configuration Bean 1.1.1 创建实体类 User Data NoArgsConstructor public class User {private String name;public User(String name) {this.name name;} } 1.1.2 创建配置类 UserConfig Configuration public class UserConfig {Beanpublic User us…

数据结构中的双向链表

1.链表的分类 链表的结构非常多样&#xff0c;以下情况组合起来就是8种&#xff08;2x2x2&#xff09;链表结构&#xff1a; 在带头链表中&#xff0c;除了头结点&#xff0c;其他结点均存储有效的数据。 头结点是占位子的&#xff0c;也叫做“哨兵位”。head结点就是头结点。…

PPT如何添加水印?推荐两种方法!

在PPT演示文稿中添加水印&#xff0c;可以有效地保护版权或在背景上增加品牌标识。本文将介绍两种在PPT中添加水印的方法&#xff0c;帮助你轻松实现这一功能&#xff0c;一起来看看吧&#xff01; 方法一&#xff1a;在单张幻灯片上添加水印 1、选择目标幻灯片 打开PPT文件&…

『深度长文』4种有效提高LLM输出质量的方法!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之路不迷路,2024我们一起变强。 LLM,全…

docker 安装minio并配置https域名访问

一、准备目录 mkdir -p /home/minio/data/home/minio/config/home/minio/config/certs/二、下载域名证书&#xff0c;注意要Apache的 注意.key的换成 private.key&#xff0c;public.crt换成 public.crt&#xff0c;然后将这两个文件放到/home/minio/config/certs/目录下 三、…

贪心算法在背包问题上的运用(Python)

背包问题 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 这就是典型的背包问题(又称为0-1背包问题),也是具体的、没有经过任何延伸的背包问题模型。 背包问题的传统求解方法较为复杂,现定义有一个可以载重为8kg的背…

JNA调用DLL报堆栈溢出错误(0xC00000FD)

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

C++观察者模式Observer

组件协作 –(都是晚绑定的&#xff09; ----观察者模式 为某些对象建立一种通知依赖的关系&#xff0c; 只要这个对象状态发生改变&#xff0c;观察者对象都能得到通知。 但是依赖关系要松耦合&#xff0c;不要太依赖。 eg&#xff1a;做一个文件分割器&#xff0c;需要一个…

React学习笔记(一)——react基础

1. React 介绍 1.1 React是什么 React由Meta公司研发&#xff0c;是一个用于 构建Web和原生交互界面的库 1.2 React的优势 相较于传统基于DOM开发的优势&#xff1a; 组件化的开发方式不错的性能 相较于其它前端框架的优势&#xff1a; 丰富的生态跨平台支持 1.3 React的市场…

基于MATLAB视觉的静态手势识别系统

一、课题介绍及思路 为了丰富手势识别方法的多样性&#xff0c;提高手势识别的正确率&#xff0c;提出了一种基于手势轮廓像素变化的手势识别方法。在Matlab环境下&#xff0c;设计并开发了一个基于视觉的静态手势识别系统。系统主要由两部分组成&#xff1a;手势分割与手势识…

数据科学已死?

既然有了人工智能&#xff0c;训练自己的机器学习模型是否还值得&#xff1f; 既然有了人工智能&#xff0c;学习 Python 是否还值得&#xff1f; 既然有了人工智能&#xff0c;KNIME 还在营业吗&#xff1f; 既然有了人工智能&#xff0c;数据科学是否仍然需要&#xff1f;…

指挥调度平台——数字赋能,让出行更有温度

智慧交通指挥调度平台是基于信息技术和智能化系统的创新解决方案&#xff0c;旨在提升城市交通管理效率、改善交通流畅度、减少拥堵问题&#xff0c;以及增强城市交通运行的智能化水平。该平台整合了大数据分析、实时监测、智能优化算法等技术&#xff0c;为交通管理部门提供全…

牛!6个大模型的核心技术!

大家好&#xff0c;我是花哥。本文我们谈下火爆的大模型背后&#xff0c;有哪些的核心技术&#xff01; 一、Transformer Transformer 是大模型的底层模型。在深度学习的早期阶段&#xff0c;循环神经网络&#xff08;RNN&#xff09;是处理序列数据的常用方法。尽管RNN及其变…

1.XV6环境配置

安装虚拟机 这个就不多说了&#xff0c;搞一台Ubuntu虚拟机即可&#xff0c;最好是通过vscode 用ssh远程连接进行实验会比较方便&#xff0c;具体怎么做可参考我这篇博客&#xff1a; VsCode配置SSH连接远程服务器&#xff08;手把手&#xff0c;学不会打我&#xff09;_vsco…

【GitLab】使用 Docker 安装 GitLab 1:配置 SSH 端口

使用 Docker 安装 GitLab 要求修改ssh端口 GitLab 使用 SSH 通过 SSH 与 Git 交互。默认情况下,GitLab 使用端口22。 要在使用 GitLab Docker 映像时使用其他端口,您可以执行以下操作之一: 更改服务器的 SSH 端口(推荐)。 更改 GitLab Shell SSH 端口。 更改服务器的 SSH …

数据链路层 III(介质访问控制)【★★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 介质访问控制所要完成的主要任务是&#xff1a;为使用介质的每个结点隔离来自同一信道上其他结点所传送的信号&#xff0c;以协调活动结点的传输。 下图所示是广播…

ubuntu安装虚拟环境(tensorflow、torch)

一、安装需求 1、确保ubuntu可以ping通百度 2、设置好了pip镜像源&#xff0c;&#xff08;具体可看&#xff1a;ubuntu配pip的源-CSDN博客&#xff09; 二、安装虚拟环境&#xff08;务必使用sudo进行&#xff09; step1&#xff1a;执行安装命令 更改了pip默认使用pip3的…

基于WonderJourney生成电影级连续的3D场景视频

在本文中,我将详细记录在Windows环境下配置和使用WonderJourney项目的完整流程,包括环境搭建、常见问题的解决方案以及如何修改源码以兼容Windows系统。WonderJourney项目能够生成高度逼真的村庄视频,并允许用户通过配置文件对视频生成过程进行精细化控制。 由于官方文档在…