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

news2024/11/23 17:12:46

目录

前言

一、为什么使用过采样?

二、代码实现

1.完整代码

2.数据预处理

3.进行过采样

4.建立模型

5.绘制混淆矩阵

总结


前言

        过采样(Oversampling)是指在数据处理或机器学习中,增加少数类样本的数量以平衡类别分布。常用于处理类别不平衡问题,通过复制少数类样本或生成新样本来提高模型对少数类的识别能力。

 

一、为什么使用过采样?

  • 当不同类别的数据量不均衡时

 

  • 这会导致某一类别的正确率很低

 

  • 这时可以使用过采样方法:
    • 先分出训练集和测试集
    • 使用过采样方法拟合类别少的数据
    • 使两种类型的数据均衡

 

  • 此时结果不同类别的正确率将会得到提高

 

二、代码实现

1.完整代码

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


# 可视化混淆矩阵
def cm_plot(y, yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt

    cm = 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)  # 删除无用列

# 随机取数据 小数据集
from sklearn.model_selection import train_test_split

x = data.drop('Class', axis=1)
y = data.Class
x_w_train, x_w_test, y_w_train, y_w_test = \
    train_test_split(x, y, test_size=0.2, random_state=0)  # 随机取数据

"""过采样"""
from imblearn.over_sampling import SMOTE

oversampler = SMOTE(random_state=0)  # 随机种子 保证数据拟合效果
x_os, y_os = oversampler.fit_resample(x_w_train, y_w_train)  # 通过原始训练集的特征和标签数据人工拟合一份训练集和标签

# 绘制条形图 查看样本个数
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体
plt.rcParams['axes.unicode_minus'] = False  # 解决符号显示为方块的问题
labels_count = pd.value_counts(y_os)  # 统计0有多少个数据,1有多个数据
plt.title("正负例样本数")
plt.xlabel("类别")
plt.ylabel("频数")
labels_count.plot(kind='bar')  # 生成一个条形图,展示每个类别的样本数量。
plt.show()

x_os_train, x_os_test, y_os_train, y_os_test = \
    train_test_split(x_os, y_os, test_size=0.2, 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_os_train, y_os_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_os_train, y_os_train)

# 绘制混淆矩阵
from sklearn import metrics

x_os_train_predicted = lr.predict(x_os_train)  # 训练集特征数据x的预测值
print(metrics.classification_report(y_os_train, x_os_train_predicted))  # 传入训练集真实的结果数据 与预测值组成矩阵

x_os_test_predicted = lr.predict(x_os_test)  # 训练集特征数据x的预测值
print(metrics.classification_report(y_os_test, x_os_test_predicted))  # 传入训练集真实的结果数据 与预测值组成矩阵

x_w_test_predicted = lr.predict(x_w_test)
print(metrics.classification_report(y_w_test, x_w_test_predicted))

 

2.数据预处理

  • 导入数据
  • 对特征进行标准化
  • 随机取出训练集和测试集
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

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)  # 删除无用列

# 随机取数据 小数据集
from sklearn.model_selection import train_test_split

x = data.drop('Class', axis=1)
y = data.Class
x_w_train, x_w_test, y_w_train, y_w_test = \
    train_test_split(x, y, test_size=0.2, random_state=0)  # 随机取数据

 

3.进行过采样

  • 使用over_sampling 里的SMOTE模块
  • 对训练集数据进行过采样,拟合数据
  • 查看拟合之后的数据集
  • 从该数据集中分出训练集和测试集
"""过采样"""
from imblearn.over_sampling import SMOTE

oversampler = SMOTE(random_state=0)  # 随机种子 保证数据拟合效果
x_os, y_os = oversampler.fit_resample(x_w_train, y_w_train)  # 通过原始训练集的特征和标签数据人工拟合一份训练集和标签

# 绘制条形图 查看样本个数
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体
plt.rcParams['axes.unicode_minus'] = False  # 解决符号显示为方块的问题
labels_count = pd.value_counts(y_os)  # 统计0有多少个数据,1有多个数据
plt.title("正负例样本数")
plt.xlabel("类别")
plt.ylabel("频数")
labels_count.plot(kind='bar')  # 生成一个条形图,展示每个类别的样本数量。
plt.show()

x_os_train, x_os_test, y_os_train, y_os_test = \
    train_test_split(x_os, y_os, test_size=0.2, random_state=0)  # 随机取数据

输出:

 

4.建立模型

  • 使用k折交叉验证法选出最佳的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_os_train, y_os_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_os_train, y_os_train)

输出:

