Как правильно использовать вейвлет-преобразование для извлечения признаков?

Вопрос или проблема

Я пытаюсь классифицировать слова на основе сигналов ЭМГ, используя машину опорных векторов в качестве модели. Мой набор данных включает 15 классов (слов) с 230 повторами и 1000 признаками каждое. Я уже объединил все файлы вместе, чтобы упростить задачу. Шаги предобработки, которые я использовал, это стандартное масштабирование и анализ главных компонентов. Однако точность, которую я получил, составила только 56%. Я нашел в интернете, что использование вейвлет-преобразования поможет улучшить это, но это вместо этого ухудшило ситуацию. Я получил всего около 6% точности! Если вы знаете, что я делаю не так, можете объяснить мне? Я прикрепил свой код ниже. Я также новичок в машинном обучении, поэтому, если у вас есть время, было бы очень полезно, если бы вы дали подробные ответы. Большое спасибо!!

cf = pd.read_csv('EMG-TrainTestDataset.csv')

# Определите входные и выходные данные
X = cf.drop(axis=0, columns=['WORD'])
Y = cf.WORD

# Разделите на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.1,random_state=82)

# Примените CWT для извлечения признаков
coeff, freqs = pywt.cwt(X_train,100,'gaus8')
X_train = np.array(coeff).transpose(2,0,1).reshape(-1,X_train.shape[1])

coeff, freqs = pywt.cwt(X_test,100,'gaus8')
X_test = np.array(coeff).transpose(2,0,1).reshape(-1,X_test.shape[1])

# Стандартизация признаков
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Примените уменьшение размерности
pca = PCA()
X_train =pca.fit_transform(X_train)
X_test = pca.transform(X_test)

# Создайте модель
model = SVC(kernel="linear",gamma=1,C=1)
model.fit(X_train, y_train)

# Тестирование с использованием 10% тестового набора данных
y_pred = model.predict(X_test)
print("Точность:",metrics.accuracy_score(y_test, y_pred)*100)

Добро пожаловать на datascience.stackexchange.

По моему опыту, использование coeff, возвращаемого непосредственно из вейвлет-преобразования, действительно не работает хорошо для ML-пайплайнов.

В моей практике обычно извлекаются разные статистические данные, такие как: перцентили, энтропия, пересечения с нулем / средним и т.д. Будьте креативными и попробуйте их случайно или в шаблоне сеточного поиска. Когда сомневаетесь – используйте меньше, чем больше 🙂

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

Ответ или решение

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

1. Понимание вейвлет-преобразования

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

2. Извлечение признаков

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

  • Статистические функции: Извлекайте различные статистические характеристики (например, среднее, стандартное отклонение, максимальные и минимальные значения, энтропию, пересечения через ноль и т.п.) из вейвлет-коэффициентов. Это позволит создать более информативные признаки.

    Например, если у вас есть массив коэффициентов, можно извлечь такие сведения:

    def extract_features(coeff):
      features = []
      features.append(np.mean(coeff))
      features.append(np.std(coeff))
      features.append(np.min(coeff))
      features.append(np.max(coeff))
      features.append(np.percentile(coeff, 25))
      features.append(np.percentile(coeff, 50))
      features.append(np.percentile(coeff, 75))
      # Добавьте другие функции по мере необходимости
      return features

3. Применение вейвлет-преобразования

Убедитесь, что вейвлет-преобразование применяется должным образом. У вас в коде используется pywt.cwt, которое возвращает непрерывные вейвлет-коэффициенты. Возможно, стоит рассмотреть использование дискретного вейвлет-преобразования, которое проще в обработке и может оказать более положительное влияние на результаты. Например:

coeffs = pywt.dwt(X_train, 'haar')

Данный метод вернет значения, которые можно обрабатывать далее для извлечения признаков.

4. Стандартизация данных

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

5. Снижение размерности

Используйте PCA (метод главных компонент) для уменьшения размерности, но обращайте внимание на то, чтобы не потерять информацию, критическую для классификации. В случае повышенной размерности можно комбинировать этот шаг с отбором признаков или с адаптивными методами (например, F-test).

6. Настройка модели

Также проверьте параметры вашей модели SVM – такие как значение C и gamma. Возможно, их стоит подбирать с помощью перебора параметров (Grid Search). Кроме того, попробуйте другие ядра, такие как полиномиальное или RBF, для улучшения классификации.

Заключение

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

Если у вас есть дополнительная информация или вопросы, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...