预测时如何处理测试数据onehoten编码后的类别不匹配?
How to handle category mismatch after onehotencoding from test data while predicting?
对不起,如果问题的标题不是很清楚,我无法用一句话概括问题。
这里是用于解释的简化数据集。基本上,训练集中的类别数远大于测试集中的类别数,因此经过OneHotEncoding后,测试集和训练集的列数存在差异。我该如何处理这个问题?
训练集
+-------+----------+
| Value | Category |
+-------+----------+
| 100 | SE1 |
+-------+----------+
| 200 | SE2 |
+-------+----------+
| 300 | SE3 |
+-------+----------+
OneHotEncoding后的训练集
+-------+-----------+-----------+-----------+
| Value | DummyCat1 | DummyCat2 | DummyCat3 |
+-------+-----------+-----------+-----------+
| 100 | 1 | 0 | 0 |
+-------+-----------+-----------+-----------+
| 200 | 0 | 1 | 0 |
+-------+-----------+-----------+-----------+
| 300 | 0 | 0 | 1 |
+-------+-----------+-----------+-----------+
测试集
+-------+----------+
| Value | Category |
+-------+----------+
| 100 | SE1 |
+-------+----------+
| 200 | SE1 |
+-------+----------+
| 300 | SE2 |
+-------+----------+
OneHotEncoding后的测试集
+-------+-----------+-----------+
| Value | DummyCat1 | DummyCat2 |
+-------+-----------+-----------+
| 100 | 1 | 0 |
+-------+-----------+-----------+
| 200 | 1 | 0 |
+-------+-----------+-----------+
| 300 | 0 | 1 |
+-------+-----------+-----------+
正如您所注意到的,OneHotEncoding 之后的训练集的形状为 (3,4)
,而 OneHotEncoding 之后的测试集的形状为 (3,3)
。
因此,当我执行以下代码时(y_train
是形状为 (3,)
的列向量)
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(x_train, y_train)
x_pred = regressor.predict(x_test)
我在预测函数中得到了错误。如您所见,与基本示例不同,错误中的维度非常大。
Traceback (most recent call last):
File "<ipython-input-2-5bac76b24742>", line 30, in <module>
x_pred = regressor.predict(x_test)
File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/linear_model/base.py", line 256, in predict
return self._decision_function(X)
File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/linear_model/base.py", line 241, in _decision_function
dense_output=True) + self.intercept_
File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/utils/extmath.py", line 140, in safe_sparse_dot
return np.dot(a, b)
ValueError: shapes (4801,2236) and (4033,) not aligned: 2236 (dim 1) != 4033 (dim 0)
您必须以与 x_train 相同的方式来转换 x_test
。
x_test = onehotencoder.transform(x_test)
x_pred = regressor.predict(x_test)
确保使用与 x_train 上 fit()
相同的 onehotencoder
对象。
我假设您目前正在对测试数据使用 fit_transform()。
做fit()
或fit_transform()
会忘记之前学过的数据,重新适配oneHotEncoder。它现在会认为列中只有两个不同的值,因此会改变输出的形状。
对不起,如果问题的标题不是很清楚,我无法用一句话概括问题。
这里是用于解释的简化数据集。基本上,训练集中的类别数远大于测试集中的类别数,因此经过OneHotEncoding后,测试集和训练集的列数存在差异。我该如何处理这个问题?
训练集
+-------+----------+
| Value | Category |
+-------+----------+
| 100 | SE1 |
+-------+----------+
| 200 | SE2 |
+-------+----------+
| 300 | SE3 |
+-------+----------+
OneHotEncoding后的训练集
+-------+-----------+-----------+-----------+
| Value | DummyCat1 | DummyCat2 | DummyCat3 |
+-------+-----------+-----------+-----------+
| 100 | 1 | 0 | 0 |
+-------+-----------+-----------+-----------+
| 200 | 0 | 1 | 0 |
+-------+-----------+-----------+-----------+
| 300 | 0 | 0 | 1 |
+-------+-----------+-----------+-----------+
测试集
+-------+----------+
| Value | Category |
+-------+----------+
| 100 | SE1 |
+-------+----------+
| 200 | SE1 |
+-------+----------+
| 300 | SE2 |
+-------+----------+
OneHotEncoding后的测试集
+-------+-----------+-----------+
| Value | DummyCat1 | DummyCat2 |
+-------+-----------+-----------+
| 100 | 1 | 0 |
+-------+-----------+-----------+
| 200 | 1 | 0 |
+-------+-----------+-----------+
| 300 | 0 | 1 |
+-------+-----------+-----------+
正如您所注意到的,OneHotEncoding 之后的训练集的形状为 (3,4)
,而 OneHotEncoding 之后的测试集的形状为 (3,3)
。
因此,当我执行以下代码时(y_train
是形状为 (3,)
的列向量)
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(x_train, y_train)
x_pred = regressor.predict(x_test)
我在预测函数中得到了错误。如您所见,与基本示例不同,错误中的维度非常大。
Traceback (most recent call last):
File "<ipython-input-2-5bac76b24742>", line 30, in <module>
x_pred = regressor.predict(x_test)
File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/linear_model/base.py", line 256, in predict
return self._decision_function(X)
File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/linear_model/base.py", line 241, in _decision_function
dense_output=True) + self.intercept_
File "/Users/parthapratimneog/anaconda3/lib/python3.6/site-packages/sklearn/utils/extmath.py", line 140, in safe_sparse_dot
return np.dot(a, b)
ValueError: shapes (4801,2236) and (4033,) not aligned: 2236 (dim 1) != 4033 (dim 0)
您必须以与 x_train 相同的方式来转换 x_test
。
x_test = onehotencoder.transform(x_test)
x_pred = regressor.predict(x_test)
确保使用与 x_train 上 fit()
相同的 onehotencoder
对象。
我假设您目前正在对测试数据使用 fit_transform()。
做fit()
或fit_transform()
会忘记之前学过的数据,重新适配oneHotEncoder。它现在会认为列中只有两个不同的值,因此会改变输出的形状。