0.9096726221315528
0.9106337846987276
0.9109523409608787
0.9110237415273612
0.9110182489533213
最优惩罚因子为:10

 

5.绘制混淆矩阵

  • 分别使用原始数据里取出来的测试集,拟合数据里取出来的训练集和测试集进行混淆矩阵的绘制
# 绘制混淆矩阵
from sklearn import metrics

x_os_train_predicted = lr.predict(x_os_train)  # 训练集特征数据x的预测值
print(metrics.classification_report(y_os_train, x_os_train_predicted))  # 传入训练集真实的结果数据 与预测值组成矩阵

x_os_test_predicted = lr.predict(x_os_test)  # 训练集特征数据x的预测值
print(metrics.classification_report(y_os_test, x_os_test_predicted))  # 传入训练集真实的结果数据 与预测值组成矩阵

x_w_test_predicted = lr.predict(x_w_test)
print(metrics.classification_report(y_w_test, x_w_test_predicted))

输出:

 precision    recall  f1-score   support

           0       0.92      0.98      0.94    181855
           1       0.97      0.91      0.94    182071

    accuracy                           0.94    363926
   macro avg       0.94      0.94      0.94    363926
weighted avg       0.94      0.94      0.94    363926

              precision    recall  f1-score   support

           0       0.92      0.98      0.95     45599
           1       0.97      0.91      0.94     45383

    accuracy                           0.94     90982
   macro avg       0.95      0.94      0.94     90982
weighted avg       0.94      0.94      0.94     90982

              precision    recall  f1-score   support

           0       1.00      0.98      0.99     56861
           1       0.06      0.94      0.12       101

    accuracy                           0.98     56962
   macro avg       0.53      0.96      0.55     56962
weighted avg       1.00      0.98      0.99     56962

 

总结

        过采样适合不同类别数据不均衡的情况,下采样虽然也适合,但是一般情况下过采样要更加优秀

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JMM 指令重排 volatile happens-before

在单线程程序中,操作系统会通过编译器优化重排序、指令级并行重排序、内存系统重排序三个步骤对源代码进行指令重排,提高代码执行的性能。 但是在多线程情况下,操作系统“盲目” 地进行指令重排可能会导致我们不想看到的问题,如经…

Android Tools | 如何使用Draw.io助力Android开发:从UI设计到流程优化

Android Tools | 如何使用Draw.io助力Android开发:从UI设计到流程优化 1. 引言 在Android开发中,视觉化设计与流程管理至关重要。虽然开发工具如Android Studio强大,但它并不适用于所有设计场景。Draw.io是一款免费的在线绘图工具&#xff…

黑马头条第八天实战(上)

D8 1)登录功能需求说明 用户根据用户名和密码登录密码需要手动加盐验证需要返回用户的token和用户信息 2)模块搭建思路步骤 2.1)模块作用 先捋一下之前搭模块干了啥 feign-api 远程调用 自媒体保存时调用远程客户端进行增加文章&#x…

UE5中使用UTexture2D进行纹理绘制

在UE中有时需要在CPU阶段操作像素,生成纹理贴图等,此时可以通过UTexture2D来进行处理,例子如下: 1.CPP部分 首先创建一个蓝图函数库,将UTexture2D的绘制逻辑封装成单个函数: .h: #include &…

文本转语音工具 ChatTTS 使用教程

文章目录 Part.I IntroductionPart.II 一键安装部署Chap.I 下载Chap.II 使用Chap.III 存在的问题 Part.III 手动部署Chap.I 快速使用Chap.II 开发教程 Reference Part.I Introduction ChatTTS (Chat Text To Speech) 是专门为对话场景设计的文本转语音模型,例如LLM…

arcgisPro添加属性域

1、创建一个面要素,结果如下: 2、在【内容】列表中,选中该要素,点击【数据】选项卡,如下: 3、点击【属性域】按钮,如下: 4、点击【新建域】 5、添加一行属性域,如 6、保存…

【生日视频制作】海底石碑雕刻AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程海底石碑雕刻AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓: 怎么如何做的【生日视频制作】海底石碑雕刻AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 下载AE模板 安装AE软件…

python 注册 Nacos

根据项目需要 将python服务也纳入Nacos 中进行统一管理,所以进行python Nacos 项目适配。 记录本此适配过程。 python 安装不在说明。 系统版本:Linux 5.4.18-87.76-generic KYLINOS SMP Thu Aug 31 09:05:44 UTC 2023 aarch64 aarch64 aarch64 GNU/L…

