合并数据帧后 OneHotEncoder 失败

OneHotEncoder failing after combining dataframes

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

当我尝试使用它进行预测时,它失败了,因为在 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. 将所有列更改为类型 'category' 除了 'temp',它是对象:
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) 行失败。

在我添加临时列并连接两个 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.

为什么抱怨'train'?那是在被排除的 'temp' 列中。

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

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