Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5548

Рейтинг: 958

Нарушения: 10

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5548

Рейтинг: 958

Нарушения: 10

Решил немного позалипать в классификацию на питоне через sklearn. Результат убил. 

 

Что не так с SVM при ядре RBF??? (жёлтый график)

 

По X у нас размер выборки из которой извлекались признаки для классификации. 

Классов 10. У каждого класса по ~100 представителя. Из них 3 идут для обучения, остальные для теста (в данном примере). 

Но на ситуацию это никак не влияет, даже если отправить на обучения 50% представителей, ядро RBF в этом месте будет показывать 41% (тогда как соседнее poly - 98%). 

Цитата:

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=3 * 10, stratify=y)

poly = svm.SVC(kernel='poly', degree=3, C=1).fit(X_train, y_train)

rbf = svm.SVC(kernel='rbf', gamma=0.5, C=1).fit(X_train, y_train)

knn_cos = KNeighborsClassifier(n_neighbors=3, metric='cosine').fit(X_train, y_train)

knn_cityblock = KNeighborsClassifier(n_neighbors=3, metric='cityblock').fit(X_train, y_train)

poly_pred = poly.predict(X_test)

rbf_pred = rbf.predict(X_test)

knn_cos_pred = knn_cos.predict(X_test)

knn_cityblock_pred = knn_cityblock.predict(X_test)
Нажмите, чтобы раскрыть...

 

Я сначала думал что у меня данные скоррапчены, но ведь нет, данные для всех классификаторов одинаковые, и такого падения нет ни у одного из них. 

 

Я ещё посмотрел в дебаггере, что именно там происходит. Происходит вот что: ядро РБФ внезапно начинает выдавать предсказания 1 класса в ответ на всё. Причём как я уже сказал только на конкретно этих данных. 

 

В чём хотя бы в теории может быть причина?? 

knn-cityblock-knn-cos-rbf-poly-block-size.png

 

Pilloy

Пользователь

Регистрация: 29.08.2023

Сообщения: 1638

Рейтинг: 70

Нарушения: 35

Pilloy

Регистрация: 29.08.2023

Сообщения: 1638

Рейтинг: 70

Нарушения: 35

100к зп в it при стаже год братиш, мертвая тема, на дефолт работе спокойно по 300к зарабатывать можно

offwire

Пользователь

Регистрация: 13.09.2018

Сообщения: 1040

Рейтинг: 924

offwire

Регистрация: 13.09.2018

Сообщения: 1040

Рейтинг: 924

написать тему на стаковерфлоу catno.gif?1684934409

написать тему на д2ру catyes.gif?1684934394

 

ну а ваще, попробуй скормить это чатгпт

LearnMySkill

Пользователь

Регистрация: 20.10.2012

Сообщения: 260

Рейтинг: 105

LearnMySkill

Регистрация: 20.10.2012

Сообщения: 260

Рейтинг: 105

Ещё бы знать, что на оси у отображено... А данные за тебя кто масштабировать будет? Дядя Вася Бояркин? Попробуй StandardScaler. Предполагаю, что в этом может быть проблема.

Kivooeo

Пользователь

Регистрация: 15.07.2019

Сообщения: 4317

Рейтинг: 1848

Kivooeo

Регистрация: 15.07.2019

Сообщения: 4317

Рейтинг: 1848

offwire сказал(а):

написать тему на стаковерфлоу

Нажмите, чтобы раскрыть...

мёртвый сайт, девоутают любые вопросы без причины

offwire сказал(а):

ну а ваще, попробуй скормить это чатгпт

Нажмите, чтобы раскрыть...

честно говоря ллмками на вопросах сложнее хелоу ворлда лучше не пользоваться

Kujivunia

Пользователь

Регистрация: 10.01.2015

Сообщения: 5548

Рейтинг: 958

Нарушения: 10

Kujivunia

Регистрация: 10.01.2015

Сообщения: 5548

Рейтинг: 958

Нарушения: 10

LearnMySkill сказал(а):

Ещё бы знать, что на оси у отображено... А данные за тебя кто масштабировать будет? Дядя Вася Бояркин? Попробуй StandardScaler. Предполагаю, что в этом может быть проблема.

Нажмите, чтобы раскрыть...

f1 метрика. 

 

Все параметры у меня имеют одинаковый масштаб (признаки это частота встречаемости триграмм в исходных данных)

 

Kivooeo сказал(а):

мёртвый сайт, девоутают любые вопросы без причины

честно говоря ллмками на вопросах сложнее хелоу ворлда лучше не пользоваться

Нажмите, чтобы раскрыть...

Ну мы с помощью чатгпт решали задачи по цифровому анализу сигналов. Иногда даже успешно. По крайней мере они могут дать толчок начальный. 

 

 

Я кстати нашёл решение, дело было в параметрах модели SVM, а именно в гамме и С. 

 

Я правда не знаю почему параметры настолько сильно изменяются на отметке строго 25к, но если вместо гамма 0.5 и с=1 установить гамма 1000 и с=100, то классификация РБФ становится адекватной, хотя и проседает ниже 15к, но там уже просто немножко проседает. 

 

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

 

For bs: 100...The best parameters are {'C': 100000.0, 'gamma': 100.0} with a score of 0.44

 

For bs: 1000...The best parameters are {'C': 1000000.0, 'gamma': 1.0} with a score of 0.84

 

For bs: 10000...The best parameters are {'C': 1000000.0, 'gamma': 0.1} with a score of 0.98

 

