机器学习8:矿物种类检测——数据预处理

发布时间:2026/10/24 13:32:40

机器学习8:矿物种类检测——数据预处理 前言在机器学习项目中数据预处理往往占据整个工作流70%以上的时间。一个高质量的数据集是模型成功的基础而数据预处理正是构建这个基础的关键环节。本文以一个矿物种类分类任务为例完整展示从原始数据到可用于建模的标准数据集的全流程涵盖数据清洗、缺失值处理、标签编码、数据标准化、类别不平衡处理等核心步骤。一、项目背景1.1 任务目标根据矿物的多种物理/化学特征如密度、硬度、化学成分等预测其所属类别A/B/C/D四类。这是一个典型的多分类问题适用于地质勘探、矿物鉴定等实际应用场景。1.2 原始数据说明数据文件矿物数据.xlsExcel格式特征列多个数值型特征具体列名略标签列矿物类型取值为 A、B、C、D、E存在问题存在异常类别E需删除存在大量缺失值需填充类别分布可能不平衡需过采样数据类型可能不一致需统一二、数据预处理importpandasaspdimportnumpyasnpfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.preprocessingimportLabelEncoderfromimblearn.over_samplingimportSMOTEimportwarnings warnings.filterwarnings(ignore)2.1 读取数据# 读取Excel文件datapd.read_excel(矿物数据.xls)print(f原始数据形状:{data.shape})print(f数据预览:\n{data.head()})print(f列名:{data.columns.tolist()})2.2 删除异常类别原始数据中存在类别 E属于异常数据或噪声数据直接删除# 删除类别为E的行datadata[data[矿物类型]!E]print(f删除异常类别后数据形状:{data.shape})print(f类别分布:\n{data[矿物类型].value_counts()})2.3 检查缺失情况# 统计缺失值null_numdata.isnull()null_totalnull_num.sum()null_percent(null_total/len(data))*100print(f原始数据集总缺失单元格数{null_total.sum()})print(\n各列缺失情况:)forcolindata.columns:ifnull_total[col]0:print(f{col}:{null_total[col]}个缺失 ({null_percent[col]:.2f}%))2.3 特征与标签分离# 剔除序号列无意义和标签列X_wholedata.drop([矿物类型,序号],axis1)y_wholedata[矿物类型]print(f特征矩阵形状:{X_whole.shape})print(f标签向量形状:{y_whole.shape})2.4 标签编码将文字标签 A/B/C/D 转换为数值 0/1/2/3便于模型处理# 方法1使用字典映射label_dict{A:0,B:1,C:2,D:3}encoded_labels[label_dict[label]forlabeliny_whole]y_wholepd.Series(encoded_labels,name矿物类型)# 方法2使用LabelEncoder更通用# from sklearn.preprocessing import LabelEncoder# le LabelEncoder()# y_whole pd.Series(le.fit_transform(y_whole), name矿物类型)print(f编码后标签分布:\n{y_whole.value_counts()})2.5 数据类型统一确保所有特征列为数值类型非数值内容转为 NaN# 统一转换为数值类型forcolumn_nameinX_whole.columns:X_whole[column_name]pd.to_numeric(X_whole[column_name],errorscoerce)2.6 划分训练集与测试集# 划分数据集先划分再填充避免数据泄露x_train,x_test,y_train,y_testtrain_test_split(X_whole,y_whole,test_size0.2,random_state42,stratifyy_whole)print(f训练集形状:{x_train.shape})print(f测试集形状:{x_test.shape})print(f训练集标签分布:\n{y_train.value_counts()})print(f测试集标签分布:\n{y_test.value_counts()})三、缺失值填充核心环节3.1 填充策略说明本项目实现了三种填充策略并以中位数填充作为最终方案填充方法训练集策略测试集策略优点缺点均值填充按类别分组用组内均值填充用训练集同类均值填充简单快速对异常值敏感众数填充按类别分组用组内众数填充用训练集同类众数填充适合分类特征可能不适用于连续特征中位数填充按类别分组用组内中位数填充用训练集同类中位数填充对异常值稳健可能忽略数据分布3.2 中位数填充代码实现训练集填充函数分组中位数defmedian_method(data):按列计算中位数并填充缺失值fill_valuesdata.apply(lambdax:x.median()ifnotx.isna().all()elseNone)returndata.fillna(fill_values)defmedian_train_fill(train_data,train_label):训练集分组中位数填充# 合并特征和标签datapd.concat([train_data,train_label],axis1)# 按类别分组Adata[data[矿物类型]0]Bdata[data[矿物类型]1]Cdata[data[矿物类型]2]Ddata[data[矿物类型]3]# 分别填充Amedian_method(A)Bmedian_method(B)Cmedian_method(C)Dmedian_method(D)# 合并结果df_filledpd.concat([A,B,C,D]).reset_index(dropTrue)# 分离特征和标签returndf_filled.drop(矿物类型,axis1),df_filled[矿物类型]测试集填充函数使用训练集统计量填充defmedian_test_fill(train_data,test_data,train_label,test_label):测试集使用训练集统计量填充# 合并训练集特征和标签train_combinedpd.concat([train_data,train_label],axis1)# 计算每个类别的中位数median_by_class{}forclass_valin[0,1,2,3]:class_datatrain_combined[train_combined[矿物类型]class_val]median_by_class[class_val]class_data.median()# 合并测试集特征和标签test_combinedpd.concat([test_data,test_label],axis1)test_filledtest_combined.copy()# 按类别填充测试集forclass_valin[0,1,2,3]:class_masktest_filled[矿物类型]class_valifclass_mask.any():test_filled.loc[class_mask]test_filled.loc[class_mask].fillna(median_by_class[class_val])# 分离特征和标签returntest_filled.drop(矿物类型,axis1),test_filled[矿物类型]3.3 执行填充# 训练集填充x_train_fill,y_train_fillmedian_train_fill(x_train,y_train)# 测试集填充x_test_fill,y_test_fillmedian_test_fill(x_train,x_test,y_train,y_test)print(f填充后训练集缺失值:{x_train_fill.isnull().sum().sum()})print(f填充后测试集缺失值:{x_test_fill.isnull().sum().sum()})四、数据标准化Z-Score标准化使各特征处于同一量纲避免大数值特征主导模型训练# 创建标准化器scalerStandardScaler()# 训练集fit transformx_train_scaledscaler.fit_transform(x_train_fill)# 测试集只使用训练集的统计量进行transform避免数据泄露x_test_scaledscaler.transform(x_test_fill)# 转换回DataFrame保持列名x_train_scaledpd.DataFrame(x_train_scaled,columnsx_train_fill.columns)x_test_scaledpd.DataFrame(x_test_scaled,columnsx_test_fill.columns)print(标准化后训练集统计:)print(f均值:{x_train_scaled.mean().values[:5]}...)print(f标准差:{x_train_scaled.std().values[:5]}...)五、处理类别不平衡SMOTE过采样使用 SMOTE合成少数类过采样技术对训练集进行平衡处理# 检查过采样前的类别分布print(过采样前训练集类别分布:)print(y_train_fill.value_counts())# 应用SMOTEsmoteSMOTE(random_state42,k_neighbors5)x_train_bal,y_train_balsmote.fit_resample(x_train_scaled,y_train_fill)print(\n过采样后训练集类别分布:)print(y_train_bal.value_counts())print(f过采样后训练集形状:{x_train_bal.shape})# ⚠️ 重要只对训练集进行过采样测试集保持原样print(f测试集保持原样形状:{x_test_scaled.shape})六、导出最终数据集将处理后的数据保存为 Excel 文件便于后续建模使用# 保存特征列名feature_colsx_train_fill.columns.tolist()# 训练集df_trainpd.DataFrame(x_train_bal,columnsfeature_cols)df_train[矿物类型]y_train_bal.reset_index(dropTrue)# 测试集df_testpd.DataFrame(x_test_scaled,columnsfeature_cols)df_test[矿物类型]y_test_fill.reset_index(dropTrue)# 保存到Exceldf_train.to_excel(中位数填充训练集.xlsx,indexFalse)df_test.to_excel(中位数填充测试集.xlsx,indexFalse)print(数据集已保存:)print(f- 训练集: 中位数填充训练集.xlsx ({df_train.shape}))print(f- 测试集: 中位数填充测试集.xlsx ({df_test.shape}))七、fill_data.pyfill_data.py 模块包含的函数函数名功能适用场景cca_train_fill/cca_test_fill删除含缺失值的行完整案例分析缺失值很少时mean_train_fill/mean_test_fill分组均值填充数据分布近似正态mode_train_fill/mode_test_fill分组众数填充分类特征或离散值median_train_fill/median_test_fill分组中位数填充最终方案存在异常值或偏态分布八、总结与思考本项目的关键知识点数据清洗删除异常类别、处理非数值数据缺失值处理分组填充优于全局填充因为不同类别的特征分布可能不同数据泄露防范测试集使用训练集的统计量均值/中位数/众数进行填充标准化时 fit 训练集transform 测试集SMOTE 只应用于训练集类别不平衡SMOTE 能有效提升少数类的识别率
延伸阅读

