决策树实现以返回下一个分裂特征

3 投票
2 回答
1754 浏览
提问于 2025-04-17 17:33

假设我的数据是关于水果的,水果的特征包括颜色、形状等。我想要根据用户提供的特征,返回最多X种水果,并且希望能用最少的问题来实现这个目标。

我通常会先问用户水果的颜色和形状。根据用户的回答,我会再问K个其他特征,比如纹理、大小、皮的类型等等。我希望K的数量尽可能小,但又能返回最准确的X种结果。因此,我想知道接下来应该问用户哪个特征。

我的数据库里有水果的分类和特征(这些特征的值是随意的)。

这算不算是一个机器学习的问题?我应该使用什么算法,具体该怎么实现?我试着在scikit-learn、nltk和weka中寻找合适的算法来解决这个问题,但要么这些算法不适合,要么我需要更具体的指导来使用它们。

谢谢!

2 个回答

0

是的,这其实是一个机器学习的问题(可以这么理解)。我建议你使用决策树的方法,这种方法有很多不同的算法可供选择。ID3C4.5是比较简单的算法,它们可以帮助你减少树的深度,因为它们会根据最大信息增益来决定下一个问题(也就是下一个分裂树的特征)。

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的用户指南,以获取更详细的概述。

撰写回答