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