Вопрос или проблема
Я пытаюсь классифицировать слова на основе сигналов ЭМГ, используя машину опорных векторов в качестве модели. Мой набор данных включает 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, важно внимательно подходить к каждому этапу: от извлечения признаков до предобработки данных и настройки модели. Экспериментируйте с различными характеристиками, настройками и методами, чтобы найти наилучшее решение для вашей задачи.
Если у вас есть дополнительная информация или вопросы, не стесняйтесь задавать их!