【发布时间】:2015-12-19 23:15:57
【问题描述】:
我可能无法在这里找到我需要的帮助,但我希望互联网的智能编码器可以帮助我。我正在尝试使用 Python 的 Sci-Kit learn 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 数组,因此这是一个“二维 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。目前我能想到的唯一问题是我没有足够的测试事件,但我觉得这很难相信。有人对这种困境有任何建议/解决方案/答案吗?
【问题讨论】:
-
你的数据集平衡了吗?还请记住,您现在正在尝试使用 linear 估计器。也许可以使用一些非线性? SVM 还是某种 Ensemble 方法?如果您没有足够的内存 - 也许可以使用 PCA 或其他一些特征选择/提取方法来压缩数据?
-
我有足够的内存,因为我一一打开序列化的包。我在这里只使用线性估计器,因为 LinearSVM 分类器在仅对 1200 个事件进行训练时以 60% 的准确率执行,但是我需要一种方法,我可以负担得起训练超过 1200 个事件,因此决定使用带有铰链损失函数的 SGD。本质上我需要使用 partial_fit 方法。
-
可能只是分类器的错误参数。你如何实例化你的分类器对象?你试过随机网格搜索简历吗?
-
从@Olologin 恢复问题,可能是您的数据集不平衡,即您有80% 的训练实例属于2 类,而只有20% 属于类1. 如果发生这种情况,分类器将偏向第 2 类(使第 2 类的预测更有可能)。查看
class_weight参数,默认情况下所有类的权重为1。我建议尝试使用class_weight='auto',因为它会分配与训练集中的类频率成反比的类权重。 -
训练集是平衡的,不过我会尝试你的建议
标签: python machine-learning scikit-learn classification data-analysis