exponenta event banner

Классификация вин

Этот пример иллюстрирует, как нейронная сеть распознавания образов может классифицировать вина по винодельческим предприятиям на основе их химических характеристик.

Проблема: классифицировать вина

В этом примере мы пытаемся построить нейронную сеть, которая может классифицировать вина из трех винодельческих предприятий по тринадцати атрибутам:

  • Алкоголь

  • Яблочная кислота

  • Пепел

  • Щелочность золы

  • Магний

  • Всего фенолов

  • Флавониды

  • Нефлавоноидные фенолы

  • Проантоцианидины

  • Интенсивность цвета

  • Оттенок

  • OD280/OD315 разбавленных вин

  • Пролин

Это пример проблемы распознавания образов, где входные данные связаны с различными классами, и мы хотели бы создать нейронную сеть, которая не только классифицирует известные вина должным образом, но и может обобщать, чтобы точно классифицировать вина, которые не были использованы для разработки решения.

Почему нейронные сети?

Нейронные сети очень хорошо справляются с проблемами распознавания образов. Нейронная сеть с достаточным количеством элементов (называемых нейронами) может классифицировать любые данные с произвольной точностью. Они особенно хорошо подходят для сложных граничных задач принятия решений по многим переменным. Поэтому нейросети - хороший кандидат для решения задачи классификации вин.

Тринадцать атрибутов окрестности будут действовать как входы в нейронную сеть, и соответствующей целью для каждого будет 3-элементный вектор класса с 1 в положении соответствующей винодельни, # 1, # 2 или # 3.

Сеть будет проектироваться с использованием атрибутов окрестностей для обучения сети созданию правильных целевых классов.

Подготовка данных

Данные для задач классификации настраиваются для нейронной сети путем организации данных в две матрицы, входную матрицу X и целевую матрицу T.

Каждый i-й столбец входной матрицы будет иметь тринадцать элементов, представляющих вино, винодельня которого уже известна.

Каждый соответствующий столбец целевой матрицы будет иметь три элемента, состоящих из двух нулей и 1 в местоположении соответствующей винодельни.

Здесь загружается такой набор данных.

[x,t] = wine_dataset;

Мы можем просмотреть размеры входов X и целей T.

Обратите внимание, что и X, и T имеют 178 столбцов. Они представляют 178 атрибутов (входов) образца вина и связанные с ними векторы класса винодельни (цели).

Входная матрица X имеет тринадцать строк для тринадцати атрибутов. Целевая матрица T имеет три строки, так как для каждого примера у нас есть три возможных винодельни.

size(x)
ans = 1×2

    13   178

size(t)
ans = 1×2

     3   178

Распознавание образов с помощью нейронной сети

Следующий шаг - создать нейросеть, которая научится классифицировать вина.

Поскольку нейронная сеть начинается со случайных начальных весов, результаты этого примера будут немного отличаться при каждом запуске.

Двухслойные (то есть однослойные скрытые) передающие нейронные сети могут узнать любую взаимосвязь между входом и выходом, учитывая достаточное количество нейронов в скрытом слое. Слои, которые не являются выходными слоями, называются скрытыми слоями.

Мы попробуем один скрытый слой из 10 нейронов для этого примера. В общем, более сложные проблемы требуют больше нейронов и, возможно, больше слоев. Более простые проблемы требуют меньше нейронов.

Входные и выходные данные имеют размеры 0, поскольку сеть еще не настроена на соответствие нашим входным и целевым данным. Это произойдет, когда сеть будет обучена.

net = patternnet(10);
view(net)

Сейчас сеть готова к обучению. Образцы автоматически разделяются на обучающие, проверочные и тестовые наборы. Обучающий набор используется для обучения сети. Обучение продолжается до тех пор, пока сеть продолжает улучшаться на наборе проверки. Тестовый набор обеспечивает полностью независимое измерение точности сети.

