【问题标题】:return the labels and their encoded values in sklearn LabelEncoder在 sklearn LabelEncoder 中返回标签及其编码值
【发布时间】:2018-08-02 23:33:43
【问题描述】:

我在机器学习项目中使用来自 sklearnLabelEncoderOneHotEncoder 来编码标签(国家名称)在数据集中。一切正常,我的模型运行完美。该项目是根据包括客户所在国家/地区在内的许多特征(数据)来对银行客户是继续留在银行还是离开银行进行分类。

当我想预测(分类)一个新客户(仅限一个)时,我的问题就出现了。新客户的数据仍未经过预处理(即国家名称未编码)。类似于以下内容:

new_customer = np.array([['France', 600, 'Male', 40, 3, 60000, 2, 1,1, 50000]])

在我学习机器学习的在线课程中,讲师打开了包含编码数据的预处理数据集,手动检查了法国的代码并更新在new_customer,如下:

new_customer = np.array([[0, 0, 600, 'Male', 40, 3, 60000, 2, 1,1, 50000]])

我认为这是不切实际的,必须有一种方法可以将法国自动编码为原始数据集中使用的相同代码,或者至少有一种方法可以返回国家列表及其编码值。手动编码标签似乎很乏味且容易出错。那么我怎样才能使这个过程自动化,或者为标签生成代码呢?提前致谢。

【问题讨论】:

标签: python machine-learning scikit-learn one-hot-encoding


【解决方案1】:

您似乎正在寻找估算器的.transform() 方法。

>>> from sklearn.preprocessing import LabelEncoder

>>> c = ['France', 'UK', 'US', 'US', 'UK', 'China', 'France']
>>> enc = LabelEncoder().fit(c)
>>> encoded = enc.transform(c)
>>> encoded
array([1, 2, 3, 3, 2, 0, 1])

>>> encoded.transform(['France'])
array([1])

这会将您调用fit(c) 时学到的“映射”应用到新数据(在本例中为新标签)。你可以反向看到这个映射:

>>> enc.inverse_transform(encoded)
array(['France', 'UK', 'US', 'US', 'UK', 'China', 'France'], dtype='<U6')

正如这里的答案所提到的,如果您想在 Python 会话之间执行此操作,您可以像这样将估算器序列化到磁盘:

import pickle

with open('enc.pickle', 'wb') as file:
    pickle.dump(enc, file, pickle.HIGHEST_PROTOCOL)

然后在新会话中加载它并用它转换传入的数据。

【讨论】:

  • 你有一个小错误。它应该是“enc.transform(['france']),注意“enc”而不是“encoded”。示例中的“encoded”是一个数组,没有转换方法。
【解决方案2】:

在机器学习中,将预处理管道保存在内存中是一种习惯,以便在选择其超参数并训练模型后,您可以对测试数据应用相同的预处理。

如果所有这些都在同一个 python 实例中运行,这在中小型项目中很常见,那么这意味着让您的 LabelEncoder 在线或不将其发送到垃圾收集。如果在不同的实例中运行训练和测试,我认为最简单的解决方案是将其存储在磁盘上,然后将其加载到测试脚本中。

我建议你使用pickleHere 就是一个例子。

【讨论】:

    【解决方案3】:

    问题是您没有对数据集的国家/地区属性进行编码。

    from sklearn.preprocessing import LabelEncoder
    from sklearn.preprocessing import OneHotEncoder
    # define example
    data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 
    'hot']
    values = array(data)
    print(values)
    # integer encode
    label_encoder = LabelEncoder()
    integer_encoded = label_encoder.fit_transform(values)
    print(integer_encoded)
    # binary encode
    onehot_encoder = OneHotEncoder(sparse=False)
    integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
    onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
    print(onehot_encoded)
    

    输出:-

    ['cold' 'cold' 'warm' 'cold' 'hot' 'hot' 'warm' 'cold' 'warm' 'hot']
    [0 0 2 0 1 1 2 0 2 1]
    [[1. 0. 0.]
     [1. 0. 0.]
     [0. 0. 1.]
     [1. 0. 0.]
     [0. 1. 0.]
     [0. 1. 0.]
     [0. 0. 1.]
     [1. 0. 0.]
     [0. 0. 1.]
     [0. 1. 0.]]
    

    对于您的问题,data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot'] 应该是您数据集的国家/地区属性。然后您可以选择整数或二进制编码方法。然后继续学习过程。

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2016-11-20
      • 2020-03-04
      • 2020-12-22
      • 2020-07-12
      • 2018-12-20
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      相关资源
      最近更新 更多