You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scikit-learn OneHotEncoder的min_frequency参数疑问:低频类别仍保留?

问题解析:OneHotEncoder低频类别仍生成独立列的原因及解决方法

你遇到的问题核心是对min_frequency参数的作用理解有误:这个参数仅用于识别哪些类别属于低频,默认不会改变OneHotEncoder的编码行为——即使类别被标记为低频,依然会为其创建独立的特征列,所以输出形状是(4,4)而非预期的(4,3)。

要实现低频类别的合并或丢弃,需要配合额外参数:

1. 丢弃低频类别

设置drop='infrequent'可以在拟合阶段移除低频类别的特征列,同时配合handle_unknown='ignore'避免转换低频类别时触发报错:

import numpy as np
from sklearn.preprocessing import OneHotEncoder

t = np.array([['dog'] * 8 + ['cat'] * 20 + ['rabbit'] * 10 + ['snake'] * 2], dtype=object).T
enc = OneHotEncoder(min_frequency=4/40, sparse=False, drop='infrequent', handle_unknown='ignore').fit(t)

print(enc.get_feature_names_out())
# 输出: ['x0_cat' 'x0_dog' 'x0_rabbit']

e = enc.transform(np.array([['dog'], ['cat'], ['dog'], ['snake']]))
print(e)
# 输出:
# [[0. 1. 0.]
#  [1. 0. 0.]
#  [0. 1. 0.]
#  [0. 0. 0.]]

此时输出形状为(4,3),snake因被丢弃,转换后对应行全为0。

2. 将低频类别合并到统一列

设置handle_unknown='infrequent_if_exist',可以把低频类别和未知类别统一映射到一个额外的"infrequent"列:

import numpy as np
from sklearn.preprocessing import OneHotEncoder

t = np.array([['dog'] * 8 + ['cat'] * 20 + ['rabbit'] * 10 + ['snake'] * 2], dtype=object).T
enc = OneHotEncoder(min_frequency=4/40, sparse=False, handle_unknown='infrequent_if_exist').fit(t)

print(enc.get_feature_names_out())
# 输出: ['x0_cat' 'x0_dog' 'x0_rabbit' 'x0_infrequent']

e = enc.transform(np.array([['dog'], ['cat'], ['dog'], ['snake']]))
print(e)
# 输出:
# [[0. 1. 0. 0.]
#  [1. 0. 0. 0.]
#  [0. 1. 0. 0.]
#  [0. 0. 0. 1.]]

此时输出形状为(4,4),但snake不再有独立列,而是被归类到"infrequent"列中。

内容的提问来源于stack exchange,提问作者Francisco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:50:19