在 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]])
太棒了!现在看看这是否适用于更大的东西。请随时提出建议,使这个更清洁。
我正在尝试使用 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]])
太棒了!现在看看这是否适用于更大的东西。请随时提出建议,使这个更清洁。