矿物分类案列 (一)六种方法对数据的填充

目录

矿物数据项目介绍:

数据问题与处理方案:

数据填充策略讨论:

模型选择与任务类型:

模型训练计划:

一.数据集填充

1.读取数据

2.把标签转化为数值

3.把异常数据转化为nan

4.数据Z标准化

5.划分训练集测试集

6.创建一个新的fill_data.py文件,用来存放填充训练数据和填充测试数据的方法

方法①:删除有缺失值的行

方法②:平均值填充处理(测试集用训练集对应的平均值来填充)

方法③:中位数填充处理(测试集用训练集对应的中位数来填充)

方法④:众数填充处理(测试集用训练集对应的众数来填充)

7.调用填充方法,生成各自方法填充后的数据,并保存到各自的excel文件中


矿物数据项目介绍:

数据类型:每行记录矿物微量元素(氯、钠、镁等)及类别(A/B/C/D/E)(注意:发现类别 E 仅有一条数据,无法用于模型训练,所以我们应该删除该数据)

任务目标:构建分类模型,通过微量元素自动识别矿物类型(A/B/C/D)

数据问题与处理方案:

异常值:如“7.97”(应为7.97)、“41.12”(应为41.12)等输入错误,需手动修正。
缺失值填充:
方法A:按类别分组填充(如A类用A类均值/众数/中位数)。
方法B:智能填充(如逻辑回归、随机森林等算法预测缺失值)。
特征工程:特征数量较少(约10个),无需降维。

发现数据中存在隐藏空格(如“思”列),导致NaN检测失败,需手动清理空格干扰。
其他问题:斜杠(如PH值列)、单一类别数据列(如“异”列)需删除或特殊处理。

数据填充策略讨论:

优先填充缺失值最少的列(如F列仅缺3个值),以增加完整数据量,便于后续预测其他列(如K列)。
填充顺序:从缺失少的列到缺失多的列,以提高填充准确性。
强调利用已有数据(包括部分缺失的数据)进行训练,而非仅依赖完全完整的数据。

模型选择与任务类型:

确定当前任务为回归问题(因预测目标Y为连续型数据)。
可用回归模型包括:SVR(SVM变体)、KNN、随机森林、线性回归等。

模型训练计划:

多模型对比:尝试逻辑回归、随机森林、支持向量机、XGBoost等,调参后评估效果(准确率、召回率等)。
步骤:
数据预处理(清洗、填充缺失值)。
分模型训练与调参(交叉验证)。
生成对比表格,选择最优模型。

=========================================================================

下面我们先用四种方法来填充数据分别是删除空白数据行处理,平均值填充处理,中位数填充处理,众数填充处理

一.数据集填充

部分数据如下

1.读取数据

删除仅有一行数据的‘E’类数据,并删除无关列‘序号’

import pandas as pd
data=pd.read_excel('矿物数据.xlsx')
data=data[data['矿物类型']!='E']
data=data.drop('序号',axis=1)
x_whole=data.iloc[:,:-1]
y_whole=data.iloc[:,-1]

2.把标签转化为数值

把矿物类型A,B,C,D类转化成机器可读的数字1,2,3,4

labels_dict={'A':1,'B':2,'C':3,'D':4}
en_labels=[labels_dict[label] for label in data['矿物类型']]
y_whole=pd.Series(en_labels,name='矿物类型')

3.把异常数据转化为nan

用pandas库将可以转化为数字类型的数据转化为数字,不能转化的数据写为nan

# 异常数据转化为nan
for column_name in x_whole.columns:x_whole[column_name]=pd.to_numeric(x_whole[column_name],errors='coerce')

4.数据Z标准化

#对数据Z标准化
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
X_whole_Z=scaler.fit_transform(x_whole)
X_whole_Z=pd.DataFrame(X_whole_Z,columns=x_whole.columns)

5.划分训练集测试集

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(X_whole_Z,y_whole)

6.创建一个新的fill_data.py文件,用来存放填充训练数据和填充测试数据的方法

方法①:删除有缺失值的行

import pandas as pd
#只保留完整数据集
def cca_train_fill(x_train,y_train):data=pd.concat([x_train,y_train],axis=1)data=data.reset_index(drop=True)data=data.dropna()return data.iloc[:,:-1],data.iloc[:,-1]
def cca_test_fill(x_test,y_test):data=pd.concat([x_test,y_test],axis=1)data=data.reset_index(drop=True)data=data.dropna()return data.iloc[:,:-1],data.iloc[:,-1]

方法②:平均值填充处理(测试集用训练集对应的平均值来填充)

由于每一类的平均值都要分开处理所以我们先将每一类分别提取出来

