一、数据的三种类型
(一)连续值(比例 / 区间尺度)
- 数值之间的差值、倍数有实际物理含义。
例子:重量 3kg,10kg。10‑3=7,代表重量差 7kg;10kg 是 3kg 的三倍重。
葡萄酒里面酒精度、酸度、pH 全部都是连续值,直接喂神经网络没问题。
(二)序数值
- 数字只有大小排序意义,差值没有实际含义。
例子:小杯 = 1,中杯 = 2,大杯 = 3
我们知道大杯>中杯>小杯。但是(1+3)/2=2不能得出中杯!数字 2 并不等于 1 和 3 中间一半的体积。
⚠️ 不能直接拿数字做加减乘除运算!
葡萄酒质量评分 (0‑10) 本质上就属于序数值!
(三)分类值(分类尺度)
- 数字完全没有顺序含义,只是给类别起编号。
例子:水 = 1,咖啡 = 2,牛奶 = 3。
2(咖啡)不大于 1(水),只是名字代号。1、2、3 谁大谁小没有任何意义!
❗这种数据绝对不能直接把数字丢进神经网络!必须做独热编码。
二、标签分离:特征数据 和 目标标签分开
例:
读出来数组形状(4898, 12)
4898:一共 4898 瓶葡萄酒(样本数量)
12:12 列(11 个化学特征 + 1 个质量标签)
wineq 张量包含全部 12 列。
- 深度学习铁则:输入特征 和 预测标签一定要分开!不能混在一起送入网络。
#取所有行,除最后一列 → 输入特征X(11项化学指标)data=wineq[:,:-1]#取所有行,只取最后一列 → 目标标签y(葡萄酒质量分)target=wineq[:,-1]三、标签两种编码方案(核心重点)
- 现在target存的就是葡萄酒质量分数标签,我们有两种编码选择:
(一)方案 1:整数标签(直接转成 long 长整型)
target=wineq[:,-1].long()- 结果:tensor([6, 6, 7, 6 …])
- 优点:最简单,保留分数顺序关系(7 分酒 > 6 分酒)
- 缺点:神经网络会自动误以为 7 和 6 之间的距离 = 6 和 5 之间的距离,强行赋予数值距离含义
- ✅适合:回归任务、有序标签(质量评分这种有高低顺序)
(二)方案 2:独热编码 one‑hot(适合无序分类)
- 什么叫独热编码?
- 一共有 10 个分数等级 (0‑9),每个标签生成长度为 10 的向量。只有对应位置填 1,剩下全部填 0。
分数 = 5 → [0,0,0,0,0,1,0,0,0,0]
分数 = 6 → [0,0,0,0,0,0,1,0,0,0]
- 代码示例拆解
#第一步:生成一个全0矩阵,4898行样本,每行预留10个位置target_onehot=torch.zeros(target.shape[0],10)#第二步:scatter_填充1target_onehot.scatter_(1,target.unsqueeze(1),1.0)- target.unsqueeze(1):原来 target 形状[4898]是一维数组。unsqueeze给它增加一列,变成[4898, 1]二维索引张量。scatter 要求索引张量和目标矩阵维度一致,不然会报错!
- scatter_三个参数解释:
参数 1:dim=1 → 沿着行方向的列索引填充
参数 2:索引张量:告诉程序每一行,第几列的位置要填上 1
参数 3:填充的值:1.0 - 对每一瓶葡萄酒,找到对应质量分数编号那一列,把 0 改成 1。
- 什么时候选独热编码?
- 当标签没有顺序!比如标签:红葡萄酒、白葡萄酒、玫瑰葡萄酒,类别之间谁也不比谁好,这时必须独热编码。
- 如果是葡萄酒质量评分(有序):独热编码反而会丢掉「6 分比 5 分好」这个顺序信息。
四、总结
五、如何处理连续、有序和分类数据列
(一)回归任务、回归特征
- 回归任务:模型输出一个连续的数字(预测一个值)
- 直接使用数据 = 当作回归特征使用
- 直接当作回归特征使用 = 原封不动,不做任何编码、转换,直接把这一列数字放进神经网络当作输入 X
- 神经网络天生就可以接收小数、连续数值。什么都不用处理,这就叫直接当作回归特征。
(二)离散数据
(三)有序(分类)数据
- 定义
- 属于离散的类别标签
- 类别之间存在客观、有意义的高低、先后、等级顺序关系
- 但是相邻类别之间的差值(间隔大小)未知、不一定相等。
- 核心关键点
- ✅顺序是真实有效的:差<一般<好<优秀
- ❌等级之间的距离不相等:“差→一般” 的差距 ≠ “好→优秀” 的差距
- ❗本质仍然是类别数据,不是真正的连续数值
只是预处理时你拥有选择权,可以人为映射成整数 1‑2‑3,临时当作连续特征使用。
(四)(无序)分类数据
- 定义
- 属于离散类别标签
- 由若干互斥、独立的类别组成;类别只起到命名、区分作用,类别之间不存在任何大小、高低、先后、等级顺序关系。
- 核心关键点
- 只有类别之分,没有等级之分;
A>B这个关系完全无意义 - 就算人为编号:红 = 1,蓝 = 2,绿 = 3;1<2 这个大小关系是虚假的,不能当真
(五)流程图解析
- 是否是连续数据,如果是,直接使用数据,也就是当作回归特征使用
- 非连续数据,判断是否为有序数据,如果是,可以进行人为选择
- 选择保留顺序:当作连续(回归)特征使用,喂入模型(缺点:强行引入距离)
- 选择舍弃顺序:转为独热编码,降级处理成无序分类数据
- 若为分类数据,则使用独热编码
- 使用独热编码的步骤
.long()转整数标签,之后进行独热编码
- 第一步操作:先用
.long(),把浮点分数6.0→整数索引6。- 但⚠转为整数标签只是一个过渡,不等于彻底抛弃顺序!
- 如果你只用整数索引
[5,6,7]作为标签,PyTorch 的CrossEntropyLoss本身不会强制距离,但数字大小的信息仍然隐含在索引中。
- 想要彻底抹除顺序,就要再进一步做独热编码:
- 独热向量之间,5、6、7 三者的向量距离完全一样!顺序彻底消失。