发布时间:2026/8/24 14:36:27
机器学习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/8/24 14:36:27

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

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

2026/8/24 14:36:27

PLL学习记录1

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

2026/8/24 14:31:27

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

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

2026/8/24 16:41:48

拉格朗日乘子法进阶:从影子价格到灵敏性分析的建模实战

1. 从一道真题看拉格朗日乘子的“另一面” 如果你参加过数学建模竞赛,或者接触过运筹学、经济学优化问题,拉格朗日乘子法(Lagrange Multiplier)这个名字你一定不陌生。我们通常用它来求解带等式约束的优化问题:构造拉格…

2026/8/24 16:41:48

Diffusers 内容过滤指南:3 层防线让生成内容不踩雷

Diffusers 内容过滤指南:3 层防线让生成内容不踩雷 【免费下载链接】diffusers 🤗 Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch. 项目地址: https://gitcode.com/GitHub_Trending/di/diffusers …

2026/8/24 16:41:48

Lucas定理与类欧思想:解决大组合数前缀和的高效算法

1. 项目概述:当组合数学遇上数论分块看到这个标题“P4345-[SHOI2015]超能粒子炮改”,很多参加过信息学竞赛的老朋友可能会心一笑。这不仅仅是一道来自省选(SHOI)的题目编号,更是一个将组合数学的经典定理与数论分块思想…

2026/8/24 16:36:47

DBeaver 透视表教程:3 步把查询结果字段汇总成行列报表

DBeaver 透视表教程:3 步把查询结果字段汇总成行列报表 【免费下载链接】dbeaver Free universal database tool and SQL client 项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver 查询结果表动辄几十个字段,"各区域收入合计是多少…

2026/8/24 0:07:22

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 1:12:32

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 8:17:29

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 1:09:25

3条命令跑通LocalAI:无GPU本地AI引擎部署

3条命令跑通LocalAI:无GPU本地AI引擎部署 【免费下载链接】LocalAI LocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required. 项目地址: https://gitcode.com/GitHub_Trending/lo/LocalAI…

2026/8/24 1:09:25

AI推理性能测试怎么做:MLPerf Inference完整上手指南

AI推理性能测试怎么做:MLPerf Inference完整上手指南 【免费下载链接】inference Reference implementations of MLPerf inference benchmarks 项目地址: https://gitcode.com/gh_mirrors/inf/inference 同一个模型换一张卡,速度快多少你知道吗&a…

2026/8/24 13:42:17

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/23 6:14:43

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/23 4:22:01

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…