Машинное обучение
В третьей части анализа аудиоданных мы разберем относительно простой и более быстрый способ классификации аудиофайлов - алгоритм машинного обучения - SVM (Support Vector Machines) / машины опорных векторов.
В двух частях анализа аудиоданных мы рассмотрели характеристики, которые есть у каждого аудиосигнала и извлечение значимых характеристик.
Мы получили набор данных, содержащий значимые характеристики аудиоданных (45 значений) в машиночитаемом виде - Двухмерная таблица - Dataframes, состоящая из 47 столбцов и 50000 строк.
Все признаки (характеристики) важны при анализе аудиоданных, так как описывают физические свойства звука: высоту, громкость, тембр и т. д.
При прохождении воздуха через голосовые связки возникают вибрации, которые в виде упругих волн распространяются в среде. Каждый звук представляет собой набор волн. Это основной тон - волны гендерной идентификации ( у каждого говорящего базовая частота основного тона индивидуальна и обусловлена особенностями строения гортани, в среднем для мужского голоса она составляет от 80 до 210 Гц, для женского - от 150 до 320 Гц. ). Это волны - обертоны ( призвуки, которые выше основного тона) и волны форманты (распознавание речи) связанные с уровнем частоты голосового тона, которые образуют тембр звука.
Аудиосигнал, как амплитуда ко времени и частоте
Преобразование Фурье разлагает функцию времени (сигнал) на составляющие частоты, которые отображают амплитуду каждой частоты в сигнале. В каждой частоте с помощью признаков (характеристик) анализируем плотность, мощность сигнала, высоту (зависит от частоты (число звуковых колебаний за 1 сек) низкочастотные, среднечастотные, высокочастотные) , длительность, громкость (сила звука, которая определяется амплитудой колебаний: чем она больше, тем звук получается громче), тембр (окраска звука), интенсивность , спектральный состав ( волны основного тона, обертоны, форманты) и другие физические свойства звука в определенный промежуток времени.
Все характеристики есть у каждого аудиосигнала. Выбор значимых характеристик зависит от исследователя и той задачи, которую он решает и способа решения.
Для решения своей задачи я использую алгоритм Машинного обучения. У меня в наборе данных - 50000 тысяч аудио записей. И в ручную прослушать записи, просмотреть все характеристики аудиосигнала и найти закономерности просто нереально.
Знание и понимание как выглядит звук и какие признаки (фичи) можно извлечь очень важно для построения модели машинного обучения, чтобы компьютер сам просмотрел 50000 строк и 45 значений в каждой строке (характеристики, фичи), изучил их, сравнил все характеристики и нашел закономерности и далее смог использовать этот опыт для решения той же проблемы в новых ситуациях, и на новых данных. Это и есть машинное обучение, которое охватывает статистическую часть искусственного интеллекта.
Что же такое машинное обучение?
Машинное обучение - это область, которая развилась из искусственного интеллекта. Было желание создавать интеллектуальные машины, и оказалось, что существует несколько простых вещей, которые можно запрограммировать - например, как найти кратчайший путь от А до B.
Но в большинстве случаев специалисты просто не знали, как писать программы искусственного интеллекта, выполняющие что-то более интересное, например, веб - поиск, анализ фотографий или выявление спама в электронной почте.
Возникло ощущение, что единственный способ сделать это - это заставить машину научиться этому самостоятельно.
Даже среди специалистов, практикующих машинное обучение (machine learning - ML), нет общепринятого определения что является, а что не является машинным обучением.
Машинное обучение это область обучения, которая дает компьютерам возможность учиться без явного программирования.
Вот более современное определение Тома Митчелла (Tom Mitchell, 1998г):
“Компьютерная программа обучается на основе опыта E по отношению к некоторому классу задач T и меры качества P, если качество решения задач из T, измеренное на основе P, улучшается с приобретением опыта E. ”
Для примера игра в шашки, опытом E будет опыт, который программа получала, играя десятки тысяч игр против себя. Задачей T - игра в шашки и мерой качества P - вероятность выигрыша в следующей игре против нового оппонента.
Типы обучающих алгоритмов
Есть несколько типов обучающих алгоритмов - обучение с учителем (Supervised learning) , обучением без учителя (Unsupervised learning), обучение с подкреплением (reinforcement learning), рекомендательные системы (recommender systems).
Основные два типа обучающих алгоритмов:
обучение с учителем (Supervised learning)
обучением без учителя (Unsupervised learning)
В обучении с учителем главная идея заключается в том, мы обучаем компьютер как делать что-то.
Тогда как в обучении без учителя, мы позволяем компьютеру обучаться самостоятельно (алгоритм кластеризации). Алгоритм автоматически обнаруживает структуру в данных и разделяет на типы (классы), которые изначально были не известны.
Supervised learning - обучение с учителем (контролируемое обучение)
Этот тип обучения назван обучением с учителем потому, что мы дали алгоритму набор данных, который уже содержит «правильные ответы».
Основной задачей алгоритма обучения с учителем является производство наибольшего числа правильных ответов.
Алгоритм контролируемого обучения подразделяется на задачи регрессии и классификации.
В задачах регрессии мы пытаемся предсказать результаты в рамках непрерывного вывода, что означает, что мы пытаемся сопоставить входные переменные с некоторой непрерывной функцией, прогнозировать значение непрерывной величины (цена, возраст и др. количественные значения).
Например, Учитывая данные о размерах домов спрогнозировать их цену.
Цена как функция от размера домов является непрерывным выходом - поэтому это задача регрессии
В задачах классификации мы пытаемся предсказать результаты на дискретном выходе. Другими словами, мы пытаемся сопоставить входные переменные по дискретным категориям ( 0 или 1 , первый тип, второй тип или третий тип). Классификация пытается узнать связь между набором переменных объектов и целевой переменной, представляющей интерес.
Например, Предсказать - является ли опухоль злокачественной или доброкачественной (используем, например, два признака: возраст пациента и размер опухоли)
Классификация может использоваться для фильтрации электронной почты, распознавания речи, распознавания рукописного текста, биометрической идентификации, классификации документов и многое другое.
Для некоторых задач недостаточно использовать 3 или 5 признаков, нужно задействовать бесконечное число параметров, чтобы алгоритм мог опираться на множество различных характеристик ( признаков) при составления прогноза.
Cуществует алгоритм, который называется «метод опорных векторов» (Support Vector Machine, SVM), который позволяет компьютеру использовать бесконечное число признаков.
Типы (модели) алгоритмов классификации
Существует множество типов алгоритмов классификации.
SVM (Support Vector Machines) / машины опорных векторов
Support Vector Machine - это контролируемый алгоритм - обучение с учителем (Supervised learning), который может классифицировать случаи путем поиска разделителя.
SVM также называется большим классификатором поля. SVM функционирует как большой классификатор полей, который пытается отделить положительные и отрицательные примеры с максимально большим запасом.
SVM работает путем первого сопоставления данных с пространством пространственных объектов с высокой размерностью, так что точки данных могут быть классифицированы, даже если данные не могут быть линейно разделены. Затем вычисляется разделитель для данных.
Две категории могут быть разделены кривой, но не линией.
Мы можем перенести эти данные в более пространственное пространство, например, сопоставив их с трехмерным пространством.
После преобразования граница между двумя категориями может быть определена гиперплоскостью. Так как мы сейчас находимся в трехмерном пространстве, разделитель отображается как плоскость.
Эта плоскость может использоваться для классификации новых или неизвестных случаев. Поэтому алгоритм SVM выводит оптимальную гиперплоскость, которая классифицирует новые примеры.
Теперь нужно рассмотреть два вопроса:
Во-первых, как мы передаем данные таким образом, чтобы разделитель мог быть нарисован как гиперплоскость?
И во-вторых, как мы можем найти лучший или оптимизированный разделитель гиперплоскости после преобразования?
Преобразование данных
Давайте сначала рассмотрим преобразование данных, чтобы увидеть, как это работает. Для простоты представьте себе, что наш набор данных - это одномерные данные.
Это означает, что у нас есть только одна функция x. Как вы можете видеть, она не линейно разделена. Так что мы можем здесь сделать?
Мы можем перенести его в двумерное пространство. Обратите внимание, что, поскольку мы находимся в двумерном пространстве, гиперплоскость представляет собой линию, разделяющую плоскость на две части, где каждый класс лежит на обеих сторонах.
Отображение данных в более высоком пространственном пространстве называется, кернелингом.
Математическая функция, используемая для преобразования , известна как функция ядра и может быть различных типов, таких как линейная, полиномиальная, радиальная базисная функция ( RBF) и сигмоид.
Каждая из этих функций имеет свои характеристики, свои плюсы и минусы, а также свое уравнение ( большинство из них уже реализованы в библиотеках языков программирования данных). Кроме того, поскольку нет простого способа узнать, какая функция лучше всего работает с любым набором данных, обычно выбирают разные функции и сравнивают результаты.
Как найти правильный или оптимизированный разделитель после преобразования?
Один разумный выбор в качестве лучшей гиперплоскости является тот, который представляет наибольшее разделение или поле между двумя классами. Таким образом, цель состоит в том, чтобы выбрать гиперплоскость с как можно большим запасом.
Данные, ближайшими к гиперплоскости, являются векторы поддержки.
Для достижения цели важны только векторы поддержки. И нужно найти гиперплоскость таким образом, чтобы она имела максимальное расстояние для поддержки векторов. Гиперплоскость извлекается из обучающих данных с помощью процедуры оптимизации, которая максимизирует маржу. И, как и многие другие проблемы, эта оптимизационная задача также может быть решена с помощью градиентного спуска.
Основные библиотеки для машинного обучения
В Python уже реализовано множество модулей и библиотек для машинного обучения.
Библиотеки Python представляют собой набор функций и методов, которые позволяют выполнять множество действий без написания кода.
Библиотека Pandas - это очень высокоуровневая библиотека Python , которая обеспечивает высокую производительность простых в использовании структур данных. Он имеет множество функций для импорта данных, эффективной обработки и анализа данных.
В частности, он предлагает структуры данных и операции для манипулирования числовыми таблицами (двухмерные таблицы - Dataframes)
NumPy, который является математической библиотекой для работы с N-мерными массивами в Python. Это позволяет выполнять вычисления эффективно и быстро. Быстрая обработка массива данных.
SciPy - это набор числовых алгоритмов и наборов инструментов для конкретных областей, включая обработку сигналов, оптимизацию, статистику и многое другое.
Matplotlib - это библиотека для визуализации данных
SciKit Learn - это набор алгоритмов и инструментов для машинного обучения. SciKit Learn имеет большинство алгоритмов классификации, регрессии и кластеризации, и он предназначен для работы с числовыми и научными библиотеками Python: NumPy и SciPy. Реализация моделей машинного обучения с помощью SciKit Learn очень проста с несколькими строками кода Python.
Большинство задач, которые необходимо выполнить в процессе машинного обучения, уже реализованы в Scikit Learn, включая предварительную обработку данных, выбор объектов, извлечение объектов, Стандартизации набора данных, Разделение набора данных на тренировочные и тестовые наборы (train/test split), модели алгоритмов, модели установки, параметры настройки, прогнозирование, оценку (метрики для оценки точности модели), и экспорт модели (сохранение модели).
SciKit Learn сначала нужно установить. В терминале прописываем:
pip install scikit-learn
Для анализа необходимо импортировать библиотеки Python и загрузить данные.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import librosa
import os
import pathlib
import pylab as pl
import scipy.optimize as opt
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
import csv
Для загрузки используется метод Pandas read.csv(). В скобках указывается путь к файлу в кавычках, чтобы Pandas считывал файл во фрейм данных (Dataframes - df) с этого адреса. Путь к файлу может быть URL адрес или вашим локальным адресом файла.
data = pd.read_csv('../input/datatrain/dataset.csv')
data
Мы получили набор данных, содержащий значимые характеристики аудиоданных (45 значений) в машиночитаемом виде - Двухмерная таблица - Dataframes, состоящая из 47столбцов и 50000 строк.
Разделим наши данные на зависимую (целевую) - (у) переменную и независимые -(х) переменные.
Классификация пытается узнать связь между набором переменных характеристик (х) и целевой переменной (у)
Целевой атрибут в классификации является категориальной переменной в колонке 'label' - это метка (правильный ответ). Учитывая набор обучающих точек данных вместе с целевыми метками, классификация определяет метку класса для немаркированного тестового случая.
Цель прогноза классификация “живого” голоса (human) и его отделению от синтетического/конвертированного/перезаписанного голоса (spoof).
Классификация заключается в использовании существующих данных, которые имеют информацию об аудиосигнале - значимые характеристики аудиоданных (45 значений), для создания классификатора, который смог бы использовать этот опыт для решения той же проблемы в новых ситуациях, и на новых данных, а затем и маркировки новых данных.
Метод - value_counts(). Подсчет значений - это хороший способ понять, сколько единиц каждой характеристики / переменной у нас есть.
Посмотрим на подсчет значений в колонке 'label'.
data['label'].value_counts()
y - зависимая (целевая) переменная это колонка 'label' в нашем наборе данных
Чтобы использовать библиотеку scikit-learn, нам нужно преобразовать Dataframes (фрейм данных) Pandas в массив Numpy.
y = data['label'].values
y[0:5]
array(['human', 'human', 'human', 'human', 'human'], dtype=object)
Посмотрим на название колонок в наборе данных:
data.columns
X - независимые переменные. Это значимые характеристики аудиоданных (45 значений)
X = data[['mfcc_mean1', 'mfcc_mean2', 'mfcc_mean3', 'mfcc_mean4',
'mfcc_mean5', 'mfcc_mean6', 'mfcc_mean7', 'mfcc_mean8', 'mfcc_mean9',
'mfcc_mean10', 'mfcc_mean11', 'mfcc_mean12', 'mfcc_mean13',
'mfcc_mean14', 'mfcc_mean15', 'mfcc_mean16', 'mfcc_mean17',
'mfcc_mean18', 'mfcc_mean19', 'mfcc_mean20', 'mfcc_std1', 'mfcc_std2',
'mfcc_std3', 'mfcc_std4', 'mfcc_std5', 'mfcc_std6', 'mfcc_std7',
'mfcc_std8', 'mfcc_std9', 'mfcc_std10', 'mfcc_std11', 'mfcc_std12',
'mfcc_std13', 'mfcc_std14', 'mfcc_std15', 'mfcc_std16', 'mfcc_std17',
'mfcc_std18', 'mfcc_std19', 'mfcc_std20', 'cent_mean', 'cent_std',
'cent_skew', 'rolloff_mean', 'rolloff_std']]
X[0:5]
X также нужно преобразовать Dataframes (фрейм данных) Pandas в массив Numpy.
Стандартизации набора данных
Если в наборе данных есть некоторые выбросы или значения переменных находятся в разных диапазонах, необходимо исправить их.
Стандартизация данных дает нулевое среднее значение и единичную дисперсию,
Пакет предварительной обработки SciKit Learn предоставляет несколько общих служебных функций и классов трансформаторов для изменения необработанных векторных объектов в подходящую форму вектора для моделирования.
from sklearn import preprocessing
X= preprocessing.StandardScaler().fit(X).transform(X)
X[0:2]
Разделение набора данных на тренировочные и тестовые наборы (train/test split) и настройка алгоритма.
Точность вне выборки - это процент правильных прогнозов, которые модель делает для данных, на которых НЕ была обучена модель. Выполнение обучения и тестирования одного и того же набора данных, скорее всего, будет иметь низкую точность вне выборки из-за вероятности переобучения нашей модели.
Важно, чтобы наши модели имели высокую точность вне выборки, потому что цель любой модели, конечно, состоит в том, чтобы делать правильные прогнозы на неизвестных данных. Итак, как мы можем улучшить точность вне выборки? Один из способов - использовать метод оценки, называемый разделением train/test split.
Разделение на обучение / тестирование включает в себя разделение набора данных на обучающий и тестовый наборы соответственно, которые являются взаимоисключающими. После этого тренируем с обучающим набором (train) и тестируем с помощью набора для тестирования (test).
Это обеспечит более точную оценку точности вне выборки, поскольку набор данных тестирования (test) не является частью набора данных, который использовался для обучения модели (train).
Для анализа необходимо разделить набор данных на тренировочные и тестовые наборы (train/test split).
test_size представляет собой соотношение тестового набора данных, а random_state гарантирует, что мы получим те же разбиения.
Для преобразования данных в более высоком пространственном пространстве используется Математическая функция, известная, как функция ядра - RBF (радиальная базисная функция)
Размер тренировочных и тестовых наборов (количество строк, колонок)
Прогнозирование новых значений в тестовом наборе после обучения на тренировочном наборе.
from sklearn.model_selection import train_test_split
# Разделение набора данных на тренировочные и тестовые наборы (train/test split)
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2,
random_state=17)
# размер тренировочных и тестовых наборов (количество строк, колонок):
print ('Train set:', X_train.shape, y_train.shape)
print ('Test set:', X_test.shape, y_test.shape)
from sklearn import svm
clf = svm.SVC(kernel='rbf') # функция ядра - RBF (радиальная базисная функция)
clf.fit(X_train, y_train) # Обучение модели на тренировочном наборе
yhat = clf.predict(X_test) # для прогнозирования новых значений:
yhat [0:10]
Сравнение реальных значений и новых значений (после прогнозирования) - визуально сравнить прогнозы с фактическими значениями.
print("Prediction:", yhat[0:20])
print("Real Value:", y_test[0:20])
Метрики для оценки точности модели
Показатели оценки объясняют эффективность модели. Мы обучили модель, и теперь хотим рассчитать ее точность с помощью тестового набора.
Импортируем метрики из sklearn и проверим точность нашей модели. В основном, мы сравниваем фактические значения в тестовом наборе со значениями, предсказанными моделью, чтобы рассчитать точность модели. Существуют различные метрики оценки моделей
Accuracy - оценка классификации точности - это функция, которая вычисляет точность подмножества, долю правильных ответов алгоритма. По сути, он вычисляет, насколько точно совпадают фактические и прогнозируемые метки в тестовом наборе.
Если весь набор предсказанных меток для выборки строго соответствует истинному набору меток, то точность подмножества равна 1,0 , в противном случае 0,0.
# accuracy evaluation
from sklearn import metrics
print("Train set Accuracy: ", metrics.accuracy_score(y_train, clf.predict(X_train)))
print("Test set Accuracy: ",metrics.accuracy_score(y_test, yhat) )
F1 score - Сonfusion matrix (матрица путаницы, матрица ошибок)
Другой способ проверить точность классификатора - это посмотреть на матрицу неточностей.
Эта матрица показывает корректные и неправильные прогнозы по сравнению с фактическими метками.
Каждая строка матрицы путаницы показывает метки Actual/True в тестовом наборе, а столбцы показывают прогнозируемые метки по классификатору. Мы можем интерпретировать эти числа как количество истинных положительных, ложных отрицательных, истинных отрицательных и ложных срабатываний. Матрица путаницы показывает способность модели правильно предсказать или разделить классы.
Это таблица с 4 различными комбинациями прогнозируемых и фактических значений.
Основываясь на количестве в каждой секции, мы можем рассчитать precision (точность) и Recall (отзывчивость) каждой метки:
Precision (Точность) - это мера точности при условии, что метка класса была предсказана. Он определяется как:
Recall (Отзыв) - это истинно положительный показатель. Это определяется как: Recall (Отзыв) = TP / (TP + FN)
Итак, мы можем вычислить Precision ( точность) и Recall (отзыв) каждого класса.
F1 score: Теперь мы можем рассчитать оценки F1 для каждой метки на основе Precision и Recall этой метки.
F1 score представляет собой гармоническое среднее значение Precision (точности) и Recall (отзывчивости), где F1 score (оценка F1) достигает своего лучшего значения при 1 (идеальная точность и отзывчивость) и худшего при 0.
Это хороший способ показать, что классификатор имеет хорошее значение для Recall (отзыв) и Precision (точность).
Наконец, мы можем сказать, что средняя Accuracy (точность) для этого классификатора - это средний балл F1 для обеих меток,
from sklearn.metrics import classification_report,confusion_matrix
print('CONFUSION_MATRIX :\n')
print(confusion_matrix(y_test,yhat))
print('\n')
print('REPORT :\n')
print(classification_report(y_test,yhat))
Мы построили модель машинного обучения - SVM (Support Vector Machines) / машины опорных векторов.
Мы дали алгоритму набор данных, который уже содержит «правильные ответы» - это информацию об аудиосигнале - значимые характеристики аудиоданных (45 значений). Провели Стандартизацию набора данных, Разделили набор данных на тренировочные и тестовые наборы (train/test split), Обучили модель на train наборе и протестировали на test наборе, Сравнили прогнозы с фактическими значениями и рассчитали точность модели.
Показатели оценки 0.97 - объясняют эффективность модели, чтобы делать правильные прогнозы на неизвестных, новых данных.
SVM воспринимается как один из самых мощных алгоритмов обучения сложных нелинейных функции, очень широко используется как в промышленности, так и в академических кругах. И по сравнению с логистической регрессией и нейронными сетями , Support Vector Machine иногда дает более чистый, а иногда более мощный способ обучения сложным нелинейным функциям - просто делает предсказание того, что y = 1 или y = 0, напрямую.
Многие ученые полагают, что лучшим способом достижения прогресса в анализе аудиоданных является алгоритм - нейронные сети, который имитируют работу человеческого мозга. Бесспорно, нейронные сети уже доказали свою эффективность!
Но тренировка нейронной сети – долгий и сложный процесс. После нескольких сотен тысяч проб и ошибок - диапазон для нахождения правильного ответа у нейронной сети будет скорректирован. Весы для распознавания верного ответа будут настроены и в дальнейшем при её использовании она будет верно давать правильные прогнозы.
Иногда, для ускорения алгоритмов обучения используется SVM вместе с нейронными сетями.
Комментарии (6)
basilbasilbasil
19.06.2022 03:2745 характеристик аудио - это откуда столько?
tatvch Автор
19.06.2022 04:33Во второй части анализа аудиоданных я подробно разобрала извлечение значимых характеристик.
Из всех аудиофайлов в наборе данных с помощью библиотеки librosa - librosa.feature, метода append( ) и метода extend( ) проводим:
Извлечение из Мел-кепстральных коэффициентов - средние значения и стандартные отклонения (по 20 значений);
Извлечение из Спектрального центроида - среднее значение, стандартное отклонение и skew (наклон);
Извлечение из Спектрального спада - среднее значение и стандартное отклонение;
Двухмерная таблица - Dataframes, состоящая из 47столбцов и 50000 строк.
В таблице data мы видим:
столбец ‘filename’, где указан номер и название файла (Аудиофайлы перемешаны)
столбцы ‘mfcc_mean{i}’ и ‘mfcc_std{i}’ - средние значения и стандартные отклонения (по 20 значений) из Мел-кепстральных коэффициентов;
столбцы 'cent_mean', 'cent_std', 'cent_skew' - среднее значение, стандартное отклонение и skew (наклон) из Спектрального центроида;
столбцы 'rolloff_mean', 'rolloff_std' - среднее значение и стандартное отклонение из Спектрального спада ;
столбец ‘label’ метка
longtolik
Если интересно, на видео - работают мел-кепстральные коэффициенты. Без питона и библиотек, просто на языке C и голом железе микропроцессора.
https://youtu.be/Q9KhWpwOF80
tatvch Автор
Видео посмотрела. Спасибо!
sim2q
Интересно, в примере аппаратное FFT задействовано?
ps мне для распознавания треков - всякая электроника: техно разных вариация и подклассы вплоть до эмбиента.. голоса нет)) совершенно для меня новое - в прошлых статьях только узнал обо всём этом, раньше сохранял только bpm и тональность (из dj софта готовые тэги). Сейчас пытаюсь понять сколько вот этого вот нагенерённого librosa в базу класть что бы "потом разберёмся"
longtolik
Естественно. RIISC-V SoC K210 дополнили аппаратным FFT. Работает шикарно. 512 точек. Строил графики, По оси X - частота, по Y - напряжение или мощность на этой частоте, по Z - время, с интервалом 20 мс. Можно вращать в 3D и рассматривать. Подавал сигналы от .MIDI клавиатуры. Четко видны пики именно на определенных частотах сигнала. Очень наглядно в отличие от "термальных" спектрограмм.