我正在尝试对我的数据帧的一列进行热编码,而其余的列都经过标签编码。我正在使用以下代码:
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')
我收到一个值错误:无法将字符串转换为浮点数:其他 我不明白为什么使用标签编码器做同样的事情时会发生这种情况。知道我在做什么错吗?
我只想保存编码器类,以便可以在我的验证集中重用它,因此也可以接受其他任何方式。
答案 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将能够处理传递的数据中的字符串:
字符串或熊猫分类列现在可以使用
OneHotEncoder
或OrdinalEncoder
进行编码。
答案 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')