Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 预测时如何处理测试数据onehotencoding后的类别不匹配?_Python_Machine Learning_Scikit Learn_Data Science - Fatal编程技术网

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

Python 预测时如何处理测试数据onehotencoding后的类别不匹配?,python,machine-learning,scikit-learn,data-science,Python,Machine Learning,Scikit Learn,Data Science,很抱歉,如果问题的标题不太清楚,我不能用一行字来概括这个问题 以下是简化的数据集以供解释。基本上,训练集中的类别数远远大于测试集中的类别数,这是因为在OneHotEncoding之后,测试和训练集中的列数存在差异。我如何处理这个问题 训练集 +-------+----------+ | Value | Category | +-------+----------+ | 100 | SE1 | +-------+----------+ | 200 | SE2 | +--

很抱歉,如果问题的标题不太清楚,我不能用一行字来概括这个问题

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

训练集

+-------+----------+
| Value | Category |
+-------+----------+
| 100   | SE1      |
+-------+----------+
| 200   | SE2      |
+-------+----------+
| 300   | SE3      |
+-------+----------+
+-------+----------+
| Value | Category |
+-------+----------+
| 100   | SE1      |
+-------+----------+
| 200   | SE1      |
+-------+----------+
| 300   | SE2      |
+-------+----------+
OneHotEncoding后的训练集

+-------+-----------+-----------+-----------+
| Value | DummyCat1 | DummyCat2 | DummyCat3 |
+-------+-----------+-----------+-----------+
| 100   | 1         | 0         | 0         |
+-------+-----------+-----------+-----------+
| 200   | 0         | 1         | 0         |
+-------+-----------+-----------+-----------+
| 300   | 0         | 0         | 1         |
+-------+-----------+-----------+-----------+
+-------+-----------+-----------+
| Value | DummyCat1 | DummyCat2 |
+-------+-----------+-----------+
| 100   | 1         | 0         |
+-------+-----------+-----------+
| 200   | 1         | 0         |
+-------+-----------+-----------+
| 300   | 0         | 1         |
+-------+-----------+-----------+
测试集

+-------+----------+
| Value | Category |
+-------+----------+
| 100   | SE1      |
+-------+----------+
| 200   | SE2      |
+-------+----------+
| 300   | SE3      |
+-------+----------+
+-------+----------+
| Value | Category |
+-------+----------+
| 100   | SE1      |
+-------+----------+
| 200   | SE1      |
+-------+----------+
| 300   | SE2      |
+-------+----------+
OneHotEncoding后的测试集

+-------+-----------+-----------+-----------+
| Value | DummyCat1 | DummyCat2 | DummyCat3 |
+-------+-----------+-----------+-----------+
| 100   | 1         | 0         | 0         |
+-------+-----------+-----------+-----------+
| 200   | 0         | 1         | 0         |
+-------+-----------+-----------+-----------+
| 300   | 0         | 0         | 1         |
+-------+-----------+-----------+-----------+
+-------+-----------+-----------+
| Value | DummyCat1 | DummyCat2 |
+-------+-----------+-----------+
| 100   | 1         | 0         |
+-------+-----------+-----------+
| 200   | 1         | 0         |
+-------+-----------+-----------+
| 300   | 0         | 1         |
+-------+-----------+-----------+
正如您所注意到的,OneHotEncoding之后的训练集是shape
(3,4)
,而OneHotEncoding之后的测试集是shape
(3,3)
。 因此,当我执行以下代码时(
y\u train
是形状的列向量
(3,)

我在预测函数中得到了误差。如您所见,与基本示例不同,错误中的尺寸相当大

  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)
回溯(最近一次呼叫最后一次):
文件“”,第30行,在
x_pred=回归器预测(x_检验)
文件“/Users/parthapratimnog/anaconda3/lib/python3.6/site packages/sklearn/linear_model/base.py”,第256行,在predict中
返回自判定函数(X)
文件“/Users/parthapratimnog/anaconda3/lib/python3.6/site packages/sklearn/linear\u model/base.py”,第241行,在决策函数中
密集_输出=真)+自截距_
文件“/Users/parthapratimneog/anaconda3/lib/python3.6/site packages/sklearn/utils/extmath.py”,第140行,安全点
返回np.点(a,b)
值错误:形状(48012236)和(4033,)未对齐:2236(尺寸1)!=4033(尺寸0)

您必须以转换x\U列车的相同方式转换x\U测试

x_test = onehotencoder.transform(x_test)
x_pred = regressor.predict(x_test)
确保使用与x\U列车上用于安装()的相同的
onehotencoder
对象

我假设您当前正在测试数据上使用fit_transform()。
执行
fit()
fit\u transform()
会忘记以前学习的数据并重新拟合oneHotEncoder。现在它会认为列中只有两个不同的值,因此会改变输出的形状。

您需要在
x\u-train
x\u-test
中使用相同的功能集。如果训练数据中的因素有更多的级别,可以在测试数据中显式地表示它们,或者从
x\u-train
中删除那些无法应用于测试集的因素。@andrew\u-reece有没有直接的方法从
x\u-train
中删除额外的级别?如果在拆分为训练和测试之前进行dummify,你可以避免这个问题。但是如果你因为某种原因不能做到这一点,像
x\u train.drop(x\u train.columns[~x\u train.columns.isin(x\u test.columns)],1)
应该可以。我不是在分割数据,它们已经是不同的CSV了。让我试试代码块。在这种情况下,只需使用与转换列车数据相同的对象,并使用
transform(x_测试)
。我假设您当前正在测试数据上使用
fit\u transform()
,但它
fit()
fit\u transform()
应仅用于列车数据,并且仅用于测试数据上的
transform()
。如果您共享用于编码x_序列和x_测试的代码,我可以添加一个答案来帮助您。
ValueError:转换期间存在未知的分类功能[462 61 462…,61 61 61 462]。
您如何处理此问题?这是在另一个数据集上,我想现在,测试集中有更多的分类数据。@ParthapratimNeog是的。情况就是这样。在这种情况下,您需要考虑在现实世界中,当新的未查看数据包含您尚未了解的内容时,您将做些什么。那你怎么处理呢?然后你会放弃这些案例,还是对整个数据进行再次培训。理想情况下,我希望再次培训他们,但是,他们不在培训数据中,那么我该如何做呢?我试着暂时忽略他们。对不起,我对这一点真的很陌生:)@parthapratimnog您需要将这些内容包括到火车中,然后再火车。现在,您可以删除存在此类数据的行。同样,对于虚拟值,在整个数据集上使用OneHotEncoder,然后将其拆分为训练和测试。这不会影响性能或过度拟合。@VivekKumar:在整个数据集上使用OneHotEncoder,然后将其拆分为训练和测试时,问题在于测试数据中存在新值(但这些值不在训练数据中)。最好将训练数据和测试数据分开进行转换。