def mean_train_fill(x_train,y_train):data=pd.concat([x_train,y_train],axis=1)data=data.reset_index(drop=True)A=data[data['矿物类型']==1]B=data[data['矿物类型']==2]C=data[data['矿物类型']==3]D=data[data['矿物类型']==4]A=mean_method_train(A)B=mean_method_train(B)C=mean_method_train(C)D=mean_method_train(D)data=pd.concat([A,B,C,D])return data.drop('矿物类型',axis=1),data['矿物类型']
def mean_test_fill(x_train,y_train,x_test,y_test):data_train = pd.concat([x_train, y_train], axis=1)data_train = data_train.reset_index(drop=True)A_train = data_train[data_train['矿物类型'] == 1]B_train = data_train[data_train['矿物类型'] == 2]C_train = data_train[data_train['矿物类型'] == 3]D_train = data_train[data_train['矿物类型'] == 4]data_test = pd.concat([x_test, y_test], axis=1)data_test = data_test.reset_index(drop=True)A_test = data_test[data_test['矿物类型'] == 1]B_test = data_test[data_test['矿物类型'] == 2]C_test = data_test[data_test['矿物类型'] == 3]D_test = data_test[data_test['矿物类型'] == 4]A_test=mean_method_test(A_train,A_test)B_test = mean_method_test(B_train, B_test)C_test = mean_method_test(C_train,C_test)D_test = mean_method_test(D_train, D_test)data = pd.concat([A_test, B_test, C_test, D_test])return data.drop('矿物类型', axis=1), data['矿物类型']def mean_method_train(data):fill_values=data.mean()data=data.fillna(fill_values)return data
def mean_method_test(train_data,test_data):fill_values=train_data.mean()test_data=test_data.fillna(fill_values)return test_data

方法③:中位数填充处理(测试集用训练集对应的中位数来填充)

def median_train_fill(x_train,y_train):data = pd.concat([x_train, y_train], axis=1)data = data.reset_index(drop=True)A = data[data['矿物类型'] == 1]B = data[data['矿物类型'] == 2]C = data[data['矿物类型'] == 3]D = data[data['矿物类型'] == 4]A = median_method_train(A)B = median_method_train(B)C = median_method_train(C)D = median_method_train(D)data = pd.concat([A, B, C, D])return data.drop('矿物类型', axis=1), data['矿物类型']
def median_test_fill(x_train,y_train,x_test,y_test):data_train = pd.concat([x_train, y_train], axis=1)data_train = data_train.reset_index(drop=True)A_train = data_train[data_train['矿物类型'] == 1]B_train = data_train[data_train['矿物类型'] == 2]C_train = data_train[data_train['矿物类型'] == 3]D_train = data_train[data_train['矿物类型'] == 4]data_test = pd.concat([x_test, y_test], axis=1)data_test = data_test.reset_index(drop=True)A_test = data_test[data_test['矿物类型'] == 1]B_test = data_test[data_test['矿物类型'] == 2]C_test = data_test[data_test['矿物类型'] == 3]D_test = data_test[data_test['矿物类型'] == 4]A_test=median_method_test(A_train,A_test)B_test = median_method_test(B_train, B_test)C_test = median_method_test(C_train,C_test)D_test = median_method_test(D_train, D_test)data = pd.concat([A_test, B_test, C_test, D_test])return data.drop('矿物类型', axis=1), data['矿物类型']
def median_method_train(data):fill_values = data.median()data = data.fillna(fill_values)return data
def median_method_test(train_data,test_data):fill_values=train_data.median()test_data=test_data.fillna(fill_values)return test_data

方法④:众数填充处理(测试集用训练集对应的众数来填充)

def mode_train_fill(x_train,y_train):   data = pd.concat([x_train, y_train], axis=1)data = data.reset_index(drop=True)A = data[data['矿物类型'] == 1]B = data[data['矿物类型'] == 2]C = data[data['矿物类型'] == 3]D = data[data['矿物类型'] == 4]A = mode_method_train(A)B = mode_method_train(B)C = mode_method_train(C)D = mode_method_train(D)data = pd.concat([A, B, C, D])return data.drop('矿物类型', axis=1), data['矿物类型']
def mode_test_fill(x_train,y_train,x_test,y_test):data_train = pd.concat([x_train, y_train], axis=1)data_train = data_train.reset_index(drop=True)A_train = data_train[data_train['矿物类型'] == 1]B_train = data_train[data_train['矿物类型'] == 2]C_train = data_train[data_train['矿物类型'] == 3]D_train = data_train[data_train['矿物类型'] == 4]data_test = pd.concat([x_test, y_test], axis=1)data_test = data_test.reset_index(drop=True)A_test = data_test[data_test['矿物类型'] == 1]B_test = data_test[data_test['矿物类型'] == 2]C_test = data_test[data_test['矿物类型'] == 3]D_test = data_test[data_test['矿物类型'] == 4]A_test=mode_method_test(A_train,A_test)B_test = mode_method_test(B_train, B_test)C_test = mode_method_test(C_train,C_test)D_test = mode_method_test(D_train, D_test)data = pd.concat([A_test, B_test, C_test, D_test])return data.drop('矿物类型', axis=1), data['矿物类型']
def mode_method_train(data):fill_values = data.apply(lambda x: x.mode().iloc[0] if len(x.mode())>0 else None)data = data.fillna(fill_values)return data
def mode_method_test(train_data,test_data):fill_values=train_data.apply(lambda x: x.mode().iloc[0] if len(x.mode())>0 else None)test_data=test_data.fillna(fill_values)return test_data