Обучающий инструмент нейронной сети показывает обучаемую сеть и алгоритмы, используемые для ее обучения. Он также отображает состояние обучения во время обучения и критерии, которые остановили обучение, будут выделены зеленым цветом.

Кнопки внизу открывают полезные графики, которые можно открывать во время и после обучения. Ссылки рядом с именами алгоритмов и кнопками графика открывают документацию по этим темам.

[net,tr] = train(net,x,t);
nntraintool
nntraintool('close')

Чтобы узнать, как улучшилась производительность сети во время обучения, нажмите кнопку «Performance» в инструменте обучения или вызовите команду PLOTPERFORM.

Производительность измеряется в виде среднеквадратичной ошибки и отображается в логарифмической шкале. Он быстро уменьшался по мере обучения сети.

Производительность отображается для каждого из наборов обучения, проверки и тестирования.

plotperform(tr)

Figure Performance (plotperform) contains an axes. The axes with title Best Validation Performance is 0.072181 at epoch 4 contains 6 objects of type line. These objects represent Train, Validation, Test, Best.

Тестирование сети

Средняя квадратичная ошибка обученной нейронной сети теперь может быть измерена относительно тестируемых образцов. Это даст нам представление о том, насколько хорошо будет работать сеть при применении к данным из реального мира.

Сетевые выходы будут находиться в диапазоне от 0 до 1, поэтому мы можем использовать функцию vec2ind, чтобы получить индексы класса как позицию высшего элемента в каждом выходном векторе.

testX = x(:,tr.testInd);
testT = t(:,tr.testInd);

testY = net(testX);
testIndices = vec2ind(testY)
testIndices = 1×27

     1     1     1     1     1     1     1     2     2     2     2     2     2     2     2     2     2     2     2     3     3     3     3     3     3     3     3

Другой мерой того, насколько хорошо нейронная сеть подходит к данным, является график путаницы. Здесь матрица путаницы нанесена на график по всем образцам.

Матрица путаницы показывает процентное соотношение правильных и неправильных классификаций. Правильными классификациями являются зелёные квадраты на диагонали матриц. Неправильные классификации образуют красные квадраты.

Если сеть научилась правильно классифицировать, проценты в красных квадратах должны быть очень маленькими, что указывает на несколько ошибочных классификаций.

Если это не так, то было бы желательно дальнейшее обучение или обучение сети с большим количеством скрытых нейронов.

plotconfusion(testT,testY)

Figure Confusion (plotconfusion) contains an axes. The axes with title Confusion Matrix contains 50 objects of type patch, text, line.

Вот общие проценты правильной и неправильной классификации.

[c,cm] = confusion(testT,testY)
c = 0
cm = 3×3

     7     0     0
     0    12     0
     0     0     8

fprintf('Percentage Correct Classification   : %f%%\n', 100*(1-c));
Percentage Correct Classification   : 100.000000%
fprintf('Percentage Incorrect Classification : %f%%\n', 100*c);
Percentage Incorrect Classification : 0.000000%

Третьей мерой того, насколько хорошо нейронная сеть имеет данные соответствия, является график рабочих характеристик приемника. Это показывает, как ложноположительные и истинные положительные показатели соотносятся, поскольку пороговое значение выходных данных варьируется от 0 до 1.

Чем дальше слева и вверх линия, тем меньше ложных срабатываний необходимо принять, чтобы получить высокую истинную положительную скорость. Лучшие классификаторы будут иметь линию, идущую от левого нижнего угла, к левому верхнему углу, к правому верхнему углу или близко к нему.

plotroc(testT,testY)

Figure Receiver Operating Characteristic (plotroc) contains an axes. The axes with title ROC contains 6 objects of type line. These objects represent Class 1, Class 2, Class 3.

Этот пример иллюстрирует, как создать нейронную сеть, которая классифицирует вина на три винодельни по характеристикам каждого вина.

Изучите другие примеры и документацию для более глубокого понимания нейронных сетей и их приложений.