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

Python Scikit Learn OneHotEncoder拟合和变换错误:ValueError:X的形状与拟合期间不同,python,pandas,machine-learning,scikit-learn,one-hot-encoding,Python,Pandas,Machine Learning,Scikit Learn,One Hot Encoding,下面是我的代码 我知道在转换过程中发生错误的原因。这是因为拟合和变换期间特征列表不匹配。 我怎样才能解决这个问题?如何为所有其余功能获取0 在这之后,我想用它来部分拟合SGD分类器 Jupyter QT控制台4.3.1 Python 3.6.2 | Anaconda自定义64位|默认值,2017年9月21日,18:29:43 有关详细信息,请键入“版权”、“信用”或“许可证” IPython 6.1.0-增强的交互式Python。键入“?”以获取帮助。 作为pd进口熊猫 从sklearn.pr

下面是我的代码

我知道在转换过程中发生错误的原因。这是因为拟合和变换期间特征列表不匹配。 我怎样才能解决这个问题?如何为所有其余功能获取0

在这之后,我想用它来部分拟合SGD分类器

Jupyter QT控制台4.3.1 Python 3.6.2 | Anaconda自定义64位|默认值,2017年9月21日,18:29:43 有关详细信息,请键入“版权”、“信用”或“许可证” IPython 6.1.0-增强的交互式Python。键入“?”以获取帮助。 作为pd进口熊猫 从sklearn.preprocessing导入OneHotEncoder input_df=pd.DataFramedictfruit=['Apple'、'Orange'、'Pine'], 颜色=[“红色”、“橙色”、“绿色”], is_sweet=[0,0,1], 国家=[‘美国’、‘印度’、‘亚洲’] 输入_df 出[1]: 乡村水果的颜色是甜的 0美国红苹果0 1橙印度橙0 2青松1 过滤的\ u df=输入\ u df.applypd.to \ u数值,错误='ignore' 过滤的_df.info 应用一个热编码 刷新的\u df=pd.get\u假人过滤的\u df 刷新的(u)df 范围索引:3个条目,0到2 数据列共4列: 颜色3非空对象 国家3非空对象 水果3非空对象 _sweet 3是否为非空int64 数据类型:int641,object3 内存使用:176.0+字节 出[2]: 是甜的颜色、绿的颜色、橙的颜色、红色的国家、亚洲吗\ 0 0 0 0 1 0 1 0 0 1 0 0 2 1 1 0 0 1 国家\印度国家\美国水果\苹果水果\桔子水果\松树 0 0 1 1 0 0 1 1 0 0 1 0 2 0 0 0 0 1 enc=OneHotEncoder 附件Fitu df 出[3]: OneHotEncodercategorical_features='all',dtype=, handle_unknown='error',n_values='auto',sparse=True new_df=pd.DataFramedictfruit=['Apple'], 颜色=[“红色”], is_sweet=[0], 国家=[“美国”] 新德里 出[4]: 乡村水果的颜色是甜的 0美国红苹果0 过滤的\u df1=新的\u df.applypd.to \u数值,错误='ignore' 过滤的_df1.info 应用一个热编码 刷新的\u df1=pd.get\u dummiesfiltered\u df1 刷新\u df1 范围索引:1个条目,0到0 数据列共4列: 颜色1非空对象 国家1非空对象 水果1非空对象 _sweet 1是否为非null int64 数据类型:int641,object3 内存使用:112.0+字节 出[5]: 是甜美的颜色、红色的国家、美国的水果、苹果吗 0 0 1 1 1 附件1 -------------------------------------- ValueError回溯最近一次呼叫last 在里面 -->1附件1 transformself中的~/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py,X 2073 2074返回_转换_选择X、自我转换、, ->2075 self.categorical_特征,copy=True 2076 2077 ~/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py in\u transform\u selectedX,transform,selected,copy 1810 1811如果isinstanceselected,则六个.string_类型和所选==全部: ->1812返回转换X 1813 1814如果选择=0: ~/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py in_transformself,X 2030提升值ERRORX的形状与安装时不同。 2031应为%d,已为%d。 ->2032%索引。形状[0]-1,n_特征 2033 2034我们只使用fit已知的X的分类特征。 ValueError:X的形状与安装期间不同。预期为10,得到4。您的编码器安装在刷新的_-df上,其中包含10列,而刷新的_-df1仅包含4列,这与错误中报告的内容完全相同。您必须删除刷新的\u df1上未出现的列,或者将编码器安装到新版本的刷新的\u df上,该版本仅包含刷新的\u df1中出现的4列。

您的编码器安装在刷新的\u df上,刷新的\u df1包含10列,而刷新的\u df1仅包含4列,这与错误中报告的完全相同。您必须删除刷新的\u df1中未出现的列,或者将编码器安装到新版本的刷新的\u df中,该版本仅包含刷新的\u df1中出现的4列。

而不是使用pd.get\u假人。您需要+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.]]
代替使用pd.get_假人,您需要+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.]]

我无法删除要素列,因为我想将输出用于SGDClassifer部分拟合。我需要所有的功能,但如果是0,请检查此问题。有人建议我使用Transform,如果只添加空列并填充,它会不会工作?是的,它可能会工作。但是我在看sklearn中是否有什么东西。是的,partial_fit需要所有的列功能,但只能对数据点训练示例中适合您记忆的子集进行训练。针对不同功能集的培训意味着每次都要培训不同的模型。选中“我无法删除要素列”,因为我想将输出用于SGDClassifer部分拟合。我需要所有的功能,但如果是0,请检查此问题。有人建议我使用Transform,如果只添加空列并填充,它会不会工作?是的,它可能会工作。但是我在看sklearn中是否有什么东西。是的,partial_fit需要所有的列功能,但只能对数据点训练示例中适合您记忆的子集进行训练。针对不同功能集的培训意味着每次都要培训不同的模型。检查工作。我更清楚地想到了这一点。但是LabelEncoder不是用于Y目标而不是X特征吗。?sklearn的里程碑20也将发布CategoricalEncoder。但是谢谢你的回答。@punitraj是的,就是为了这个。但是在scikit中,我们还没有任何其他实用程序可以同时为多个功能实现这一点,在下一个版本中,已经有并且可能会有,它将LE和OHE组合到一个单独的包装器中。除非我们必须使用这个解决方法。谢谢。我注意到,当我们以后升级时,我们使用了新的feature.Works。我更清楚地想到了这一点。但是LabelEncoder不是用于Y目标而不是X特征吗。?sklearn的里程碑20也将发布CategoricalEncoder。但是谢谢你的回答。@punitraj是的,就是为了这个。但是在scikit中,我们还没有任何其他实用程序可以同时为多个功能实现这一点,在下一个版本中,已经有并且可能会有,它将LE和OHE组合到一个单独的包装器中。除非我们必须使用这个解决方法。谢谢。我注意到,当我们以后升级时,我们使用了新功能。