【问题标题】:dealing with dimensions in scikit-learn tree.decisiontreeclassifier处理 scikit-learn tree.decisiontreeclassifier 中的维度
【发布时间】:2015-06-12 20:46:39
【问题描述】:

我正在尝试使用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)

这会引发此错误:

找到暗淡为 3 的数组。预期

我尝试了几种方法对数据进行整形和展平,但又遇到了另一个错误:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    太棒了!现在看看这是否适用于更大的事情。请随时提供建议以使此更清洁。

    【讨论】:

    • 至于使代码更清晰,请查看我在thread中对我的问题的回答...
    猜你喜欢
    • 2017-11-09
    • 2012-10-15
    • 2014-07-10
    • 2018-09-30
    • 2016-12-18
    • 2018-07-07
    • 2016-07-24
    • 2015-07-30
    • 2016-02-25
    相关资源
    最近更新 更多