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
相关产品推荐
相关产品推荐

