我可能无法在这里找到我需要的帮助,但我希望互联网的智能编码器可以帮助我。我正在尝试使用Python的Sci-Kit学习SGDClassifier来对物理事件进行分类。这些物理事件创建了一个轨道(黑色和白色)的图像,我试图让分类器对它们进行分类。图像大约是500 * 400像素(不太确定)但是出于机器学习的目的,它给了我一个200640维度向量。我在200个事件的数据包中序列化了20000个列车事件。然后我有额外的2000次火车活动。以下是我如何进行提取和训练。
>>> from sklearn.linear_model import SGDClassifier
>>> import dill
>>> import glob
>>> import numpy as np
>>> clf = SGDClassifier(loss='hinge')
>>>for file in glob.glob('./SerializedData/Batch1/*.pkl'):
... with open(file, 'rb') as stream:
... minibatch = dill.load(stream)
... clf.partial_fit(minibatch.data, minibatch.target, classes=np.classes([1, 2]))
(Some output stuff about the classifier)
>>>
这是我的代码的列车部分,或者至少是它的粗略缩写。我确实有一个更复杂的分类器初始化。只是为了获得更多信息,minibatch.data
给出了一个numpy形状和特征的数组,因此这是一个“2维numpy数组”,形状为200,特征是200640.为了清除它,有一些描述像素的数组每个图像的值,然后其中200个包含在一个大数组中。 minibatch.target
给出了每个事件的所有类值的numpy数组
然而,经过20000次事件的训练后,我尝试测试分类器,它似乎根本没有接受过训练:
>>> file = open('./SerializedData/Batch2/train1.pkl', 'rb')
>>> test = dill.load(file)
>>> clf.predict(test.data)
array([ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2])
>>> clf.score(test.data)
.484999999999999999999
正如您所看到的,分类器正在为所有测试事件预测第2类。我现在唯一能想到的问题是我没有足够的测试事件,但我觉得很难相信。有没有人对这种困境有任何建议/解决方案/答案?
答案 0 :(得分:1)
除非你的图像格外简单,否则如果您的输入是图像,那么仅使用scikit就不会获得良好的效果。您需要以某种方式转换图像以获得实际有用的功能,像素值会产生可怕的功能。您可以尝试使用scikit-image中的一些工具来创建更好的功能,或者您可以使用一些预先训练的卷积神经网络为您提取功能。如果您感觉更有冒险精神,您可以尝试培训CNN,特别是对您的问题进行分类。