文心一言 VS 讯飞星火 VS chatgpt (345)-- 算法导论23.2 4题

四、假定图中的边权重全部为整数,且在范围 1 ∼ ∣ V ∣ 1 \sim |V| 1∼∣V∣内。在此种情况下,Kruskal算法最快能多快?如果边的权重取值范围在1到某个常数 W W W之间呢?如果要写代码,请用go语言。 文心一言&#xff…

RPY角的具体描述

目录 一、 RPY角度 二、左乘与右乘 三、xyz固定角和zyx欧拉角旋转矩阵等价 四、参考文献 一、 RPY角度 1.1、X-Y-Z固定角[1] 首先将坐标系{B}和一个已知参考坐标系{A}重合。先将{B}绕旋转γ角,在绕旋转β角,在绕旋转α角,每次旋…

做统计(蓝桥杯初级)

系列文章目录 e,新系列没有目录) 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入输入样例: 2.输出输出样例: 3.代码示例 四、思路总结 前言 今天我们来做《做统计》 一、个人名片 个人主页&…

Flutter-底部选择弹窗(showModalBottomSheet)

前言 现在有个需求,需要用底部弹窗来添加定时的重复。在这里使用原生的showModalBottomSheet来实现 showModalBottomSheet的Props 名称 描述 isScrollControlled全屏还是半屏isDismissible外部是否可以点击,false不可以点击,true可以点击&a…

剪花布条(KPM模板题)

思路&#xff1a;套用KMP模板即可。 #include<bits/stdc.h> using namespace std; #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define endl \n int ne[200005]; int main() {IOSstring a,b;while(cin >> a){if(a"#") break;cin …

LEAN 类型系统属性 之 算法式相等的非传递性(Algorithm equality is not transitive)注解

由于 subsingleton 使用函数&#xff08;eliminator&#xff09; 的存在&#xff0c;导致算法式相等&#xff08;Algorithm defintional equality&#xff09;的非传递性。 在《定义上相等的非确定性&#xff08;Undecidability of Definitional Equality&#xff09;》 中有&…

[基于 Vue CLI 5 + Vue 3 + Ant Design Vue 4 搭建项目] 10 Ant Design Vue 的注册

1.全局全部注册 这样就可以将 ant design vue 全部组件注册进来 2.全局部分注册 这样就是按需注册了 本次&#xff0c; 我们选择第1种方式&#xff0c;全部注册进来 3.注册全局 css 4.测试一下 在 AboutView.vue 中添加一个 Test 按钮 使用 npm run serve 启动服务 访问 A…

如何通过subprocess在数据采集中执行外部命令 —以微博为例

介绍 在现代网络爬虫开发中&#xff0c;爬虫程序常常需要与外部工具或命令交互&#xff0c;以完成一些特定任务。subprocess 是 Python 提供的强大模块&#xff0c;用于启动和管理外部进程&#xff0c;广泛应用于爬虫技术中。本文将探讨如何通过 subprocess 在爬虫中执行外部命…

k8s 常见问题梳理

1、“cni0” already has an IP address different from 10.244.2.1/24 删除网卡 ifconfig cni0 down ip link delete cni0ip link add cni0 type bridge ip link set dev cni0 up ifconfig cni0 10.244.2.1/24 ifconfig cni0 mtu 1450 up

二.Unity中使用虚拟摇杆来控制角色移动

上一篇中我们完成了不借助第三方插件实现手游的虚拟摇杆&#xff0c;现在借助这个虚拟摇杆来实现控制角色的移动。 虚拟摇杆实际上就给角色输出方向&#xff0c;类似于键盘的WSAD&#xff0c;也是一个二维坐标&#xff0c;也就是(-1,1)的范围&#xff0c;将摇杆的方向进行归一化…

Windows与Linux下 SDL2的第一个窗口程序

Windows效果和Linux效果如下&#xff1a; 下面是代码&#xff1a; #include <stdio.h> #include "SDL.h"int main(int argc, char* argv[]) { // 初始化SDL视频子系统if (SDL_Init(SDL_INIT_VIDEO) ! 0){// 如果初始化失败&#xff0c;打印错误信息printf(&…

HPA自动扩缩容和命名空间资源限制

目录 HPA概念 安装HPA的依赖环境 安装metrics-server 手动扩缩容 自动扩缩容 yaml文件 创建HPA 自动扩容 自动缩容 命名空间资源限制 HPA概念 HPA是针对pod的数量进行自动扩缩容。&#xff08;是针对控制器deployment、replicaset、StatefulSet创建的pod&#xff0…