LabelEncoder – 反向使用和在模型上应用分类数据

我正在进行一个预测项目(纯属娱乐),我从nltk中提取了男性和女性的名字,将名字标记为“男性”或“女性”,然后获取每个名字的最后一个字母,最后使用不同的机器学习算法根据最后一个字母来训练和预测性别。

我们知道Python的sklearn不处理分类数据,所以我使用LabelEncoder将最后一个字母转换为数值:

转换前:

     name     last_letter    gender0    Aamir    r              male1    Aaron    n              male2    Abbey    y              male3    Abbie    e              male4    Abbot    t              male     name       last_letter    gender0    Abagael    l              female1    Abagail    l              female2    Abbe       e              female3    Abbey      y              female4    Abbi       i              female

如果我们合并两个数据框,删除名字列并打乱顺序:

     last_letter    gender0    a              male1    e              female2    g              male3    h              male4    e              male

然后我使用了LabelEncoder

from sklearn.preprocessing import LabelEncoderlabel_encoder = LabelEncoder()for col in df.columns:    df[col]= label_encoder.fit_transform(df[col])df.head()

数据框变为:

     last_letter    gender0    1              male1    5              female2    7              male3    8              male4    5              male

如你所见,在训练模型后(假设这里使用的是随机森林),如果我想用模型预测一个随机字母

e.g. rf_model.predict('a')

这是行不通的,因为模型只接受数值。在这种情况下,如果我这样做:

rf_model.predict(1) (假设字母'a'被编码为数字1)

模型预测结果返回

array([1])

那么我该如何做类似的事情:

rf_model.predict('a') 

并得到像“女性”或“男性”这样的结果,而不是输入一个数值并得到一个数值结果呢?


回答:

只需使用你创建的同一个LabelEncoder!因为你已经用训练数据fit了它,你可以直接用transform函数应用新数据。

In [2]: from sklearn.preprocessing import LabelEncoderIn [3]: label_encoder = LabelEncoder()In [4]: label_encoder.fit_transform(['a', 'b', 'c'])Out[4]: array([0, 1, 2])In [5]: label_encoder.transform(['a'])Out[5]: array([0])

要与RandomForestClassifier一起使用,

In [59]: from sklearn.ensemble import RandomForestClassifierIn [60]: X = ['a', 'b', 'c']In [61]: y = ['male', 'female', 'female']In [62]: X_encoded = label_encoder.fit_transform(X)In [63]: rf_model = RandomForestClassifier()In [64]: rf_model.fit(X_encoded[:, None], y)Out[64]: RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',            max_depth=None, max_features='auto', max_leaf_nodes=None,            min_impurity_split=1e-07, min_samples_leaf=1,            min_samples_split=2, min_weight_fraction_leaf=0.0,            n_estimators=10, n_jobs=1, oob_score=False, random_state=None,            verbose=0, warm_start=False)In [65]: x = ['a']In [66]: x_encoded = label_encoder.transform(x)In [67]: rf_model.predict(x_encoded[:, None])Out[67]: array(['male'],       dtype='<U6')

如你所见,如果你用它们来拟合分类器,你可以直接从分类器中得到字符串输出'male', 'female'

参考LabelEncoder.transform

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注