sklearn OrdinalEncoder拟合时报未知类别ValueError解决方案
错误原因
报错核心是OrdinalEncoder的categories参数配置和实际数据完全不匹配:
- 你初始化编码器时传入
categories=[['A','B'],['Low','High']],相当于告诉编码器:待编码的第一列(光照列A)仅存在'A'、'B'两个合法取值,第二列(浇水列B)仅存在'Low'、'High'两个合法取值。 - 但实际生成的
exp_df里,A列存储的取值是'On'和'Off',根本不在预设的类别列表中,拟合阶段编码器识别到未登记的类别,直接抛出ValueError。
另外代码中定义的OHE_model = OneHotEncoder(handle_unknown = 'ignore')全程没有被调用,属于冗余代码。
修正方案
只需要把OrdinalEncoder的类别配置改成和实际列取值一一对应即可,修正后可正常运行的完整代码如下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import statsmodels from sklearn.preprocessing import OrdinalEncoder,OneHotEncoder Light = ['On','Off'] Watering = ['Low','High'] # 生成全参数组合实验数据 experiments = [(x,y) for x in Light for y in Watering] exp_df = pd.DataFrame(experiments,columns=['A','B']) print(exp_df) # 修正:类别列表和列取值对应,第一列匹配Light取值,第二列匹配Watering取值 enc = OrdinalEncoder(categories=[Light, Watering]) encoded_df = pd.DataFrame(enc.fit_transform(exp_df[['A','B']]),columns=['A','B']) # 随机生成实验顺序 encoded_df['exp_order'] = np.random.choice(np.arange(4),4,replace=False) encoded_df['outcome'] = [25,37,55,65] print(encoded_df)
运行后不会再抛出类别未知错误,编码结果会按照你预设的['On','Off']、['Low','High']顺序映射为0、1数值。
内容的提问来源于stack exchange,提问作者Wiame Bouyoussef
相关产品推荐
相关产品推荐