更多相关文章

2026/10/24 13:32:38

CO₂深部咸水层封存COMSOL仿真模型(含分步操作视频)|可源文件

温馨提示:文末有联系方式 模型简介 本模型基于COMSOL Multhysics平台,精准模拟二氧化碳注入深部咸水层后的运移、溶解、矿化等关键物理化学过程,涵盖达西流、对流-扩散-反应耦合及相变效应,适用于科研验证与工程预评估。 核心功…

2026/10/21 20:03:11

PLL学习记录1

内容主要参考李致毅老师在B站的视频教程,结合自己的理解。最简单的PD是一个XOR,输入信号不同(一个0一个1)时输出1,其他时刻输出0如下图所示,当Vout和REF相位差较大时,PD输出的直流分量较高&…

2026/10/24 11:58:47

一步完成 NCM 转 MP3:ncmdump 免费、零配置、本地搞定

一步完成 NCM 转 MP3:ncmdump 免费、零配置、本地搞定 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump ncmdump 是一个免费开源的小工具,专门把网易云的 NCM 转 MP3:全程本地运行,免安装…

2026/10/24 13:29:12

Fast-LIO算法拆解与GPS融合改进:从IMU预积分到建图鲁棒性提升

简介:这份资源面向具备机器人学、计算机视觉或SLAM基础的研究人员与工程师,聚焦Fast-LIO激光雷达与IMU融合建图算法的原理拆解与源码级改进。内容从数据时间对齐、前向传播与反向传播、KD树建图、观测方程设定到状态优化偏移量逐层展开,并给出…

