当我在数据帧上调用函数时,编码器给出值错误

时间:2018-08-31 03:07:12

标签: python pandas sklearn-pandas

我正在尝试对我的数据帧的一列进行热编码,而其余的列都经过标签编码。我正在使用以下代码:

def OneHotEncoder(repair,field):
    oe=preprocessing.OneHotEncoder()
    oe.fit(repair[field])
    np.save('/Users/sayontimondal/Desktop/SKlearn Model/Encoders/'+str(field)+'_enc_classes.npy', oe.classes_)
    repair[field] = repair[field].map(lambda s: 'Other' if s not in oe.classes_ else s)
    repair[field]=oe.transform(repair[field]) 
    return repair[field]

但是在我的数据框上调用该函数时: repair['SALES_ORG_ID']=OneHotEncoder(repair,'SALES_ORG_ID')

我收到一个值错误:无法将字符串转换为浮点数:其他 我不明白为什么使用标签编码器做同样的事情时会发生这种情况。知道我在做什么错吗?

我只想保存编码器类,以便可以在我的验证集中重用它,因此也可以接受其他任何方式。

2 个答案:

答案 0 :(得分:0)

显示完整的堆栈跟踪以及一些可复制的代码和数据,以便我们进行检查。这似乎是一个易于解决的问题,可以通过提供解决方案来解决。

除此之外,这里还有多个问题:

1)OneHotEncoder不能直接在字符串上直接使用。首先,您需要将字符串特征转换为整数,(也许使用LabelEncoder

2)一键编码会把您的单列转换成多列(取决于它们中的唯一值),因此您不能直接将其分配给数据框的单列。

3)如果您能够使用OneHotEncoder成功进行转换,那么即使返回的数据也是稀疏矩阵,也不能很好地与pandas数据框配合使用。

4)您将两次相同的数据分配给相同的数据帧。一旦进入方法,您将执行以下操作:

repair[field]=oe.transform(repair[field]) 

然后调用这样的方法:

repair['SALES_ORG_ID']=OneHotEncoder(repair,'SALES_ORG_ID')

这是不必要的。

5)您首先要拟合(或试图拟合)field中的所有数据。因此oe.classes_将包含所有唯一类别。所以之后,做

repair[field] = repair[field].map(lambda s: 'Other' if s not in oe.classes_ else s)

没有任何意义。您能说明问题中所说的labelencoder如何成功完成此工作吗?现在,即使您成功完成了此操作,下一行:

repair[field]=oe.transform(repair[field]) 

将引发错误,因为“ Other”是OneHotEncoder不处理的字符串。在拟合数据之前,您需要添加额外的类别('Other'

6)我建议您使用joblib或pickle而不是numpy保存转换器。

注意:如in changelog here所述,从下一版本(0.20.0)开始,OneHotEncoder将能够处理传递的数据中的字符串:

  

字符串或熊猫分类列现在可以使用OneHotEncoderOrdinalEncoder进行编码。

答案 1 :(得分:0)

我已连接到现有数据框“ Other”,如下所示: Other = pd.DataFrame([['Other','Other','Other','Other','Other']], columns = ['CONFIG_CD','COMPONENT_CD_ISSUE_CD','SOLD_TO_SHIP_TO','SALES_ORG_ID','PART_NO']) repair = pd.concat([repair,Other]) 之后,我对标签编码器执行以下操作,该标签编码器可以完美地工作:

#label encoder def labelHotEncoder(repair,field): le = preprocessing.LabelEncoder() le.classes_= np.load('/Users/sayontimondal/Desktop/SKlearn Model/Encoders/'+str(field)+'_enc_classes.npy') #np.save('/Users/sayontimondal/Desktop/SKlearn Model/Encoders/'+str(field)+'_enc_classes.npy', le.classes_) repair[field] = repair[field].map(lambda s: 'Other' if s not in le.classes_ else s) repair[field]=le.transform(repair[field]) return repair[field] 然后调用如下函数:

repair['CONFIG_CD']=labelHotEncoder(repair,'CONFIG_CD') repair['COMPONENT_CD_ISSUE_CD']=labelHotEncoder(repair,'COMPONENT_CD_ISSUE_CD') repair['SOLD_TO_SHIP_TO']=labelHotEncoder(repair,'SOLD_TO_SHIP_TO') repair['PART_NO']=labelHotEncoder(repair,'PART_NO')