当前位置: 首页 > 面试题库 >

Scikit学习OneHotEncoder拟合和变换错误:ValueError:X的形状与拟合期间不同

袁亦
2023-03-14
问题内容

下面是我的代码。

我知道为什么在转换过程中会发生错误。这是因为特征列表在拟合和变换期间不匹配。我该如何解决?我如何才能将其余所有功能都设为0?

之后,我想将其用于SGD分类器的部分拟合。

Jupyter QtConsole 4.3.1

Python 3.6.2 |Anaconda custom (64-bit)| (default, Sep 21 2017, 18:29:43)

Type 'copyright', 'credits' or 'license' for more information

IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.



import pandas as pd

from sklearn.preprocessing import OneHotEncoder



input_df = pd.DataFrame(dict(fruit=['Apple', 'Orange', 'Pine'],

                             color=['Red', 'Orange','Green'],

                             is_sweet = [0,0,1],

                             country=['USA','India','Asia']))

input_df

Out[1]:

    color country   fruit  is_sweet

0     Red     USA   Apple         0

1  Orange   India  Orange         0

2   Green    Asia    Pine         1







filtered_df = input_df.apply(pd.to_numeric, errors='ignore')

filtered_df.info()

# apply one hot encode

refreshed_df = pd.get_dummies(filtered_df)

refreshed_df

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 3 entries, 0 to 2

Data columns (total 4 columns):

color       3 non-null object

country     3 non-null object

fruit       3 non-null object

is_sweet    3 non-null int64

dtypes: int64(1), object(3)

memory usage: 176.0+ bytes





Out[2]:

   is_sweet  color_Green  color_Orange  color_Red  country_Asia  \

0         0            0             0          1             0

1         0            0             1          0             0

2         1            1             0          0             1



   country_India  country_USA  fruit_Apple  fruit_Orange  fruit_Pine

0              0            1            1             0           0

1              1            0            0             1           0

2              0            0            0             0           1







enc = OneHotEncoder()

enc.fit(refreshed_df)



Out[3]:

OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,

       handle_unknown='error', n_values='auto', sparse=True)







new_df = pd.DataFrame(dict(fruit=['Apple'],

                             color=['Red'],

                             is_sweet = [0],

                             country=['USA']))

new_df





Out[4]:

  color country  fruit  is_sweet

0   Red     USA  Apple         0







filtered_df1 = new_df.apply(pd.to_numeric, errors='ignore')

filtered_df1.info()

# apply one hot encode

refreshed_df1 = pd.get_dummies(filtered_df1)

refreshed_df1

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 1 entries, 0 to 0

Data columns (total 4 columns):

color       1 non-null object

country     1 non-null object

fruit       1 non-null object

is_sweet    1 non-null int64

dtypes: int64(1), object(3)

memory usage: 112.0+ bytes







Out[5]:

   is_sweet  color_Red  country_USA  fruit_Apple

0         0          1            1            1



enc.transform(refreshed_df1)

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-6-33a6a884ba3f> in <module>()

----> 1 enc.transform(refreshed_df1)



