预测时如何处理测试数据中的 onehotencoding 后的类别不匹配?

Par*_*eog 6 python machine-learning scikit-learn data-science

如果问题的标题不是很清楚,我很抱歉,我无法用一句话概括问题。

以下是用于解释的简化数据集。基本上,训练集中的类别数量远大于测试集中的类别数量,因此 OneHotEncoding 后测试和训练集中的列数存在差异。我该如何处理这个问题?

训练集

+-------+----------+
| Value | Category |
+-------+----------+
| 100   | SE1      |
+-------+----------+
| 200   | SE2      |
+-------+----------+
| 300   | SE3      |
+-------+----------+
Run Code Online (Sandbox Code Playgroud)

OneHotEncoding后的训练集

+-------+-----------+-----------+-----------+
| Value | DummyCat1 | DummyCat2 | DummyCat3 |
+-------+-----------+-----------+-----------+
| 100   | 1         | 0         | 0         |
+-------+-----------+-----------+-----------+
| 200   | 0         | 1         | 0         |
+-------+-----------+-----------+-----------+
| 300   | 0         | 0         | 1         |
+-------+-----------+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)

测试装置

+-------+----------+
| Value | Category |
+-------+----------+
| 100   | SE1      |
+-------+----------+
| 200   | SE1      |
+-------+----------+
| 300   | SE2      |
+-------+----------+
Run Code Online (Sandbox Code Playgroud)

OneHotEncoding后的测试集

+-------+-----------+-----------+
| Value | DummyCat1 | DummyCat2 |
+-------+-----------+-----------+
| 100   | 1         | 0         |
+-------+-----------+-----------+
| 200   | 1         | 0         |
+-------+-----------+-----------+
| 300   | 0         | 1         |
+-------+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)

您可以注意到,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)
Run Code Online (Sandbox Code Playgroud)

我在预测函数中收到错误。正如您所看到的,与基本示例不同,错误的尺寸非常大。

  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)
Run Code Online (Sandbox Code Playgroud)

Viv*_*mar 2

您必须x_test按照 x_train 的转换方式进行转换。

x_test = onehotencoder.transform(x_test)
x_pred = regressor.predict(x_test)
Run Code Online (Sandbox Code Playgroud)

确保使用onehotencoderfit()x_train 相同的对象。

我假设您当前正在测试数据上使用 fit_transform() 。做fit()或者fit_transform()忘记之前学过的数据,重新拟合oneHotEncoder。现在它会认为列中仅存在两个不同的值,因此将改变输出的形状。