【问题标题】:OneHotEncoder ValueError: Found unknown categoriesOneHotEncoder ValueError:发现未知类别
【发布时间】: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'

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

【问题讨论】:

    标签: scikit-learn categorical-data one-hot-encoding feature-engineering


    【解决方案1】:

    问题在于申请

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

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

    正确的方法

    1. 清理数据集,即为所有列填充所有 na 值
    2. 然后过滤并删除 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')
        

        【讨论】:

          猜你喜欢
          • 2019-07-17
          • 2021-04-21
          • 2020-07-28
          • 2020-03-10
          • 2018-01-02
          • 2021-05-11
          • 2020-09-08
          • 2017-07-31
          • 2018-12-16
          相关资源
          最近更新 更多