6.3 分箱、排名与类别编码
数值经常需要第二种表示。配送时长可以变成服务等级,得分可以变成名次,销售渠道可以变成模型输入列。这些操作不是中性的格式调整:边界、并列政策和类别假设都会改变后续分析能看到什么。
把连续值放进有声明的区间
pd.cut 根据值域边界把数值分配到区间:
import numpy as np
import pandas as pd
service_level = pd.cut(
deliveries["minutes"],
bins=[0, 15, 30, 60, np.inf],
labels=["fast", "normal", "slow", "critical"],
right=True,
include_lowest=True,
ordered=True,
)right=True 生成右闭区间,例如 30 分钟属于 。include_lowest=True 让最低边界进入第一个区间。必须测试恰好落在每条边界上的值;区间端点错误可能直接改变运营决策。
边界来自业务政策、科学定义或需要稳定解释的尺度时使用 cut。传入整数也可以生成等宽箱,但此时边界会依赖当前样本值域。
pd.qcut 使用样本分位数(quantile)生成边界:
quartile = pd.qcut(
customers["annual_spend"],
q=4,
labels=["Q1", "Q2", "Q3", "Q4"],
)它追求各箱观测数量接近,而不是数值跨度相同。样本变化时边界也会变化,所以 Q4 是相对于拟合总体的标签。重复数值可能让两个分位点相同。不要随意加 duplicates="drop":实际箱数可能减少,固定标签列表也会失效。应通过 retbins=True 检查边界,并验证实际类别数。
输入缺失会继续保持缺失;落在显式 cut 边界之外的数值也会变成缺失。后者可能表示范围契约不完整,而不是真正没有观测。
把并列政策写进排名定义
排名需要声明方向和并列规则:
customers["spend_rank"] = customers["annual_spend"].rank(
method="min",
ascending=False,
)对降序得分 [92, 88, 88, 71],常见方法会产生不同结果:
| 方法 | 名次 | 两个 88 的含义 |
|---|---|---|
average | 1, 2.5, 2.5, 4 | 取所占名次平均值 |
min | 1, 2, 2, 4 | 取最佳占位名次 |
dense | 1, 2, 2, 3 | 下一个不同分数使用下一个整数 |
first | 1, 2, 3, 4 | 按现有行顺序拆分并列 |
first 会把之前的排序纳入排名定义。如果源顺序是偶然的,名次也会是偶然的。组内排名应先分组:
customers["region_rank"] = (
customers.groupby("region")["annual_spend"]
.rank(method="dense", ascending=False)
)百分比排名便于比较规模不同的组,但含义仍取决于并列方法与分母。排名一旦用于资格或 top- 筛选,就必须公开规则。
编码类别含义,而不只是编码文字
类别变量(categorical variable)只有有限的允许值。它可以是没有顺序的名义类别(nominal category),也可以是存在实际顺序的有序类别(ordinal category)。
优先级具有真实顺序,应显式声明:
from pandas.api.types import CategoricalDtype
priority_type = CategoricalDtype(
categories=["low", "medium", "high"],
ordered=True,
)
orders["priority"] = orders["priority"].astype(priority_type)排序现在遵循声明顺序,而不是字母顺序。不在允许类别中的值会变成缺失,所以转换后要审计失败值。
销售渠道属于名义类别。若编码为 web = 1、store = 2、partner = 3,就人为制造了顺序与距离,许多模型会把 3 当成比 1 更大。独热编码(one-hot encoding)为每个类别建立一个成员指示列:
channel_columns = pd.get_dummies(
customers["channel"],
prefix="channel",
dtype=bool,
)机器学习编码只能在训练数据上拟合。要保存训练阶段的类别模式,检测验证集或生产数据中的新类别,并显式对齐输出列。否则,训练和推理矩阵可能形状不同,未知类别也可能被误解为被省略的基准类别。
分箱、排名和编码都会压缩或重新解释证据。应把原始值与派生表示并排保留,并在重要场景下为政策做版本记录。6.4 节将改变另一种表示:在行与列之间移动变量,同时尽量保持底层观测不变。