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

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

Задача: классифицировать вина

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

  • Алкоголь

  • Малиновая кислота

  • Пепел

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

  • Магний

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

  • Флавониды

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

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

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

  • Оттенок

  • 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)

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

Neural Network Training Tool показывает обучаемую сеть и алгоритмы, используемые для ее обучения. В нем также отображается состояние обучения во время обучения, и критерии, которые остановили обучение, будут выделены зеленым цветом.

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

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

Чтобы увидеть, как улучшилась производительность сети во время обучения, либо нажмите кнопку «Эффективность» в обучающем инструменте, либо вызовите 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.

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

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