sklearn的决策树能够处理字符串数据吗吗?

20201229 -

引言

我记得很久之前我曾经遇到过这种问题,一开始我还很纳闷,一般情况下,输入到分类器的数据应该都是数值型的,对于字符串型的他应该处理不了,但是当时我却得出了结论,sklearn中的决策树,能够帮助我讲这些数据处理。

但是,我感觉,可能是有一些记忆的偏差。
那么这里就来具体描述一下。

问题

问题来源于,最近处理一部分数据的时候,因为数据中含有标签类型的数据,但是直接输入到决策树模型中,sklearn中居然报错了,很费解,因为基于我之前的认知,决策树应该帮我把这部分编码好了,而且从决策树的原理上来说,这部分也的却是能做的。所以我也是很纳闷。

解决

在搜索了相关的内容之后,看了这个问答[1]明白了,这是因为sklearn中的实现方式导致的,一般针对这种数据的处理就是进行编码,不管是label编码,或者独热编码都行。
但是在这篇介绍编码的文章[2]中,提到很多内容,例如基于树的分类器可以不用独热编码,因为树本质上就是一种独热编码,这篇文章后续还要更细致理解。


关于不同版本的决策树

决策树是比较经典的分类算法,而其中分为了不同的版本,我们常用的包括:ID3、C4.5、CART这三种,当然还有C5.0,C5.0是并不是开源的。最开始的时候,我一直理解他们之间的区别仅仅是在选择分治节点的时候,不同的函数而已,当时没有具体进行研究,最近做实验的时候突然看到了这部分的不同,特此进行记录。
ID3 C4.5 CART决策树原理及sklearn实现
ID3、C4.5、C5.0、CART决策树区别
ID3、C4.5、CART三种决策树的区别
Decision Trees
在最后的sklearn文档中提到,sklearn使用的是CART,跟C4.5是非常相似的。
同时,在做实验的时候也提到了一个问题,ID3并不能直接处理连续性的数据,这部分在前面的几篇文章中都有体现。

参考

[1]strings as features in decision tree/random forest
[2]数据预处理:独热编码(One-Hot Encoding)和 LabelEncoder标签编码

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用决策树进行分类或回归时,处理缺失值和字符串通常有以下几种方法: 1. 缺失值处理 - 删除缺失值:可以使用 `pandas` 库的 `dropna()` 函数删除缺失值,但这会导致数据集的样本量减少。 ```python import pandas as pd from sklearn.tree import DecisionTreeClassifier # 加载数据集 data = pd.read_csv('data.csv') # 删除缺失值 data.dropna(inplace=True) # 分离特征和标签 X = data.drop('label', axis=1) y = data['label'] # 训练模 clf = DecisionTreeClassifier() clf.fit(X, y) ``` - 填充缺失值:可以使用 `pandas` 库的 `fillna()` 函数或 `sklearn` 库的 `SimpleImputer` 类填充缺失值。其中,`fillna()` 函数可以使用指定的值或者均值、中位数等填充缺失值;`SimpleImputer` 类可以使用均值、中位数、众数等填充缺失值。 ```python import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.impute import SimpleImputer # 加载数据集 data = pd.read_csv('data.csv') # 填充缺失值 # 使用指定的值填充 # data.fillna(value=0, inplace=True) # 使用均值填充 # imp = SimpleImputer(strategy='mean') # data = imp.fit_transform(data) # 分离特征和标签 X = data.drop('label', axis=1) y = data['label'] # 训练模 clf = DecisionTreeClassifier() clf.fit(X, y) ``` 2. 字符串处理 对于字符串特征,可以使用 One-Hot 编码或者标签编码将其转换为数值特征。 - One-Hot 编码:使用 `pandas` 库的 `get_dummies()` 函数将字符串特征转换为数值特征。 ```python import pandas as pd from sklearn.tree import DecisionTreeClassifier # 加载数据集 data = pd.read_csv('data.csv') # One-Hot 编码 data_encoded = pd.get_dummies(data) # 分离特征和标签 X = data_encoded.drop('label', axis=1) y = data_encoded['label'] # 训练模 clf = DecisionTreeClassifier() clf.fit(X, y) ``` - 标签编码:使用 `sklearn` 库的 `LabelEncoder` 类将字符串特征转换为数值特征。 ```python import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.preprocessing import LabelEncoder # 加载数据集 data = pd.read_csv('data.csv') # 标签编码 le = LabelEncoder() data['string_feature'] = le.fit_transform(data['string_feature']) # 分离特征和标签 X = data.drop('label', axis=1) y = data['label'] # 训练模 clf = DecisionTreeClassifier() clf.fit(X, y) ``` 需要注意的是,对于标签编码,要确保字符串特征是有序的,否则可能会影响模的性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值