【问题标题】:OneHotEncoder gives ValueError : Input contains NaN ; even though my DataFrame doesn't contain any NaN as indicated by df.isna()OneHotEncoder 给出 ValueError :输入包含 NaN ;即使我的 DataFrame 不包含 df.isna() 所示的任何 NaN
【发布时间】:2020-11-03 10:49:37
【问题描述】:

我正在处理 Titanic 数据集,并尝试在名为“Embarked”的列之一上应用 OneHotEncoding,该列有 3 个可能的值“S”、“Q”和“C”。 它给了我

ValueError: Input contains NaN

我使用 2 种方法检查了该列的内容。第一个是带有 value_counts 的 for 循环,第二个是通过将整个表写入 csv:

for col in X.columns:
    print(col)
    print(X[col].value_counts(dropna=False))
X.isna().to_csv("xisna.csv")
print("notna================== :",X.notna().shape)
X.dropna(axis=0,how='any',inplace=True)
print("X.shape " ,X.shape)
return pd.DataFrame(X)

成功了

Embarked
S    518
C    139
Q     55
Name: Embarked, dtype: int64

我检查了 csv 的内容并阅读了 700 多个条目,但没有找到任何“真”语句。

在 ("cat",One...) 处阻塞的管道

cat_attribs=["Sex","Embarked"]
special_attribs = {'drop_attribs' : ["Name","Cabin","Ticket","PassengerId"], k : [3]}

full_pipeline = ColumnTransformer([
    ("fill",fill_pipeline,list(strat_train_set)),
    ("emb_cat",OneHotEncoder(),['Sex']),
    ("cat",OneHotEncoder(),['Embarked']),
])

那么我缺少的 NaN 值到底在哪里?

【问题讨论】:

  • 您使用的是哪个 Titanic 数据集?我尝试在从kaggle competition 下载的train.csv 数据集上使用X['Embarked'].value_counts(dropna=False),我得到了这个结果:S 644 C 168 Q 77 NaN 2 Name: Embarked, dtype: int64。在 PassengerId 62 和 830 处确实有两个 NaN
  • 我直接使用了来自 Kaggle 的那个。我已将数据集拆分为 training_set 和 test_set。并应用另一个函数来填充 NaN。您在我的帖子中看到的摘要完全来自我的训练集,这也是我尝试转换的唯一集。
  • 您是否仅在您的火车上尝试过这个? NaN 值是否可能仅在测试集中?
  • 是的,它只在训练集上,因为记录量是原始集的 0.8 倍,而 csv 包含这些记录量。而且我在自己的打印语句之间看到,在训练集的转换过程中,我发现了 NaN 启动单元并将它们转换为 Non-Nan 值

标签: pandas dataframe machine-learning one-hot-encoding kaggle


【解决方案1】:

我想通了,ColumnTransformer 将连接转换而不是将它们传递给在线的下一个转换器。 因此,在 fill_pipeline 中完成的任何转换都不会被 OneHotEncoder 注意到,因为它仍在使用未转换的数据集。 所以我不得不将一个热编码放入fill_pipeline而不是ColumnTransformer。

full_pipeline = ColumnTransformer([
    ("fill",fill_pipeline,list(strat_train_set)),
    ("emb_cat",OneHotEncoder(),['Sex']),
    ("cat",OneHotEncoder(),['Embarked']),
])

【讨论】:

  • 抱歉,您的答案中的代码与问题中的代码相同,您不是说您为 OHE 制作了单独的管道吗?
猜你喜欢
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
相关资源
最近更新 更多