Scikit learn OneHotEncoder值错误:找到未知类别

Scikit learn OneHotEncoder值错误:找到未知类别,scikit-learn,categorical-data,one-hot-encoding,feature-engineering,Scikit Learn,Categorical Data,One Hot Encoding,Feature Engineering,我正在使用完整文件构建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

我正在使用完整文件构建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
现在,当我在块中处理相同的文件时,我使用相同的编码器

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。后来我用丢失的旗帜替换了它们

正确的方法

  • 清理数据集,即填充所有列的所有na值
  • 然后过滤并删除NaN行,即所有值NaN行
    。其中(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
    
    年龄20.284091

    要获得它,请访问以下位置:
    df.loc[(数据['age'].isnull())]

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

    df.age[62]=data.age.median()
    
    或删除所有行:

    df.dropna(inplace=True)
    

    一种解决方法是使用
    handle\u unknown=
    参数初始化:

    one\u hot\u encoder=onehotcoder(稀疏=False,句柄\u unknown='ignore')
    
    df.dropna(inplace=True)