Способы увеличения полноты в SVM

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

Я обучаю SVM на Наборе данных о банковском маркетинге от UCI, файле bank additional-full.csv. Поскольку данные смещены, я также интересуюсь полнотой. Я получаю точность около 87.95%, но моя полнота составляет примерно 51%. Я хочу узнать способы увеличения полноты без значительного снижения точности, используя только SVM.

Мой код:

from sklearn.svm import SVC

svm_clf = SVC(gamma="auto",class_weight={1: 2.6})
svm_clf.fit(X_transformed, y_train_binary.ravel())

Дополнительная информация:

Я не создавал никаких новых признаков (т.е. не комбинировал признаки) и считал неизвестные значения за метки.
Я также удалил атрибут Duration, как предложено в информации об атрибутах.

Я пробовал разные значения class_weights, поэтому я могу увеличить полноту до 75.32%, но тогда моя точность падает до 68%.
Как я могу увеличить полноту в моделях SVM, не снижая точность так сильно?

Дублирование – это RandomOverSampling, не помогает сильно в OverSampling.

Я быстро сделал RandomUnderSampling. Результат выглядит хорошим для базового уровня улучшения.

Я ничего не делал для улучшения модели

Код таков, как он есть из моего Google Colab –

url="https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank-additional.zip"

from urllib.request import urlretrieve
urlretrieve(url, "data.zip")

from zipfile import ZipFile
file_name = "/content/data.zip"
with ZipFile(file_name, 'r') as zip: 
    zip.extractall()


import numpy as np,pandas as pd
data = pd.read_csv("/content/bank-additional/bank-additional-full.csv",delimiter=";")
X = data.iloc[:,:-1]
y = data.iloc[:,-1]
y.value_counts()

X_cat = X.select_dtypes(include="object")
from sklearn.preprocessing import LabelEncoder
lbe = LabelEncoder()
for colname in X_cat.columns:
    X_cat[colname] = lbe.fit_transform(X_cat[colname])
    X[colname] = X_cat[colname]
y = lbe.fit_transform(y)    

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X,y,test_size=0.20,random_state=201, stratify=y)


from imblearn.under_sampling import RandomUnderSampler
rand = RandomUnderSampler(sampling_strategy=.6)
x_train, y_train = rand.fit_resample(x_train, y_train)


from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=200,max_samples=0.05)
model.fit(x_train, y_train)
from sklearn.metrics import accuracy_score
y_pred_train = model.predict(x_train)

####Метрики на обучающей выборке
from sklearn.metrics import confusion_matrix
tn, fp, fn, tp = confusion_matrix(y_train, y_pred_train).ravel() # (55148, 1715, 8,90)
print("Обучение",fp/(tn+fp),fn/(fn+tp), accuracy_score(y_train, y_pred_train), tn, fp, fn, tp)

####Метрики на тестовой выборке
y_pred = model.predict(x_test)
tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel() # (55148, 1715, 8,90)
print("Тест",fp/(tn+fp),fn/(fn+tp), accuracy_score(y_test, y_pred), tn, fp, fn, tp)

from sklearn.metrics import recall_score
print("Тест-полнота",recall_score(y_test, y_pred))

Далее

Попробуйте SMOTE и комбинацию Over и Under

Работайте над инжинирингом признаков и уменьшением размерности

Проверьте другие модели

Один из вариантов – настройка гиперпараметров. Основные гиперпараметры, связанные с производительностью модели SVM от scikit-learn, это:

  • C – Сила регуляризации
  • kernel – Проекция данных в пространство признаков
  • class_weight – Если данные несбалансированы, рекомендуется class_weight="balanced"

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

Как увеличить recall в SVM при работе с несбалансированными данными

Когда вы работаете с несбалансированными данными, как в случае с набором данных о банковском маркетинге, важным аспектом модели машинного обучения является увеличение recall (полноты) при сохранении приемлемой точности. Ваша текущая настройка модели SVM показывает, что вы добиваетесь 87.95% точности, но с recall на уровне 51%. Вот несколько стратегий, которые могут помочь вам улучшить recall без значительного падения точности.

1. Настройка гиперпараметров

Gстрана выбора гиперпараметров SVM может значительно повлиять на результаты. Наиболее важные параметры, которые вам следует рассмотреть:

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

  • Ядро (kernel): Разные функции ядра (например, линейное, полиномиальное или радиальное базисное) могут привести к различным результатам. Попробуйте использовать kernel='rbf' или kernel='poly' для оценки их влияния на recall.

  • class_weight: Установка параметра class_weight='balanced' может помочь модели обратить внимание на менее представленный класс, что улучшит recall.

svm_clf = SVC(C=1.0, gamma="auto", class_weight='balanced')

2. Предобработка данных

  • Сбалансированность классов: Вы уже пробовали RandomUnderSampling. Попробуйте также SMOTE (Synthetic Minority Over-sampling Technique), который генерирует синтетические примеры для меньшинства. Это может помочь повысить recall без значительного уменьшения точности.

  • Функции обработки: Возможно, стоит попробовать различные методы преобразования данных (например, нормализация или стандартизация), которые могут помочь SVM лучше разделять классы.

3. Инженерия признаков

  • Создание новых признаков: Вы упомянули, что еще не проводили никакой инжиниринг признаков. Попробуйте создавать новые признаки на основе существующих, комбинируя их. Это можно сделать, например, путем объединения нескольких категориальных переменных или создания бустированных признаков.

  • Выбор признаков: Проведите анализ значимости признаков для исключения наименее значимых и оставления только основных, что может уменьшить шум в данных.

4. Использование дополнительных методов

  • Ансамблевые методы: Если SVM не дает желаемых результатов, рассмотрите возможность использования ансамблевых методов, как Random Forest или Gradient Boosting, которые могут дополнять SVM и улучшать метрики, такие как recall.

  • Повторная оценка модели: После применения изменений в подходе к предобработке и гиперпараметрам, проведите кросс-валидацию для гарантии, что модель работает хорошо на всех подвыборках.

Заключение

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

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

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