如何在sklearn中查看OneHotEncoder的类别与对应编码?
解决OneHotEncoder类别与编码对应关系的查看问题
核心原因分析
你遇到的方法报错,大概率是sklearn版本差异导致:
get_feature_names_out()是sklearn 0.24版本新增的方法,旧版本的OneHotEncoder没有这个属性;- 直接调用OneHotEncoder的
get_feature_names()在新版本会被标记为弃用,且需要传入参数,正确的调用方式应该从包裹它的ColumnTransformer入手。
具体解决步骤
以下是基于示例代码的完整实现:
1. 完成数据编码的基础代码
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder import numpy as np import pandas as pd # 构造示例数据(第3列为分类列) data = pd.DataFrame({ 'col1': [1, 2, 3, 4, 5], 'col2': [10, 20, 30, 40, 50], 'col3': ['A', 'B', 'C', 'A', 'B'] }) # 定义ColumnTransformer,指定对第3列(索引为2)做独热编码 ct = ColumnTransformer( transformers=[ ('encoder', OneHotEncoder(sparse_output=False), [2]) ], remainder='passthrough' # 保留其他列 ) # 拟合并转换数据 encoded_data = ct.fit_transform(data)
2. 提取OneHotEncoder实例并查看类别
从ColumnTransformer中取出内部的OneHotEncoder对象,再通过categories_属性获取所有分类值:
# 获取ColumnTransformer中的OneHotEncoder实例 encoder = ct.named_transformers_['encoder'] # 获取第3列的所有分类类别(因为只对一列编码,取categories_[0]) categories = encoder.categories_[0] print("分类类别列表:", categories) # 输出:分类类别列表: ['A' 'B' 'C']
3. 生成类别与编码的对应关系
OneHotEncoder默认按类别字典序生成编码,每个类别对应一个独热向量(对应位置为1,其余为0)。可以手动生成对应字典:
# 生成类别-编码的映射字典 encoding_mapping = { category: np.eye(len(categories))[index].astype(int) for index, category in enumerate(categories) } print("类别与编码对应关系:") for cat, code in encoding_mapping.items(): print(f"{cat} → {code}") # 输出: # A → [1 0 0] # B → [0 1 0] # C → [0 0 1]
4. (可选)获取编码后的列名(sklearn 0.23+)
如果你的sklearn版本在0.23及以上,可以直接调用ColumnTransformer的get_feature_names_out()方法,得到带类别标识的列名,直观对应编码列:
feature_names = ct.get_feature_names_out() print("编码后的列名:", feature_names) # 输出:编码后的列名: ['encoder__col3_A' 'encoder__col3_B' 'encoder__col3_C' 'col1' 'col2']
版本兼容处理
如果你的sklearn版本过低(低于0.24),建议升级到最新稳定版:
pip install --upgrade scikit-learn
内容的提问来源于stack exchange,提问作者Viki Liu
相关产品推荐
相关产品推荐

