田路分离数据的

news2024/11/14 14:47:11

        因为农机大部分时间是在田地工作,所以大多数农机轨迹样本存在数据分布不平衡的问题,既田地数据多,道路数据少。因为用于分类的大多数机器学习算法都是围绕每个类别的样本数量均相等的假设来设计的。这导致模型的预测性能较差,特别是针对样本较少类别的预测。针对这一情况,采用过采样加欠采样的方法对数据进行增强、扩充,得到平衡的数据集。

SafeLevelSMOTE

        SafeLevelSMOTE 是一种改进的 Synthetic Minority Over-sampling Technique(SMOTE)算法,用于处理类不平衡问题。在传统的 SMOTE 算法中,生成的合成样本可能位于决策边界附近,导致模型学习到噪声数据。而 SafeLevelSMOTE 引入了 Safe-Level 概念,规定了生成合成样本的安全级别,从而确保生成的合成样本不会引入噪声,同时提高了生成样本的质量,可以更好地应对类不平衡导致的样本较少的情况下训练模型的问题。

class SafeLevelSMOTE(SMOTE):
    def __init__(self, sampling_strategy='auto', k_neighbors=5, m_neighbors=10, n_jobs=1):
        super(SafeLevelSMOTE, self).__init__(sampling_strategy=sampling_strategy, k_neighbors=k_neighbors,
                                             n_jobs=n_jobs)
        self.m_neighbors = m_neighbors

    def _make_samples(self, X, y_dtype, y_type, nn_data, nn_num, k, step, **params):
        nns = NearestNeighbors(n_neighbors=self.k_neighbors + 1, n_jobs=self.n_jobs)
        nns.fit(nn_data)
        knn = nns.kneighbors(nn_data, return_distance=False)[:, 1:]
        safe_level = np.array([self._safe_level(i, knn) for i in range(nn_data.shape[0])])
        safe_level = np.maximum(safe_level, 0.5)
        return super(SafeLevelSMOTE, self)._make_samples(X, y_dtype, y_type, nn_data, nn_num, k, step, **params)

    def _safe_level(self, i, knn):
        return (1.0 / (1.0 + np.sum(knn[i] < self.m_neighbors)))

# 使用 SafeLevelSMOTE 进行过采样
safesmote = SafeLevelSMOTE(sampling_strategy='auto', k_neighbors=5, m_neighbors=10)
X_resampled, y_resampled = safesmote.fit_resample(X_train, y_train)

NearMiss

        NearMiss-1 是针对处理类不平衡数据集的一种欠采样方法。在 NearMiss-1 中,算法会选择离少数类样本最近的多数类样本进行移除,来达到平衡数据集的目的。NearMiss-1 通过选择离少数类样本最近的多数类样本进行移除, 可以有效地减少数据集的规模,避免过拟合,并提高对少数类的捕捉能力。

from imblearn.under_sampling import NearMiss


undersample = NearMiss(version=1, n_neighbors=3)
X_NearMiss, y_NearMiss= undersample.fit_resample(X_resampled, y_resampled)

先进行过采样,然后进行欠采样,可以有效的提高少目标的数量,达到平衡数据集的作用。

原始图像:

原始数据 =  Counter({1: 19450, 0: 3131})

过采样

最终效果

处理完的数据 =  Counter({0: 19450, 1: 19450})

处理完的数据,效果还可以。

完整代码 

# -*- coding: utf-8 -*-
import numpy as np
from imblearn.over_sampling import BorderlineSMOTE, ADASYN, SMOTE
import pandas as pd
from imblearn.under_sampling import NearMiss
from matplotlib import pyplot as plt
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from collections import Counter
from datetime import datetime
import os

# 原始数据文件夹路径
input_folder = r'D:\GAN-316\1-60csv'
# 目标文件夹路径
output_folder = r'D:\GAN-316\111111111111111111111111111111111111111111111111111'
# 检查目标文件夹是否存在,如果不存在则创建
if not os.path.exists(output_folder):
    os.makedirs(output_folder)
    print(f"目标文件夹 {output_folder} 不存在,已创建")

