机器人之机器学习之离散值处理
小标 2018-10-17 来源 : 阅读 1825 评论 0

摘要:本文主要向大家介绍了机器人之机器学习之离散值处理,通过具体的内容向大家展现,希望对大家学习机器人有所帮助。

本文主要向大家介绍了机器人之机器学习之离散值处理,通过具体的内容向大家展现,希望对大家学习机器人有所帮助。


前面我们学习了分类决策树,下面我们以周志华的机器学习书上的西瓜数据作为训练集练习以下,数据集如下。

X = [['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑'],['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑'],['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑'],['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑'],['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑'],['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘'],['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘'],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑'],['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑'],['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘'],['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑'],['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘'],['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑'],['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑'],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘'],['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑'],['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑']]Y = ['是', '是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否']

如果你直接将这个数据集传入决策树,则会运行出错,错误信息如下。

ValueError: could not convert string to float: '青绿'

为什么会出现这样的错误呢?这是因为决策树在训练中,会把数据转换为np.float32类型,但你的输入数据是string类型,还是中文,无法进行转换,所以出错。在sklearn中提供了独热编码(One-Hot Encoding)来解决这样的问题。

下面我们来了解下什么是独热编码,它又是如何将离散的数据进行编码的。独热编码就是用M个寄存器来标识M个状态,每一个状态对应指定的寄存器。下面举个例子。

比如人的性别属性可以取值为{"male","female","others"},即人的性别有三种状态,我们可以使用三个寄存器来唯一标识。比如"male"可以编码100,"female"编码为010,"others"编码为001。再比如人的肤色属性可以取值为{"yellow","white","black"},则"yellow"编码为100,"white"编码为010,"black"编码为001。

对于有多个属性怎么编码呢?就是将每个属性的单独编码拼接起来就可以。比如有个人的性别为"male",肤色为"black",则他的编码为100001。

了解了独热编码是怎么编码的,我们就想直接把西瓜数据集进行独热编码,但很抱歉还是会出错。为什么呢,查看One-Hot Encoding的使用方法后发现输入数据只能是int类型。什么意思呢,下面举个例子。

还是以人的性别属性可以取值为{"male","female","others"}为例,我们不能直接传入One-Hot Encoding,而是先将{"male","female","others"}标识为{0,1,2}再传入One-Hot Encoding中,这样就得到了独热编码。这里可能有的人就问了:“为什么不直接把{0,1,2}作为编码直接传入决策树,这是因为如果直接传入,决策树是把它当作连续值处理的,也就认为属性的值是有序的,但我们知道性别是离散属性,属性值是无序的。

from sklearn import preprocessingenc = preprocessing.OneHotEncoder()print(enc.fit_transform([[0],[1],[2]]).toarray())
[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]

所以我们第一步要做的就是先将属性用数字标识,好在sklearn提供了LabelBinarizer类。比如西瓜数据集的第一列属性会被标识成[2 0 0 2 1 2 0 0 0 2 1 1 2 1 0 1 2]。将西瓜数据集的所有属性利用LabelBinarizer类标识的代码如下。

Xdf = pd.DataFrame(X)le = preprocessing.LabelEncoder()for col in Xdf.columns:f = le.fit_transform(Xdf[col])Xdf[col] = fprint(Xdf)
0  1  2  3  4  50   2  2  1  1  0  01   0  2  0  1  0  02   0  2  1  1  0  03   2  2  0  1  0  04   1  2  1  1  0  05   2  1  1  1  2  16   0  1  1  2  2  17   0  1  1  1  2  08   0  1  0  2  2  09   2  0  2  1  1  110  1  0  2  0  1  011  1  2  1  0  1  112  2  1  1  2  0  013  1  1  0  2  0  014  0  1  1  1  2  115  1  2  1  0  1  016  2  2  0  2  2  0

再将标识好的数据集One-Hot Encoding进行独热编码。代码如下。

enc = preprocessing.OneHotEncoder()Xdf_enc = enc.fit_transform(Xdf).toarray()print(Xdf_enc)
[[0. 0. 1. 0. 0. 1. 0. 1. 0. 0. 1. 0. 1. 0. 0. 1. 0.][1. 0. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0.][1. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0. 1. 0. 0. 1. 0.][0. 0. 1. 0. 0. 1. 1. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0.][0. 1. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0. 1. 0. 0. 1. 0.][0. 0. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 1.][1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 1.][1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 1. 0.][1. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 1. 0. 0. 1. 1. 0.][0. 0. 1. 1. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0. 0. 1.][0. 1. 0. 1. 0. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 1. 0.][0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 1. 0. 0. 1.][0. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 1. 1. 0. 0. 1. 0.][0. 1. 0. 0. 1. 0. 1. 0. 0. 0. 0. 1. 1. 0. 0. 1. 0.][1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 1.][0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 1. 0. 1. 0.][0. 0. 1. 0. 0. 1. 1. 0. 0. 0. 0. 1. 0. 0. 1. 1. 0.]]

最后就可以传入决策树进行训练了,代码如下。

clf = tree.DecisionTreeClassifier()clf.fit(Xdf_enc,Y)

这样决策树就构建了,如果你要对一个数据样本进行预测,你就要先对这个样本进行LabelBinarizer和独热编码了,再传入决策树进行预测。我们在原始数据集进行预测。

print(clf.predict(Xdf_enc))
['是' '是' '是' '是' '是' '是' '是' '是' '否' '否' '否' '否' '否' '否' '否' '否' '否']

到此,我们就知道了离散属性如何处理了。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能智能机器人频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程