合并数据帧后 OneHotEncoder 失败
OneHotEncoder failing after combining dataframes
我有一个成功运行的模型。
当我尝试使用它进行预测时,它失败了,因为在 OneHotEncoding 之后,测试集的列数比训练集多。
经过一番阅读后,我发现我需要首先连接两个 df,OneHotEncode,然后将它们分开。
- 向训练数据集添加了一个 'temp' 列,值为 'train'。
- 向测试数据集添加了一个 'temp' 列,值为 'test'。
- 这样我以后就可以像这样使用布尔索引将 df 分开:
X = temp_df[temp_df['temp'] == 'train']
X2 = temp_df[temp_df['temp'] == 'test']
- 垂直连接两个 df。
- 验证新组合 df 的形状。
- 将所有列更改为类型 '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
- 现在我只是像以前一样尝试 OneHotEncode。我只选择分类列:
cat_ix = temp_df.select_dtypes(include=['category']).columns
- 我尝试申请:
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"
.
我有一个成功运行的模型。
当我尝试使用它进行预测时,它失败了,因为在 OneHotEncoding 之后,测试集的列数比训练集多。
经过一番阅读后,我发现我需要首先连接两个 df,OneHotEncode,然后将它们分开。
- 向训练数据集添加了一个 'temp' 列,值为 'train'。
- 向测试数据集添加了一个 'temp' 列,值为 'test'。
- 这样我以后就可以像这样使用布尔索引将 df 分开:
X = temp_df[temp_df['temp'] == 'train']
X2 = temp_df[temp_df['temp'] == 'test']
- 垂直连接两个 df。
- 验证新组合 df 的形状。
- 将所有列更改为类型 '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
- 现在我只是像以前一样尝试 OneHotEncode。我只选择分类列:
cat_ix = temp_df.select_dtypes(include=['category']).columns
- 我尝试申请:
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"
.