~/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py in transform(self, X)

   2073         """

   2074         return _transform_selected(X, self._transform,

-> 2075                                    self.categorical_features, copy=True)

   2076

   2077



~/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py in _transform_selected(X, transform, selected, copy)

   1810

   1811     if isinstance(selected, six.string_types) and selected == "all":

-> 1812         return transform(X)

   1813

   1814     if len(selected) == 0:



~/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py in _transform(self, X)

   2030             raise ValueError("X has different shape than during fitting."

   2031                              " Expected %d, got %d."

-> 2032                              % (indices.shape[0] - 1, n_features))

   2033

   2034         # We use only those categorical features of X that are known using fit.



ValueError: X has different shape than during fitting. Expected 10, got 4.

问题答案:

pd.get_dummies()不需要使用LabelEncoder +
OneHotEncoder,它们可以存储原始值,然后在新数据上使用它们。

像下面那样更改代码将为您提供所需的结果。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
input_df = pd.DataFrame(dict(fruit=['Apple', 'Orange', 'Pine'], 
                             color=['Red', 'Orange','Green'],
                             is_sweet = [0,0,1],
                             country=['USA','India','Asia']))

filtered_df = input_df.apply(pd.to_numeric, errors='ignore')

# This is what you need
le_dict = {}
for col in filtered_df.columns:
    le_dict[col] = LabelEncoder().fit(filtered_df[col])
    filtered_df[col] = le_dict[col].transform(filtered_df[col])

enc = OneHotEncoder()
enc.fit(filtered_df)
refreshed_df = enc.transform(filtered_df).toarray()

new_df = pd.DataFrame(dict(fruit=['Apple'], 
                             color=['Red'],
                             is_sweet = [0],
                             country=['USA']))
for col in new_df.columns:
    new_df[col] = le_dict[col].transform(new_df[col])

new_refreshed_df = enc.transform(new_df).toarray()

print(filtered_df)
      color  country  fruit  is_sweet
0      2        2      0         0
1      1        1      1         0
2      0        0      2         1

print(refreshed_df)
[[ 0.  0.  1.  0.  0.  1.  1.  0.  0.  1.  0.]
 [ 0.  1.  0.  0.  1.  0.  0.  1.  0.  1.  0.]
 [ 1.  0.  0.  1.  0.  0.  0.  0.  1.  0.  1.]]

print(new_df)
      color  country  fruit  is_sweet
0      2        2      0         0

print(new_refreshed_df)
[[ 0.  0.  1.  0.  0.  1.  1.  0.  0.  1.  0.]]


 类似资料:
  • 我在scikit learn中使用fit函数进行分类培训。例如,在使用随机林时,通常使用以下类型的代码: 不幸的是,在使用Python 3时,我得到了以下错误: C:\Anaconda3\lib\site-pack\skLearning\base.py:175: DeprecationWarning:inspect.getargspec()已弃用,请使用inspect.signature()代替林

  • 在前几节基于Fashion-MNIST数据集的实验中,我们评价了机器学习模型在训练数据集和测试数据集上的表现。如果你改变过实验中的模型结构或者超参数,你也许发现了:当模型在训练数据集上更准确时,它在测试数据集上却不一定更准确。这是为什么呢? 训练误差和泛化误差 在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,

  • 我有一个问题,也许可以用计算机屏幕上的窗口来最好地说明:创建另一个尽可能大的窗口,不与任何现有窗口重叠。 换句话说:在有限表面(一张纸或一块屏幕)上给定一组N个矩形,找到可以安装在这些矩形之间的最大矩形。(坐标可以是任意的,因此位图在这里不是可行的解决方案。 下面的照片显示了三个矩形(黑色)和最大的矩形(红色)。 http://www.irstafoto.se/blogmtrl/rectangle

  • 正则化方法:防止过拟合,提高泛化能力 在机器学习各种模型训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合)。其直观的表现如下图所示,随着训练过程的进行,模型复杂度增加,在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大——因为训练出来的网络过拟合了训练集,对训练集外的数据却不work。 为了防止overfittin

  • 我是深度学习的新手。我试图跟随fast.ai系列讲座,并试图在Kaggle内核中手动重现工作。 我正在努力通过Kaggle中的猫对狗的Redux。我不关心准确性,我只是想让一些东西发挥作用。 我使用的是Keras和VGG16模型,如fast中所述。当然。我还依靠本文中概述的代码来帮助我起步。 这是我的卡格尔笔记本。 我在尝试拟合我的模型时遇到了一个错误,我不知道如何解释: 以下是更多信息: 和模型

  • 我在测试我的项目时遇到了一个问题,任何帮助都将不胜感激。我的所有代码都可以在这里找到:https://github.com/Karlus44/smartcontract-lottery当我输入命令brownie test时,我的脚本tests/test_lottery_unit。执行py,并提交我的不同测试。以下是我注销的一些引用: = = = = = = = = = = = = = = = =