【问题标题】:Sci-Kit Learn SGD Classifier problems predictingScikit Learn SGDClassifier 问题预测
【发布时间】: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


【解决方案1】:

除非您的图像非常简单,否则仅使用 scikit learn 如果您的输入是图像,您将不会获得好的结果。您需要以某种方式转换图像以获得实际有用的特征,像素值会产生可怕的特征。您可以尝试使用scikit-image 中的一些工具来创建更好的特征,或者您可以使用一些预训练的卷积神经网络来为您提取特征。如果你感觉更冒险,你可以尝试训练一个 CNN 来对你的问题进行分类。

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 2014-10-23
    • 2020-03-04
    • 2018-01-09
    • 2015-03-11
    • 2015-01-12
    • 2021-05-25
    • 2016-04-01
    相关资源
    最近更新 更多