OneHotEncoder ValueError:发现未知类别

Posted

技术标签:

【中文标题】OneHotEncoder ValueError:发现未知类别【英文标题】:OneHotEncoder ValueError: Found unknown categories 【发布时间】:2020-05-28 02:58:39 【问题描述】:

我正在使用完整文件构建 OneHotEncoder。

def buildOneHotEncoder(training_file_name, categoricalCols):
    one_hot_encoder = OneHotEncoder(sparse=False)

    df = pd.read_csv(training_file_name, skiprows=0, header=0)
    df = df[categoricalCols]
    df = removeNaN(df, categoricalCols)
    logging.info(str(df.columns))
    one_hot_encoder.fit(df)
    return one_hot_encoder
def removeNaN(df, categoricalCols):
    # Replace any NaN values
    for col in categoricalCols:
        df[[col]] = df[[col]].fillna(value=CONSTANT_FILLER)
    return df

现在我在分块处理相同文件时使用相同的编码器

for chunk in pd.read_csv(training_file_name, chunksize=CHUNKSIZE):
....
  INPUT = chunk[categoricalCols]
  INPUT = removeNaN(INPUT, categoricalCols)
  one_hot_encoded = one_hot_encoder.transform(INPUT)
....

它给了我错误“ValueError: Found unknown categories ['missing'] in column 2 during transform'

我无法一次处理整个文件,因为在训练迭代期间需要内存才能使用所有内核。

【问题讨论】:

【参考方案1】:

问题在于申请

df_merged_set_test = chunk.where(chunk['weblab']=="missing")

我正在根据 a 字段过滤数据集,因此对于它填充 NaN 的所有行。我后来用丢失的标志替换它们。

正确的方法

    清理数据集,即为所有列填充所有 na 值 然后过滤并删除 NaN 行,即所有值 NaN 行 .where(chunk['weblab']=="missing").dropna()

【讨论】:

【参考方案2】:

从任何 nan 数据中清除数据。 以下代码显示每列的 nan 数据计数

total_missing_data = data.isnull().sum().sort_values(ascending=False)
percent_of_missing_data = (data.isnull().sum()/data.isnull().count()*100).sort_values(ascending=False)
missing_data = pd.concat(
    [
        total_missing_data, 
        percent_of_missing_data
    ], 
    axis=1, 
    keys=['Total', 'Percent']
)
print(missing_data.head(10))

输出如:

Total   Percent

年龄 2 0.284091

要获得它是位置: df.loc[(data['age'].isnull())]

然后使用 mean 或 meadiean 填充 nan 列:

df.age[62]=data.age.median()

或删除所有 nan 行:

df.dropna(inplace=True)

【讨论】:

【参考方案3】:

一种解决方法是使用handle_unknown= 参数初始化OneHotEncoder

one_hot_encoder = OneHotEncoder(sparse=False, handle_unknown='ignore')

【讨论】:

以上是关于OneHotEncoder ValueError:发现未知类别的主要内容,如果未能解决你的问题,请参考以下文章

sklearn OneHotEncoder broken- ValueError:无法将字符串转换为float

Scikit Learn OneHotEncoder 拟合和变换错误:ValueError:X 的形状与拟合期间不同

OneHotEncoder : ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

尝试使用 OneHotEncoder 然后使用 make_column_transformer 规范化值后出现 ValueError

ValueError:形状不匹配:如果类别是一个数组,它必须是形状(n_features,)

One Hot Encoding:ValueError:无法将字符串转换为float:'是'