news 2026/8/16 22:01:39

【RustyML入门】4.0. 数据预处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【RustyML入门】4.0. 数据预处理

4. 数据预处理

原始数据几乎从不以模型想要的形态出现。特征列的量纲可能天差地别。类别标签可能是字符串,也可能是不连续的整数。而且,在拟合任何模型之前,你还需要一份真正独立的留出集。本章介绍rustyml::utils里的预处理工具:划分、标准化、归一化和标签编码。它们都藏在utilsfeature 之后,直接操作你的模型本来就要吃的 ndarray 数组。

如果你从 scikit-learn 过来,先记住这个模块的形状。它大部分是普通函数,而不是带状态的fit/transform估计器。每次调用只根据传进去的那个数组计算统计量,再返回一个全新的数组。例外是那几个 scaler:StandardScalerMinMaxScalerMaxAbsScalerRobustScalerNormalizer。它们确实把fit/transform契约带过了训练/测试的边界。每一个都会存下从训练矩阵学到的东西,好让之后的每一批数据都走同一个映射。不管走哪条路,顺序的纪律都归你。先划分数据,再拟合缩放。这样一来,从测试行推出来的任何东西就都不会漏进训练。每个函数都返回Result<_, Error>,并先校验输入。每个函数都会拒绝空数据集、形状不匹配,或者(在适用的检查项上)非有限值。还没读过错误处理的话,先去读一下。

按流水线顺序读这几节。先划分(4.1)。再缩放训练特征(4.2)。如果模型或损失函数需要 one-hot 目标,最后编码标签(4.3)。下面这段示例跑的正是这条顺序:

usendarray::{Array1,array};userustyml::utils::train_test_split::train_test_split;userustyml::utils::standardize::{StandardizationAxis,standardize};userustyml::utils::label_encoding::to_categorical;fnmain(){// 六个样本,两个量纲差异极大的特征,两个类别。letx=array![[1.0,20.0],[2.0,21.0],[3.0,19.0],[4.0,22.0],[5.0,18.0],[6.0,23.0],];lety:Array1<i32>=array![0,1,0,1,0,1];// 1. 先划分,缩放就永远看不到测试行。let(x_train,_x_test,y_train,_y_test)=train_test_split(x,y,Some(0.34),Some(42)).unwrap();// 2. 把每个特征列标准化到零均值、单位方差。letx_train=standardize(&x_train,StandardizationAxis::Column).unwrap();// 3. 为分类损失把整数标签做 one-hot 编码。lety_train=to_categorical(&y_train,None).unwrap();println!("x_train shape: {:?}",x_train.shape());println!("y_train shape: {:?}",y_train.shape());}

4.1. 训练集与测试集划分

训练集与测试集划分把你的特征矩阵和标签切成互不相交的训练子集与测试子集。这样一来,评估数字才能如实反映未见过的数据。train_test_split做的是普通随机划分。train_test_split_stratified对每个类别单独划分,让两侧保持相同的标签比例。只要某个类别稀有,就选分层版本,因为普通划分可能把这个类别整个漏到某一侧。test_size默认取0.3。标签数组对元素类型是泛型的。传入random_state种子能让洗牌结果可复现(参见可复现性与随机种子)。

4.2. 标准化与归一化

标准化与归一化是两种常被混为一谈的不同缩放方式。standardize计算 z-score。它先减去均值,再除以标准差,让每个特征最终变成零均值、单位方差。normalize则按 L1、L2、Max 或自定义 Lp 阶数,把每一行或每一列缩放到单位范数。

这两个操作各自还有一种带状态的形式。带状态的形式会记住自己的训练统计量,好让测试划分或线上的单个样本,按模型训练时所用的数字来缩放。这两个带状态的形式分别是StandardScalerNormalizer。与它们同族的还有MinMaxScaler(有界区间)、MaxAbsScaler(只看幅值,保住结构性的零)和RobustScaler(中位数与四分位距,让离群点决定不了尺度)。

列标准化是任何基于距离或梯度的模型之前的家常选择。KNN、SVM、PCA和神经网络,在特征量纲不一致时统统会失常。按行的单位范数归一化,则适合只看方向的向量,比如用余弦相似度比较的 TF-IDF 行。两个操作都会处理退化的那一路,而不是去除以一个趋近于零的尺度。standardize把除数强制设为 1.0,常量特征居中后变成全 0。normalize把接近零的条带原样保留。

4.3. 标签编码

标签编码在数据集自带的整数标签和分类损失所需的 one-hot 矩阵之间来回转换。to_categorical把一列非负i32标签变成 one-hot 矩阵。to_categorical_with_mapping对任意可哈希的标签(字符串也算)做同样的事,还会返回标签到索引的映射,方便你之后解码。to_sparse_categorical做逆向操作。它把 one-hot 或 softmax 概率矩阵按行取 argmax,还原成i32标签。用to_sparse_categorical就能把网络的 softmax 输出转回预测类别。如果你从 Keras 过来,这三件套对应的就是它的to_categorical。one-hot 目标恰好是分类交叉熵要吃的东西。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/16 21:55:38

什么是“钱包”?

“钱包”在密码学中&#xff0c;本质上是一个用来生成、存储和管理公私钥对的软件或硬件。它最广为人知的应用是区块链和加密货币领域-。区块链钱包&#xff1a;在Web3世界中&#xff0c;钱包地址就是你的公钥&#xff0c;私钥则用于签署交易&#xff0c;证明资产所有权-。通用…

作者头像 李华
网站建设 2026/8/16 21:55:17

AI技能开发:长耗时任务异步处理与用户体验优化方案

1. 项目概述&#xff1a;从“空白焦虑”到“优雅等待” 做AI Skill&#xff08;技能&#xff09;开发的朋友&#xff0c;估计都遇到过这个让人头疼的场景&#xff1a;用户满怀期待地触发了一个需要复杂推理、调用大模型或者处理大量数据的技能&#xff0c;然后呢&#xff1f;屏…

作者头像 李华
网站建设 2026/8/16 21:53:39

二极管如何钳位电压

二极管正向导通&#xff0c;反向截止第一步&#xff1a;先算没有二极管时&#xff0c;电阻分压节点电压R120K&#xff0c;R210K&#xff0c;上端 12V第二步&#xff1a;分析二极管 D1&#xff08;1N4148&#xff09;D1 阴极接 3.3V&#xff0c;阳极接 A 点。二极管导通电压&am…

作者头像 李华
网站建设 2026/8/16 21:43:45

超声波与红外传感器——近距离避障的低成本方案

上篇讲了GPS/RTK定位原理&#xff0c;从距离交会到载波相位模糊度解算&#xff0c;再到NMEA协议解析和ROS2集成。今天讲两种最便宜的近距离传感器——超声波和红外&#xff0c;它们虽然精度不高&#xff0c;但在机器人避障、悬崖检测、液位测量等场景中不可替代。面试时候被问&…

作者头像 李华