1

Возможно, мне не удастся найти необходимую мне помощь, но я надеюсь, что умные кодеры Интернета могут мне помочь. Я пытаюсь использовать 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 для всех тестовых событий. Единственная проблема, о которой я могу сейчас думать, это то, что у меня недостаточно тестовых событий, но мне трудно поверить. Есть ли у кого-нибудь предложения/решения/ответы на это затруднительное положение?

+1

Является ли ваш набор данных сбалансированным? Также помните, что вы сейчас пытаетесь использовать ** linear **. Может быть, можно использовать некоторые нелинейные? SVM или какой-то ансамблевый метод? Если у вас недостаточно памяти - возможно, можно сжать данные с помощью PCA или какой-либо другой метод выбора/извлечения функции? –

+0

У меня достаточно памяти, потому что я открываю сериализованные пакеты по одному. Я использую только линейную оценку, потому что классификатор LinearSVM выполнял с 60-процентной точностью, когда тренировался только на 1200 событиях, однако мне нужен метод, в котором я мог бы обучить более 1200 событий и, таким образом, решил использовать SGD с функцией потери петли. По сути, мне нужно использовать метод partial_fit. –

+1

Может быть, это просто плохие параметры для классификатора. Как вы создаете экземпляр объекта классификатора? Пробовали ли вы случайное поисковое резюме? – IVlad

ответ

1

Если ваши изображения не являются простыми, вы не получите хороших результатов, используя только scikit, если ваши входы являются изображениями. Вам нужно каким-то образом преобразовать изображения, чтобы получить действительно полезные функции, пиксельные значения делают ужасные функции. Вы можете попробовать использовать некоторые из инструментов в scikit-image, чтобы создавать улучшенные функции, или вы можете использовать некоторые из предварительно подготовленных сверточных нейронных сетей для извлечения функций для вас. Если бы вы чувствовали себя более предприимчивыми, вы могли бы попытаться обучить CNN, чтобы классифицировать вашу проблему в частности.

Смежные вопросы