# 遍历原始数据文件夹中的所有文件
for file_name in os.listdir(input_folder):
    if file_name.endswith('.csv'):
        file_path = os.path.join(input_folder, file_name)

        # 加载数据
        data = pd.read_csv(file_path,encoding='gbk')
        data['time'] = pd.to_datetime(data['time'])
        data['time_seconds'] = (data['time'] - datetime(1970, 1, 1)).dt.total_seconds()


        # 2. 数据预处理
        # 假设特征列为 '经度', '纬度', '速度', '方向',目标列为 '标签'
        # X = data[['经度', '纬度', '速度', '方向', 'time_seconds']]
        # if '标记' in data.columns:
        #     y = data['标记']
        # elif '标签' in data.columns:
        #     y = data['标签']
        # else:
        #     print("未找到标记列或标签列")



        X = data[['longitude', 'latitude', 'speed', 'dir','time_seconds']]
        y = data['tags']

        X_train = X
        y_train = y
        y_counts = Counter(y)
        print("原始数据 = ", y_counts)
        print("min(y_counts) = ", min(y_counts))
        if len(y_counts) == 1:
            print(f"文件 {file_name} 中只包含一个类别,跳过处理")
            continue
        if min(y_counts.values()) < 20:
            continue

        #原始数据可视化
        xx = data['longitude']
        yy = data['latitude']
        # 根据标签设置颜色
        colors = ['green' if label == 1 else 'red' for label in y]
        # 创建散点图
        plt.scatter(xx, yy, c=colors, s=1)
        plt.xlabel('x-axis label')
        plt.ylabel('y-axis label')
        plt.title('original')
        plt.show()



        class SafeLevelSMOTE(SMOTE):
            def __init__(self, sampling_strategy='auto', k_neighbors=5, m_neighbors=10, n_jobs=1):
                super(SafeLevelSMOTE, self).__init__(sampling_strategy=sampling_strategy, k_neighbors=k_neighbors,
                                                     n_jobs=n_jobs)
                self.m_neighbors = m_neighbors

            def _make_samples(self, X, y_dtype, y_type, nn_data, nn_num, k, step, **params):
                nns = NearestNeighbors(n_neighbors=self.k_neighbors + 1, n_jobs=self.n_jobs)
                nns.fit(nn_data)
                knn = nns.kneighbors(nn_data, return_distance=False)[:, 1:]
                safe_level = np.array([self._safe_level(i, knn) for i in range(nn_data.shape[0])])
                safe_level = np.maximum(safe_level, 0.5)
                return super(SafeLevelSMOTE, self)._make_samples(X, y_dtype, y_type, nn_data, nn_num, k, step, **params)

            def _safe_level(self, i, knn):
                return (1.0 / (1.0 + np.sum(knn[i] < self.m_neighbors)))

        # 使用 SafeLevelSMOTE 进行过采样
        safesmote = SafeLevelSMOTE(sampling_strategy='auto', k_neighbors=5, m_neighbors=10)
        X_resampled, y_resampled = safesmote.fit_resample(X_train, y_train)

        xxx = X_resampled['longitude']
        yyy = X_resampled['latitude']
        # 根据标签设置颜色
        colors = ['green' if label == 1 else 'red' for label in y_resampled]
        # 创建散点图
        plt.scatter(xxx, yyy, c=colors, s=1)
        plt.xlabel('x-axis label')
        plt.ylabel('y-axis label')
        plt.title('SafeLevelSMOTE')
        plt.show()



        # 使用 NearMiss 进行欠采样
        undersample = NearMiss(version=1, n_neighbors=3)
        X_NearMiss, y_NearMiss= undersample.fit_resample(X_resampled, y_resampled)



        # #如果X_NearMiss的列名为[经度,纬度,速度,方向,时间] 就把他改为 ['longitude', 'latitude', 'speed', 'dir','time_seconds']
        # original_column_names = ['经度', '纬度', '速度', '方向' ]
        # new_column_names = ['longitude', 'latitude', 'speed', 'dir']
        # #检查原始列名是否与指定的列名相匹配,然后进行重命名
        # if all(elem in X_NearMiss.columns for elem in original_column_names):
        #     X_NearMiss.rename(columns=dict(zip(original_column_names, new_column_names)), inplace=True)
        #     print("列名已成功更改。")
        # else:
        #     print("原始列名与指定列名不匹配,无法进行重命名。")


        # 将时间秒数转换为 DateTime 格式并赋值给新的 'time' 列
        X_NearMiss['time'] = pd.to_datetime(datetime(1970, 1, 1) + pd.to_timedelta(X_NearMiss['time_seconds'], unit='s'))
        X_NearMiss['time'] = X_NearMiss['time'].dt.floor('S')

        # 删除原始的 'time_seconds' 列
        X_NearMiss.drop(['time_seconds'], axis=1, inplace=True)
        df_labels = pd.DataFrame({'tags': y_NearMiss})
        # 重置特征数据和标签数据的索引
        X_NearMiss.reset_index(drop=True, inplace=True)
        df_labels.reset_index(drop=True, inplace=True)



        # 转换之后可视化
        x = X_NearMiss['longitude']
        y = X_NearMiss['latitude']
        # 根据标签设置颜色
        colors = ['green' if label == 1 else 'red' for label in y_NearMiss]
        # 创建散点图
        plt.scatter(x, y, c=colors, s=1)
        plt.xlabel('x-axis label')
        plt.ylabel('y-axis label')
        plt.title("final")
        plt.show()

        # 合并特征和标签数据
        data_combined = pd.concat([X_NearMiss, df_labels], axis=1)
        print("Combined Data:")
        print(data_combined)

        # 6.统计 y_train_resampled 中每个元素的数量
        y_train_resampled_counts = Counter(y_NearMiss)
        print("处理完的数据 = ", y_train_resampled_counts)
        output_file_path = os.path.join(output_folder, f'processed_{file_name}')
        data_combined.to_csv(output_file_path, index=False,encoding='gbk')
        print(f'文件 {file_name} 处理完毕,并保存到 {output_file_path}')