For bs: 100000...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 0.98

 

For bs: 11000...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 12000...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 1250...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.87

 

For bs: 12500...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 13000...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 140...The best parameters are {'C': 1000000.0, 'gamma': 10.0} with a score of 0.48

 

For bs: 14000...The best parameters are {'C': 10000000.0, 'gamma': 0.1} with a score of 0.98

 

For bs: 1500...The best parameters are {'C': 100000.0, 'gamma': 10.0} with a score of 0.89

 

For bs: 15000...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 16000...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 17000...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 1750...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.90

 

For bs: 17500...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 1.00

 

For bs: 18000...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 1.00

 

For bs: 19000...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 2000...The best parameters are {'C': 1000000.0, 'gamma': 1.0} with a score of 0.91

 

For bs: 20000...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 21000...The best parameters are {'C': 1000000.0, 'gamma': 0.1} with a score of 1.00

 

For bs: 22000...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 22500...The best parameters are {'C': 1000.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 23000...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 1.00

 

For bs: 24000...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 0.98

 

For bs: 250...The best parameters are {'C': 100000.0, 'gamma': 100.0} with a score of 0.55

 

For bs: 2500...The best parameters are {'C': 1000000.0, 'gamma': 1.0} with a score of 0.93

 

For bs: 25000...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 27500...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 300...The best parameters are {'C': 1000000.0, 'gamma': 100.0} with a score of 0.63

 

For bs: 3000...The best parameters are {'C': 1000000.0, 'gamma': 1.0} with a score of 0.96

 

For bs: 30000...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 32500...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 35000...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 37500...The best parameters are {'C': 100.0, 'gamma': 1000.0} with a score of 0.99

 

For bs: 400...

Пирожок с капустой

Пользователь

Регистрация: 12.11.2020

Сообщения: 101

Рейтинг: 289

Пирожок с капустой

Регистрация: 12.11.2020

Сообщения: 101

Рейтинг: 289

Причина, по которой SVM с RBF-ядром показывает плохие результаты на ваших данных, может быть связана с несколькими факторами:

 

1. **Малый размер выборки для обучения:**

Из вашего описания следует, что вы используете только 3 представителя каждого класса для обучения (всего 30 данных при 10 классах). Это очень мало данных для обучения SVM, особенно с RBF-ядром, которое сильно зависит от параметров регуляризации и ширины ядра.

 

2. **Подбор гиперпараметров:**

Параметры `gamma` и `C` в SVM с RBF-ядром нужно подбирать тщательно. Значение `gamma=0.5` может быть неподходящим для ваших данных.

- `gamma` управляет дальностью влияния одного примера на другие. Если `gamma` слишком большое, модель может переобучаться, если слишком маленькое — модель может недообучаться.

- `C` (параметр регуляризации) также влияет на производительность. Низкое значение `C` делает модель более устойчивой к переобучению, но может снизить ее точность. Высокое значение `C` может улучшить точность, но сделать модель бо́лее чувствительной к шуму.

 

3. **Особенности данных:**

Если ваши данные не разделимы линейно (или с небольшой нелинейной трансформацией, как в случае с полиномом степени 3), RBF-ядро может привести к более сложной модели, которая сильно переобучится на малом количестве данных.

 

4. **Имплементация и особенности алгоритма:**

Полиномиальные ядра (как `kernel='poly'`) могут лучше подходить для данных при малом размере выборки, так как такие ядра способны линейно трансформировать пространство признаков. В то время как RBF-ядро может требовать больше данных для эффективного обучения из-за своей нелинейной природы.

 

### Рекомендации по улучшению производительности:

1. **Увеличьте размер выборки для обучения:**

Обучение на 3 образцах на класс скорее всего недостаточно. Попробуйте увеличить размер обучающей выборки, например, до 50% представителей, как вы упомянули.

 

2. **Подберите гиперпараметры `gamma` и `C`:**

Используйте кросс-валидацию для поиска оптимальных значений гиперпараметров. Можно использовать `GridSearchCV` или `RandomizedSearchCV` из `sklearn`:

```python

from sklearn.model_selection import GridSearchCV

 

param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001]}

grid = GridSearchCV(svm.SVC(kernel='rbf'), param_grid, refit=True, verbose=3)

grid.fit(X_train, y_train)

print(grid.best_params_) # Узнать лучшие гиперпараметры

```

 

3. **Проверьте нормализацию данных:**

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

```python

from sklearn.preprocessing import StandardScaler

 

scaler = StandardScaler().fit(X_train)

X_train_scaled = scaler.transform(X_train)

X_test_scaled = scaler.transform(X_test)

```

 

4. **Измените используемые метрики:**

Вместо косинусной метрики и cityblock, попробуйте разные метрики (например, евклидова или Махаланобис).

 

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

Neferp1tou

Пользователь

Регистрация: 17.09.2016

Сообщения: 9370

Рейтинг: 4650

Нарушения: 75

Neferp1tou

Регистрация: 17.09.2016

Сообщения: 9370

Рейтинг: 4650

Нарушения: 75

img

02cry.png?1621090964 Ничего не понятно. Пощади.

Пирожок с капустой

Пользователь

Регистрация: 12.11.2020

Сообщения: 101

Рейтинг: 289

Пирожок с капустой

Регистрация: 12.11.2020

Сообщения: 101

Рейтинг: 289

Neferp1tou сказал(а):

02cry.png?1621090964 Ничего не понятно. Пощади.

Нажмите, чтобы раскрыть...

 

Пирожок с капустой беспощаден.