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。后来我用丢失的标志替换了它们。
正确的方法
- 清理数据集,即填充所有列的所有 na 值
- 然后过滤并删除 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')
我正在使用完整文件构建 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。后来我用丢失的标志替换了它们。
正确的方法
- 清理数据集,即填充所有列的所有 na 值
- 然后过滤并删除 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')