将 pandas 字符串数据转换为决策树的数字

Posted

技术标签:

【中文标题】将 pandas 字符串数据转换为决策树的数字【英文标题】:converting pandas string data to numeric for decision tree 【发布时间】:2020-01-12 13:48:03 【问题描述】:

我正在尝试将几列字符串数据转换为数字以输入分类模型。具有一个修改列的示例数据集是:

输入:

data = [['tom', 10], ['nick', 15], ['juli', 14], ['nick', '12']]
data = pd.DataFrame(data, columns = ['Name', 'Age'])
data

输出:

    Name    Age
0   tom     10
1   nick    15
2   juli    14
3   nick    12

我意识到 scikit learn 不能很好地处理字符串数据,但现在我真的更愿意继续使用它,如果可能的话(公司限制)。但是,我的问题是,如果我使用

sklearn.preprocessing.LabelEncoder 

我可以使用 '.classes_' 来获取一些数值,例如:

输入:

le = preprocessing.LabelEncoder()
le.fit(data['Name'])
le.classes_
vals = le.transform(le.classes_)
vals

我明白了

输出:

array([0, 1, 2])

由于这个数组只包含三个值,我不能用

数据['名称'] = vals

因为我的列长度是 4,而我的 vals 长度是 3。

考虑到这一点,我是否有另一种方法可以在 scikit-learn 中解决这个问题,还是我唯一的选择是使用不同的库?

【问题讨论】:

vals = le.transform(data['Name']) 【参考方案1】:

试试这个:

le = preprocessing.LabelEncoder()
data['Name']= le.fit_transform(data['Name'])

这将为整个列分配标签。

【讨论】:

【参考方案2】:

你也可以这样做:

pd.get_dummies(data=data, columns=['Name'])

输出:

  Age  Name_juli  Name_nick  Name_tom
0  10          0          0         1
1  15          0          1         0
2  14          1          0         0
3  12          0          1         0

现在您的数据已准备好进行模型训练。通常 OneHot 编码比 LabelEncoding 更好,因为 LabelEncoding 意味着您的姓名之间存在数字关系。如果 Juli==0、Nick==1 和 Tom==2,则表示 July < Nick < Tom 可能会在某些模型中造成问题。

【讨论】:

我同意这个任务的one-hot encoding,但也可能值得一提的是原生sklearn OneHotEncoder(),它可以更容易在sklearn生态系统中使用 啊,谢谢。我最近确实了解到您不想要隐含的订单,但我有点转过身来,根据我的阅读,我认为 get_dummies 不是 OneHot 而 LabelEncoding 是。谢谢你的更正。那么,如果我需要对数据集中的多个列执行此操作,此过程是否会改变?我猜不是,因为这只是使用布尔值?这只是为我的数据集添加了一些额外的功能。我理解正确吗? 对我来说pandas 更直接,但如果你正在构建Pipelines,使用OneHotEncoder 可能会更好。如果您想添加更多列,请将它们添加到 columns=['Name'] 列表中,就这么简单,您会自动获得更新的数据框【参考方案3】:
le = preprocessing.LabelEncoder()
le.fit(data['Name'])
le.classes_
vals = le.transform(data['Name'])
vals

当您使用fit(data['Name']) 时,您实际上可以使用fit(data['Name'].unique()),因为只有唯一值用于拟合,但对于transform,您必须使用所有数据。

【讨论】:

【参考方案4】:
from sklearn.preprocessing import Imputer

imputer =Imputer(missing_values="NaN", strategy='mean', axis=0)

imputer=imputer.fit(X[:,1:3])

X[:,1:3]= imputer.transform(X[:,1:3])

#Concept of Dummy Variable, Handling the conflict of them

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

labelencoder_X = LabelEncoder()
#We have to give the column number necessary to change it in numeric form
X[:,0]=labelencoder_X.fit_transform(X[:,0])

onehotencoder=OneHotEncoder(categorical_features =[0])

X=onehotencoder.fit_transform(X).toarray()

【讨论】:

【参考方案5】:
# prepare input features
def LABEL_Encoding(X):
    objList = data.select_dtypes(include = "object").columns
    print (objList)
    le = LabelEncoder()
    for feat in objList:
        data[feat] = le.fit_transform(data[feat].astype(str))
      
    return data

【讨论】:

以上是关于将 pandas 字符串数据转换为决策树的数字的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 时间戳字符串转换为 pandas 数据框中的 python 日期

从 pandas 数据帧转换为 LabeledPoint RDD

pandas.read_csv 将字符串转换为科学记数法中的“数字”(我不想要)

用于决策树的 one-hot 编码后如何解释特征重要性

将数据框转换为rec数组(将对象转换为字符串)

pandas 将字符串映射为数字的方法