我正在尝试使用具有三维训练数据和二维目标数据的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
来完成此任务?感谢。
答案 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]])
奇妙!现在看看这是否适用于更大的东西。请随时提供建议,使其更清洁。