Возможно, мне не удастся найти необходимую мне помощь, но я надеюсь, что умные кодеры Интернета могут мне помочь. Я пытаюсь использовать Sci-Kit Python, чтобы изучить SGDClassifier для классификации физических событий. Эти физические события создают образ трека (черно-белый), и я пытаюсь получить классификатор для их классификации. Изображения составляют около 500 * 400 пикселей (не совсем уверен), но для целей машинного обучения он дает мне размерность в формате 200640. У меня 20000 событий поезда, сериализованных в пакетах данных из 200 событий. Затем у меня есть дополнительные 2000 поездов. Вот как я занимаюсь извлечением и обучением.Sci-Kit Изучите проблемы с классификатором SGD
>>> 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
дает множество массивов форм и функций, так что это «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 для всех тестовых событий. Единственная проблема, о которой я могу сейчас думать, это то, что у меня недостаточно тестовых событий, но мне трудно поверить. Есть ли у кого-нибудь предложения/решения/ответы на это затруднительное положение?
Является ли ваш набор данных сбалансированным? Также помните, что вы сейчас пытаетесь использовать ** linear **. Может быть, можно использовать некоторые нелинейные? SVM или какой-то ансамблевый метод? Если у вас недостаточно памяти - возможно, можно сжать данные с помощью PCA или какой-либо другой метод выбора/извлечения функции? –
У меня достаточно памяти, потому что я открываю сериализованные пакеты по одному. Я использую только линейную оценку, потому что классификатор LinearSVM выполнял с 60-процентной точностью, когда тренировался только на 1200 событиях, однако мне нужен метод, в котором я мог бы обучить более 1200 событий и, таким образом, решил использовать SGD с функцией потери петли. По сути, мне нужно использовать метод partial_fit. –
Может быть, это просто плохие параметры для классификатора. Как вы создаете экземпляр объекта классификатора? Пробовали ли вы случайное поисковое резюме? – IVlad