print('所有文件处理完成!')


        # x = X_NearMiss['longitude']
        # y = X_NearMiss['latitude']
        #
        # # 根据标签设置颜色
        # colors = ['green' if label == 1 else 'red' for label in y_NearMiss]
        #
        # # 创建散点图
        # plt.scatter(x, y, c=colors, s=1)
        # plt.xlabel('x-axis label')
        # plt.ylabel('y-axis label')
        # plt.title(123)
        # plt.show()

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

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

相关文章

Angular进阶之八: Angular Animation在项目中的实践经验

使用 Angular 进行项目开发的程序员应该都很熟悉 Angular Animation。这是一个 Angular 原生的动画库&#xff0c;它可以替代或者辅助完成原本需要使用 css 的动画功能。 Angular 在国内的运用是很有限的&#xff0c;可借鉴的文档并不很丰富。尤其对于 Angular 动画模块的应用…

[数据结构]堆

一、堆是什么&#xff1f; 堆是一种完全二叉树 完全二叉树的定义&#xff1a;完全二叉树的形式是指除了最后一层之外&#xff0c;其他所有层的结点都是满的&#xff0c;而最后一层的所有结点都靠左边。​​​​​​&#xff0c;从左到右连续。 教材上定义如下: 若设二叉树的…

纹波和噪声有啥区别(一)

首先要知道的是他们都是在电源输出中出现的信号波动&#xff0c;但两者存在明显的区别。 一&#xff0c;纹波的产生 电源纹波是指电源输出时&#xff0c;叠加在稳定的直流电源上的交流成分。 这种波动主要是由于电源自身的开关、PWM 调节等因素引起的&#xff0c;其频率一般…

Javaweb的学习21_CSS_属性

CSS的属性 (常用)属性&#xff1a; 1. 字体、文本 font-size&#xff1a;字体大小 color&#xff1a;文本颜色 text-align&#xff1a;文本的对齐方式 line-height&#xff1a;行高 2. 背景 background&#xff1a;是个复合属性 3. 边框 border&#xff1a;设置边框&#xff0c…

1升级powershell后才能安装WSL2--最后安装linux--Ubuntu 22.04.3 LTS

视频 https://www.bilibili.com/video/BV1uH4y1W7UX查看电脑本版 步骤1:使用 Winget 方式安装 PowerShell 查看是否能更新PowerShell– winget search Microsoft.PowerShell查看结果为 名称 ID 版本 源 ----------------------------…

HTML小游戏27 - Chuck Chicken 魔法蛋网页游戏(附完整源码)

&#x1f482; 网站推荐:【神级源码资源网】【摸鱼小游戏】 【工具大全】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;【轻量化工具创作平台】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【学习交流群】 本节教程我会带大家使用 HTML 、…

【Kafka系列】Kafka事务一般在什么场景下使用呢

面试官&#xff1a;听说你精通Kafka&#xff0c;那我就考考你吧 面试官&#xff1a;不用慌尽管说&#xff0c;错了也没关系&#x1f60a;。。。 以【面试官面试】的形式来分享技术&#xff0c;本期是《Kafka系列》&#xff0c;感兴趣就关注我吧❤️ 面试官&#xff1a;生产者重…

G1和ZGC垃圾回收器学习

