如果问题的标题不够清晰,我深感抱歉,我无法在一行内总结这个问题。
以下是用于解释的简化数据集。基本上,训练集中的类别数量远大于测试集中的类别数量,因此在独热编码后,测试集和训练集的列数有所不同。我该如何处理这个问题?
训练集
+-------+----------+| Value | Category |+-------+----------+| 100 | SE1 |+-------+----------+| 200 | SE2 |+-------+----------+| 300 | SE3 |+-------+----------+
独热编码后的训练集
+-------+-----------+-----------+-----------+| Value | DummyCat1 | DummyCat2 | DummyCat3 |+-------+-----------+-----------+-----------+| 100 | 1 | 0 | 0 |+-------+-----------+-----------+-----------+| 200 | 0 | 1 | 0 |+-------+-----------+-----------+-----------+| 300 | 0 | 0 | 1 |+-------+-----------+-----------+-----------+
测试集
+-------+----------+| Value | Category |+-------+----------+| 100 | SE1 |+-------+----------+| 200 | SE1 |+-------+----------+| 300 | SE2 |+-------+----------+
独热编码后的测试集
+-------+-----------+-----------+| Value | DummyCat1 | DummyCat2 |+-------+-----------+-----------+| 100 | 1 | 0 |+-------+-----------+-----------+| 200 | 1 | 0 |+-------+-----------+-----------+| 300 | 0 | 1 |+-------+-----------+-----------+
如您所见,独热编码后的训练集形状为(3,4)
,而独热编码后的测试集形状为(3,3)
。因此,当我执行以下代码时(y_train
是一个形状为(3,)
的列向量)
from sklearn.linear_model import LinearRegressionregressor = 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()
会忘记之前学习的数据,并重新拟合独热编码器。它现在会认为列中只有两个不同的值存在,因此会改变输出形状。