7.调用填充方法,生成各自方法填充后的数据,并保存到各自的excel文件中

由于训练集样本不平衡,我们采用smote过采样来平衡数据

import fill_data
#1.删除空白数据行处理
# x_train_fill,y_train_fill=fill_data.cca_train_fill(x_train,y_train)
# x_test_fill,y_test_fill=fill_data.cca_train_fill(x_test,y_test)
#2.平均值填充处理
# x_train_fill,y_train_fill=fill_data.mean_train_fill(x_train,y_train)
# x_test_fill,y_test_fill=fill_data.mean_test_fill(x_train_fill,y_train_fill,x_test,y_test)
#中位数填充处理
# x_train_fill,y_train_fill=fill_data.median_train_fill(x_train,y_train)
# x_test_fill,y_test_fill=fill_data.median_test_fill(x_train_fill,y_train_fill,x_test,y_test)
# 众数填充处理
x_train_fill,y_train_fill=fill_data.mode_train_fill(x_train,y_train)
x_test_fill,y_test_fill=fill_data.mode_test_fill(x_train_fill,y_train_fill,x_test,y_test)
#smote拟合数据
from imblearn.over_sampling import SMOTE
oversample=SMOTE(k_neighbors=1,random_state=42)#保证数据拟合效果,随机种子
x_train_fill,y_train_fill=oversample.fit_resample(x_train_fill,y_train_fill)#数据存入excel
train_data=pd.concat([y_train_fill,x_train_fill],axis=1)
train_data.to_excel('训练集[众数填充].xlsx',index=False)
test_data=pd.concat([y_test_fill,x_test_fill],axis=1)

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

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

相关文章

vue:vue3的方法torefs和方法toref

在 Vue 3 的 Composition API 中,toRef 和 toRefs 是两个用于处理响应式数据的重要工具,它们专门用于从 reactive() 对象中提取属性并保持响应性。 toRef() 作用:将 reactive 对象的单个属性转换为一个 ref 对象,保持与源属性的响应式连接。 使用场景: 需要单独提取 rea…

Android 移动端 UI 设计:前端常用设计原则总结

在 Android 移动端开发中,优秀的 UI 设计不仅需要视觉上的美观,更需要符合用户习惯、提升操作效率的设计逻辑。前端 UI 设计原则是指导开发者将功能需求转化为优质用户体验的核心准则,这些原则贯穿于布局结构、交互反馈、视觉呈现等各个环节。…

计算机网络 TCP三次握手、四次挥手超详细流程【报文交换、状态变化】

