将 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