处理scikit-learn tree.decisiontreeclassifier

时间:2015-06-12 20:46:39

标签: python machine-learning scipy computer-vision scikit-learn

我正在尝试使用具有三维训练数据和二维目标数据的scikit-learn来做决策树。举个简单的例子,想象一下rgb图像。假设我的目标数据是1和0,其中1代表人脸的存在,0代表缺席。举个例子:

red         green        blue        face presence  

1000        0001         0011        0000    
0110        0110         0001        0110    
0110        0110         0000        0110     

rgb数据的数组代表训练数据,2d数组代表我的目标类(face,no-face)。

在Python中,这些数组可能如下所示:

rgb = np.array([[[1,0,0,0],[0,1,1,0],[0,1,1,0]],
               [[0,0,0,1],[0,1,1,0],[0,1,1,0]],
               [[0,0,1,1],[0,0,0,1],[0,0,0,0]]])

face = np.array([[0,0,0,0],[0,1,1,0],[0,1,1,0]])

不幸的是,这不起作用

import numpy as np
from sklearn import tree
dt_clf = tree.DecisionTreeClassifier()
dt_clf = dt_clf.fit(rgb, face)

这会抛出此错误:

  

找到带有暗淡的数组3.预期< = 2

我尝试过以多种方式对数据进行整形和展平,并得到另一个错误:

  

标签数= xxx与样本数不匹配

有谁知道如何使用tree.DecisionTreeClassifier来完成此任务?感谢。

1 个答案:

答案 0 :(得分:0)

我想我已经弄明白了。它不是很漂亮。也许有人可以提供一些清理代码的帮助。基本上,我需要将rgb数据组织成12个3元素数组的数组,或者shape =(12,3)。例如......

np.hsplit(np.dstack(rgb).flatten(), len(face.flatten()))

我也压平了面部数据,所以我最后的合适电话变成了......

dt_clf = dt_clf.fit(np.hsplit(np.dstack(rgb).flatten(), len(face.flatten())), 
                    face.flatten())

现在我可以测试一个新数据集并查看它是否有效。当显示红色和绿色像素时,目标图像表示面部存在,因此可以进行良好的测试......

red         green        blue 

1100        1100         0011  
1100        1100         0001  
0000        0000         0000

...或

predict = np.array([[[1,1,0,0],[1,1,0,0],[0,0,0,0]],
                    [[1,1,0,0],[1,1,0,0],[0,0,0,0]],
                    [[0,0,1,1],[0,0,0,1],[0,0,0,0]]])

所以......

predicted = dt_clf.predict(np.hsplit(np.dstack(predict).flatten(),
                           len(face.flatten())))

并将其恢复到适当的尺寸......

predicted = np.array(np.hsplit(predicted, face.shape[0]))

让我们

array([[1, 1, 0, 0],
       [1, 1, 0, 0],
       [0, 0, 0, 0]])

奇妙!现在看看这是否适用于更大的东西。请随时提供建议,使其更清洁。