前言 ​ 随着JDK17的占有率不断升高和SpringBoot3最低支持JDk17&#xff0c;JDK17很大概率会成为大家后续升级的一个选择&#xff0c;而JDK17上最重要的垃圾回收器G1和ZGC&#xff0c;也就显得格外重要。大家提前了解或者学习一下肯定是有用的。 ​ 本篇文章也默认大家了解一…

【linux】进程地址空间(进程三)

目录 快速了解&#xff1a;引入最基本的理解&#xff1a;细节&#xff1a;如何理解地址空间&#xff1a;a.什么是划分区域&#xff1a;b.地址空间的理解&#xff1a; 为什么要有进程空间&#xff1f;进一步理解页表与写时拷贝&#xff1a; 快速了解&#xff1a; 先来看这样一段…

docker入门(九)—— docker网络详细介绍

docker 网络 准备工作&#xff1a;清空所有镜像和容器 docker rm -f $(docker ps -aq) docker rmi -f $(docker images -aq)docker0 网络 查看本地网络 ip addr[rootiZbp15293q8kgzhur7n6kvZ /]# ip addr# 本地回环网络 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc…

jmeter接口导入方式

curl直接导入 1、操作页面后&#xff0c;F12查看接口&#xff0c;右击接口-copy-copy as cURL 2、jmeter 工具-import from cURL&#xff0c;粘贴上面复制的curl 根据接口文档导入 1、接口文档示例如下&#xff1a; Path&#xff1a; /api/jobs/xps/exec Method&#xf…

3d画线生成模型之后最大化找不到---模大狮模型网

当你在3D建模软件中画线生成模型后&#xff0c;如果最大化找不到该模型&#xff0c;可能是因为以下几种情况导致&#xff1a; 模型位置偏移&#xff1a; 可能你在绘制线条时&#xff0c;将模型画在了视图界面之外&#xff0c;导致最大化时无法看到。尝试平移或旋转模型&#x…

东方博宜 1449. 求满足条件的数的和

东方博宜 1449. 求满足条件的数的和 这道题我苦想了很久&#xff0c;觉得2个及2个以上很难解决&#xff0c;但是后面发现&#xff0c;可以用一个变量记录次数&#xff0c;次数大于等于2就好了。 #include<iostream> using namespace std; int main() {int n ;cin >…

企业用大模型如何更具「效价比」?百度智能云发布5款大模型新品

服务8万企业用户&#xff0c;累计帮助用户精调1.3万个大模型&#xff0c;帮助用户开发出16万个大模型应用&#xff0c;自2023年12月以来百度智能云千帆大模型平台API日调用量环比增长97%...从一年前国内大模型平台的“开路先锋”到如今的大模型“超级工厂”&#xff0c;百度智能…

革新水库大坝监测:传统软件与云平台之比较

在水库大坝的监测管理领域&#xff0c;传统监测软件虽然曾发挥了重要作用&#xff0c;但在多方面显示出了其局限性。传统解决方案通常伴随着高昂的运维成本&#xff0c;需要大量的硬件支持和人员维护&#xff0c;且软件整合和升级困难&#xff0c;限制了其灵活性和扩展性。 点击…

类对象的初始化过程与方法

类初始化过程与方法 一、类对象的初始化过程 1.初始化的过程 &#xff08;1&#xff09;对象在实例化的时候需要调用构造函数&#xff0c;如果对应的构造函数调用不了&#xff0c;这个对象是没有办法实例化的。 &#xff08;2&#xff09;构造函数的执行&#xff0c;是在内…

好看的表情壁纸

不定时更新表情壁纸&#xff0c;后期支持头像&#xff0c;wx背景等&#xff0c;个人开发&#xff0c;觉得不错&#xff0c;可前往小程序或者公众号查看

深入理解模板进阶:掌握C++模板的高级技巧

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

基于springboot的员工绩效考核管理系统(含源文件)

&#xff08;源码附文章底部&#xff09; 摘 要 科学时代的发展改变了人类的生活&#xff0c;促使网络与计算机技术深入人类的各个角落&#xff0c;得以普及到人类的具体生活中&#xff0c;为人类的时代文明掀开新的篇章。本系统为月度员工绩效考核管理系统&#xff0c;是专为…

JAVA入门第一步2.0

一、JAVA中的关键字 Java中的关键字是Java编程语言中预先定义并保留的单词&#xff0c;它们具有特殊的含义&#xff0c;不能用作变量名、方法名或类名等标识符。以下是我查到的Java中的一些主要关键字&#xff1a; 由于我还在入门&#xff0c;所以所接触的关键字不多&#xf…