发布于2026-07-08 阅读(0)
扫一扫,手机访问
在分类问题里,特别是碰到包含缺失值的真实数据集时,大家最关心的问题之一就是:算法能不能“吃下”这些 nan?好消息是,HistGradientBoostingClassifier 给出的答案是肯定的。它原生支持 np.nan 和 None,这意味着你无需像传统方式那样,在预处理阶段花大量精力去做填充或删除。它的处理逻辑很有意思——在分裂节点时,算法会自动去学习“把缺失样本分到哪边更优”,本质上就是把缺失当成了一个可学习的分支方向。

这与 XGBoost(需设置 missing=nan)或 LightGBM(默认处理)的逻辑类似,但 sklearn 的实现更简洁,不需要依赖额外的参数来控制——只要传入 np.nan,它就能识别并参与到最优切分搜索中。不过,有几个细节需要注意:
np.nan 表示,字符串 "NaN" 或空字符串是行不通的。pd.get_dummies 或 OneHotEncoder 编码,否则会直接报 ValueError: Input X contains NaN。y 中绝对不能有缺失值,否则拟合阶段就会报错。说到这,就不得不提它的前辈 GradientBoostingClassifier。后者对缺失值的态度是“零容忍”,遇到 np.nan 会直接抛出异常。而 HistGradientBoostingClassifier 不仅不报错,还在内部通过“缺失导向分裂”(missing-aware split)机制来提升鲁棒性。
背后的机制是这样的:对于每个候选分裂点,算法会分别评估三种策略的损失下降情况——“把缺失样本全部分到左子树”、“全部分到右子树”、“忽略缺失样本”,然后选择损失下降最多的那一种。这意味着缺失值不是被粗暴地丢弃,而是被建模为一种隐式的特征行为。不报错,这在工程上意味着更少的预处理代码,更快的实验迭代。
tree_.threshold 反推出某个带 nan 的样本具体被分到了哪边,缺失值的路由路径是黑盒的。流程其实非常简单:数值型列保留 np.nan,类别列先编码再确保无缺失,y 删掉含缺失的行。你不需要动用 SimpleImputer,也绝不建议用均值或众数去填充——那反而可能引入偏差,尤其是当缺失本身带有业务含义时(比如“用户未填写年龄”可能本身就代表一个特定的年轻群体)。
下面是一个典型的预处理流程示例,一目了然:
import numpy as np
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
# 示例数据:数值列含 nan,类别列含 nan
df = pd.DataFrame({
"age": [25, np.nan, 35, 40, np.nan],
"city": ["Beijing", "Shanghai", np.nan, "Guangzhou", "Shenzhen"]
})
y = np.array([0, 1, 1, 0, 1]) # 注意:这里 y 不能有 nan
# 步骤1:数值列保持原样(nan 留着)
X_num = df[["age"]]
# 步骤2:类别列先填充再编码(不能留 nan 进去)
X_cat = df[["city"]].fillna("MISSING")
X_cat_encoded = OneHotEncoder(sparse_output=False).fit_transform(X_cat)
# 步骤3:拼接
X = np.hstack([X_num, X_cat_encoded])
# 步骤4:训练 —— age 列里的 np.nan 会被原生处理
clf = HistGradientBoostingClassifier()
clf.fit(X, y)
缺失值处理虽然方便,但有几个隐蔽的坑点常常导致结果异常,值得警惕:
HistGradientBoostingClassifier 会静默地跳过该列(不报任何错误),最终训练出的模型里根本没有这个特征。所以,检查 clf.feature_names_in_ 是否和你的输入列一致是很有必要的。sample_weight 时,如果一个样本的权重为 0 且其特征包含 nan,该样本仍然会参与缺失分裂的逻辑,但不贡献梯度。这种组合很容易导致特征重要性失真。说到底,真正需要注意的其实不是“算法能不能用”,而是“缺失分布是否稳定”以及“类别型缺失有没有被正确编码”。这两点要是出了问题,对模型的影响远大于算法本身是否支持缺失值。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8