决策树实现以返回下一个分裂特征
假设我的数据是关于水果的,水果的特征包括颜色、形状等。我想要根据用户提供的特征,返回最多X种水果,并且希望能用最少的问题来实现这个目标。
我通常会先问用户水果的颜色和形状。根据用户的回答,我会再问K个其他特征,比如纹理、大小、皮的类型等等。我希望K的数量尽可能小,但又能返回最准确的X种结果。因此,我想知道接下来应该问用户哪个特征。
我的数据库里有水果的分类和特征(这些特征的值是随意的)。
这算不算是一个机器学习的问题?我应该使用什么算法,具体该怎么实现?我试着在scikit-learn、nltk和weka中寻找合适的算法来解决这个问题,但要么这些算法不适合,要么我需要更具体的指导来使用它们。
谢谢!
2 个回答
1
是的,没错。
决策树会把数据点映射到每个特征上,然后找到最佳的分割点。这个分割点可以通过不同的标准来确定,比如:基尼指数或者熵(信息增益)。在Sci-kit Learn中,这些功能可以在sklearn.tree找到。
假设你有5个数据点:
color shape fruit
orange oblong orange
red round apple
orange round orange
red oblong apple
red round apple
所以在训练时,你可以这样做:
feature class | feature class
orange orange | oblong orange
red apple | round apple
orange orange | round orange
red apple | oblong apple
red apple | round apple
从上面可以看出,最佳的分割点是颜色,因为在这个数据集中,如果颜色是红色,那么水果就是苹果;如果颜色是橙色,那么水果就是橙子。
通过这些数据点进行训练后,你会得到这样的决策树:
color
___________________
| |
| |
red orange
apple orange
在现实生活中,这些分割通常是基于数值的,比如 num > .52
。
至于使用什么算法,这要看具体情况。你需要根据自己的数据进行研究,因为这更多是针对每个数据集和个人偏好的选择。
你可以在上面的例子中使用Sci-kit Learn,像这样:
from sklearn.trees import DecisionTreeClassifier
#make your sample matrix
samples = [[1,1], [0,0], [1,0], [0,1], [0,0]]
#make your target vector ( in this case fruit)
fruitname = [1, 0, 1, 0, 0]
#create and fit the model
dtree = DecisionTreeClassifier()
dtree = dtree.fit(samples, fruitname)
#test an unknown red fruit that is oblong
dtree.predict([0,1])
注意,颜色=1表示水果是橙色,形状=1表示水果是椭圆形。
可以查看Sci-kit的用户指南,以获取更详细的概述。