【问题标题】:OneHotEncoder failing after combining dataframes合并数据帧后 OneHotEncoder 失败
【发布时间】:2022-01-03 04:32:38
【问题描述】:

我有一个运行成功的模型。

当我尝试使用它进行预测时,它失败了,因为在 OneHotEncoding 之后,测试集的列比火车多。

经过一番阅读,我发现我需要先连接两个 df,OneHotEncode,然后将它们分开。

  1. 在训练数据集中添加了一个“temp”列,值为“train”。
  2. 向测试数据集添加了一个“temp”列,值为“test”。
  3. 这样我可以稍后使用布尔索引将 df 分开,如下所示:
X = temp_df[temp_df['temp'] == 'train']
X2 = temp_df[temp_df['temp'] == 'test']
  1. 垂直连接两个 df。
  2. 验证新组合 df 的形状。
  3. 将所有列更改为类型“类别”,除了“临时”,它是对象:
basin                    category
region                   category
lga                      category
extraction_type_class    category
management               category
quality_group            category
quantity                 category
source                   category
waterpoint_type          category
cluster                  category
temp                       object
  1. 现在我只是像以前一样尝试 OneHotEncode。我只选择分类列:
cat_ix = temp_df.select_dtypes(include=['category']).columns
  1. 我尝试申请:
ct = ColumnTransformer([('o', OneHotEncoder(), cat_ix)], remainder='passthrough')
temp_df = ct.fit_transform(temp_df)

它在 temp_df = ct.fit_transform(temp_df) 行上失败。

在我添加 temp 列并连接两个 df 之前,这些相同的步骤运行良好。

确切的错误:

Traceback (most recent call last):
  File "C:\Users\Mark\AppData\Local\Programs\Python\Python38\lib\site-packages\sklearn\compose\_column_transformer.py", line 778, in _hstack
    converted_Xs = [
  File "C:\Users\Mark\AppData\Local\Programs\Python\Python38\lib\site-packages\sklearn\compose\_column_transformer.py", line 779, in <listcomp>
    check_array(X, accept_sparse=True, force_all_finite=False)
  File "C:\Users\Mark\AppData\Local\Programs\Python\Python38\lib\site-packages\sklearn\utils\validation.py", line 738, in check_array
    array = np.asarray(array, order=order, dtype=dtype)
  File "C:\Users\Mark\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\generic.py", line 1993, in __array__
    return np.asarray(self._values, dtype=dtype)
ValueError: could not convert string to float: 'train'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Mark\AppData\Local\Programs\Python\Python38\lib\site-packages\sklearn\compose\_column_transformer.py", line 783, in _hstack
    raise ValueError(
ValueError: For a sparse output, all columns should be a numeric or convertible to a numeric.

为什么抱怨“火车”?那是在被排除的“临时”列中。

【问题讨论】:

    标签: python-3.x scikit-learn one-hot-encoding


    【解决方案1】:

    请注意,回溯没有引用OneHotEncoder,而是所有ColumnTransformer。您正在尝试通过temp 列,该列被附加到方法_hstack 中的单热编码稀疏矩阵 上,第二条错误消息是更相关的消息。它不能将字符串类型的数组堆叠到数值稀疏数组上(这会导致第一条错误消息)。

    如果稀疏矩阵不是太大,您可以通过在ColumnTransformer 中使用sparse_threshold=0 或在OneHotEncoder 中使用sparse=False 来强制它变得密集。如果它对于内存来说太大(或者您更喜欢稀疏矩阵),您可以使用 0/1 指示符进行训练/测试拆分,而不是字符串 "train", "test"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2020-09-20
      相关资源
      最近更新 更多