TCP(传输控制协议)是互联网最重要的协议之一,它保证了数据的可靠、有序传输。连接建立时的“三次握手”和连接关闭时的“四次挥手”是其核心机制,涉及特定的报文交换和状态变化。 一、TCP 三次握手(Three-Way Handshak…

使用Applications Manager进行 Apache Solr 监控

Apache Solr 为一些对性能极为敏感的环境提供搜索支持:电子商务、企业应用、内容门户和内部知识系统。因此,当出现延迟增加或结果不一致的情况时,用户会立刻察觉。而当这些问题未被发现时,情况会迅速恶化。 Apache Solr 基于 Apa…

Shell脚本-for循环语法结构

一、前言在 Linux Shell 脚本编程中,for 循环 是最常用的控制结构之一,用于重复执行一段命令,特别适用于处理列表、文件、数字序列等场景。本文将详细介绍 Shell 脚本中 for 循环的各种语法结构,包括:✅ 经典 for in 结…

记SpringBoot3.x + Thymeleaf 项目实现(MVC架构模式)

目录 前言 一、创建SpringBoot项目 1. 创建项目 2. 运行项目 二、连接数据库实现登录 1. pom.xml文件引入依赖包 2. application.yml文件配置 3. 数据持久层,mybatis操作映射 4. Service接口及实现 5. Controller代码 6. Thymeleaf页面登录 7. 运行项目…

Java 导出word 实现表格内插入图表(柱状图、折线图、饼状图)--可编辑数据

表格内插入图表导出效果表格内图表生成流程分析 核心问题与解决方案 问题 Word 图表作为独立对象,容易与文本分离位置难以精确控制,编辑时容易偏移缺乏与表格数据的关联性 解决方案 直接嵌入:将图表嵌入表格单元格,确保数据关联精…

北京JAVA基础面试30天打卡12

1.MySQL中count(*)、count(I)和count(字段名)有什么区别? 1**.COUNT ()**是效率最高的统计方式:COUNT()被优化为常量,直接统计表的所有记录数,不依赖字段内容,开销最低。推荐在统计整个表的记录数时使用。 2.**COUNT(1…

【AI】——结合Ollama、Open WebUI和Docker本地部署可视化AI大语言模型

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

RAG学习(二)

构建索引 一、向量嵌入 向量嵌入(Embedding)是一种将真实世界中复杂、高维的数据对象(如文本、图像、音频、视频等)转换为数学上易于处理的、低维、稠密的连续数值向量的技术。 想象一下,我们将每一个词、每一段话、…

亚马逊店铺绩效巡检_影刀RPA源码解读

一、项目简介 本项目是一个基于RPA开发的店铺绩效巡店机器人。该机器人能够自动化地登录卖家后台,遍历多个店铺和站点,收集并分析各类绩效数据,包括政策合规性、客户服务绩效、配送绩效等关键指标,并将数据整理到Excel报告中&…

跨越南北的养老对话:为培养“银发中国”人才注入新动能

2025年8月16日,北京养老行业协会常务副会长陈楫宝一行到访广州市白云区粤荣职业培训学校,受到颐年集团副总李娜的热情接待。此次访问不仅是京穗两地养老行业的一次深度交流,更为推动全国智慧养老体系建设、提升养老服务专业化水平注入了新动能…

Spring IOC 学习笔记

1. 概述Spring IOC(Inversion of Control,控制反转)是一种设计思想,通过依赖注入(Dependency Injection,DI)实现。它的核心思想是将对象的创建和依赖关系的管理交给Spring容器,从而降…

揭开Android Vulkan渲染封印:帧率暴增的底层指令

ps:本文内容较干,建议收藏后反复边跟进源码边思考设计思想。壹渲染管线的基础架构为什么叫渲染管线?这里是因为整个渲染的过程涉及多道工序,像管道里的流水线一样,一道一道的处理数据的过程,所以使用渲染管…

HTTP 请求转发与重定向详解及其应用(含 Java 示例)

在 Web 开发中,我们经常需要在不同页面之间跳转,比如登录成功后跳到首页、提交表单后跳到结果页面。这时,常见的两种跳转方式就是 请求转发(Request Forward) 和 重定向(Redirect)。虽然它们都能…

如何将 MCP Server (FastMCP) 配置为公网访问(监听 0.0.0.0)

如何将 MCP Server (FastMCP) 配置为公网访问(监听 0.0.0.0)引言常见错误尝试根本原因:从源码解析正确的解决方案总结引言 在使用 Model Context Protocol(MCP) 框架开发自定义工具服务器时,我们经常使用 …

The Network Link Layer: 无线传感器中Delay Tolerant Networks – DTNs 延迟容忍网络

Delay Tolerant Networks – DTNs 延迟容忍网络架构归属Delay Tolerant Networks – DTNs 延迟容忍网络应用实例例子 1:瑞典北部的萨米人 (Saami reindeer herders)例子 2:太平洋中的动物传感网络DTNs路由方式——存储&转发DTNs移动模型Random walk …

计算机视觉(opencv)实战二——图像边界扩展cv2.copyMakeBorder()

OpenCV copyMakeBorder() 图像边界扩展详解与实战在图像处理和计算机视觉中,有时需要在原始图像的四周增加边界(Padding)。这种操作在很多场景中都有应用,比如:卷积神经网络(CNN)中的图像预处理…

ansible管理变量和事实

ansible管理变量和事实与实施任务控制 在 Ansible 中,变量和事实(Facts)就像给剧本(Playbook)配备的 “信息工具箱”,让你的自动化配置管理更灵活、更智能。 变量:提前准备的 “预设信息” 变…

STM32--寄存器与标准库函数--基本定时器

目录 前言 基本定时器概念 定时时间 定时器时钟确定 倍频锁相环被正确配置为168MHz 定时器的库函数操作 代码 定时器的寄存器操作 代码 寄存器 后言 前言 使用平台:STM32F407ZET6 使用数据手册:STM32F407数据手册.pdf 使用参考手册&…