2026/10/24 13:29:12

智能体网络协议实战:从硬编码到动态协作的架构演进

1. 为什么我们需要重新审视智能体协作的底层逻辑过去大半年,我一直在折腾多智能体系统的落地项目,从最开始的单机多角色模拟,到后来跨服务、跨框架的分布式协作,踩过的坑比写过的代码还多。最让我头疼的不是模型能力不够&#xff…

2026/10/24 13:29:12

国产操作系统Linux 2021:银河麒麟V10白皮书三大硬信号解读

简介:这份《银河麒麟高级服务器操作系统V10产品白皮书》面向国产化替代背景下的运维工程师、系统架构师及信创项目选型人员,用于快速了解该国产服务器操作系统的技术定位与能力边界。白皮书由麒麟软件有限公司于2021年5月发布,基于Linux内核&…

2026/10/24 13:29:12

Thin盘删了不释放?VMFS5空间回收与vMotion迁移实战

简介:面向VMware运维人员的一份精简磁盘空间回收文档,聚焦VMFS5环境下Thin磁盘不会自动释放空间这一常见困扰,适合需要处理存储容量虚高、VMDK占用偏大问题的管理员与虚拟化学习者参考。压缩包内仅1个docx文件,大小约408KB&#x…

2026/10/24 13:24:12

华为OLT配置实战:FTTH、专线与VPLS排障指南

简介:这份华为 OLT 配置手册是华为官方发布的设备配置指南,面向网络管理员、接入网工程师以及备考相关认证的学习者,帮助其理解并配置 OLT 设备,完成高速宽带接入与业务承载。内容围绕专线业务、VPLS、FTTx 三条主线展开&#xff…

2026/10/23 22:56:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/24 0:02:40

MATLAB缩进快捷键与批量格式化实战指南

1. 被自动缩进折磨的那些年如果你写过MATLAB代码,大概率经历过这种场景:从某个文档、网页或者聊天记录里复制了一段代码,粘贴进编辑器之后,每一行前面都带着莫名其妙的空格,有的行首是四个空格,有的是一个T…

2026/10/24 0:02:40

用Poco实现Qt风格信号与槽的跨平台C++方案

简介:本资源是一份面向C中级开发者的技术实践工程,聚焦于在非Qt框架环境下模拟实现Qt核心通信机制——信号与槽,借助Poco网络库的事件系统完成解耦式对象通信。适用于需在跨平台C项目中引入松耦合回调机制、但受限于无法集成Qt依赖的开发场景…

2026/10/24 0:02:40

ESXi裸机虚拟化安装指南:从硬件兼容到虚拟机部署

1. 为什么还要折腾ESXi:从一台闲置机器说起手里攒了几台淘汰下来的迷你主机,配置不算差,i5加16G内存,扔了可惜,装个桌面系统又觉得浪费。这种场景下,ESXi就成了一个绕不开的选择。它是一套裸机虚拟化平台&a…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