在 scikit-learn 中处理维度 tree.decisiontreeclassifier

dealing with dimensions in scikit-learn tree.decisiontreeclassifier

我正在尝试使用 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 数据数组代表训练数据,二维数组代表我的目标 类(有脸、无脸)。

在 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)

这将引发此错误:

Found array with dim 3. Expected <= 2

我已尝试通过多种方式重塑和展平数据,但出现另一个错误:

Number of labels=xxx does not match number of samples

有谁知道我如何使用 tree.DecisionTreeClassifier 来完成这个?谢谢。

我想我已经弄明白了。它不是很漂亮。也许有人可以提供一些帮助来清理代码。基本上,我需要将 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]])

太棒了!现在看看这是否适用于更大的东西。请随时提出建议,使这个更清洁。