OneHotEncoder ValueError: Found unknown categories

OneHotEncoder ValueError: Found unknown categories

我正在使用完整文件构建 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:在转换期间在第 2 列中找到未知类别 ['missing']”

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

问题在于应用

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

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

正确的方法

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

从任何 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)

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

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