GridSearchCV работает хуже, чем ванильный SVM, используя те же параметры - PullRequest
0 голосов
/ 22 октября 2018

сообщество.

Я кодировал некоторые ML, чтобы классифицировать некоторые данные по группам.

Я пробовал разные методы, но когда я попал в SVM, я столкнулся с этой проблемой.

У меня есть простой набор данных (3 класса, 6 функций), и когда я использую SVM с фиксированными параметрами ( C = 10 , gamma = 1 ), и я предсказываю то же самоеЯ получаю 100% точность данных (это могут быть переопределенные векторы, но это другая проблема).

Мне трудно понять, что я тогда пытаюсь использовать GridSearchCV (sklearn.model_selection.GridSearchCV) и перебираю все полномочия.10 от 10 ^ -5 до 10 ^ 5 для C и гаммы (это включает, конечно, C = 10 и гамма = 1), и он находит как best_params: C = 10 ^ -5 и гамма = 10 ^ -5 .С этими параметрами точность составляет 41%, и все прогнозы попадают в одну категорию .

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

Моя проблема СЕЙЧАС НЕ НЕТ (поэтому, пожалуйста, оставьте эти обсуждения в стороне, если ответите):

  1. переоснащение или использование одних и тех же данных для обучения и тестирования;

  2. несбалансированный набор данных;

  3. проблемы набора данных.

Моя проблема только в том, ПОЧЕМУ GridSearchCV ведет себя иначе, чем обычный SVM.Я уверен, что это должно быть что-то, что я кодирую неправильно, иначе они действительно не работают должным образом.

Вот код:

import pandas as pd
import numpy as np
from sklearn import svm
from sklearn.model_selection import GridSearchCV
from sklearn import preprocessing

xl= pd.ExcelFile('3classes_6_features.xlsx')
cont= xl.parse()

 # Encode labels:
labeling = preprocessing.LabelEncoder()
labeling.fit(cont[cont.keys()[0]])

### cont.keys()[0] == "GS"
y_all= labeling.transform(np.array(cont["GS"]))
X_all= np.array(cont.drop(["GS"],1))

# NORMAL SVM:
SVMclassifier= svm.SVC(kernel='rbf', gamma=1, C=10, random_state=0)
SVMclassifier.fit(X_all,y_all)

# SVM with HYPERPARAMETRIC TUNING:
log_sweep= [10**(i)/j for i in range(-5,5) for j in [2,1]]
SVMparam_grid = {'C': log_sweep, 'gamma': log_sweep}

SVMgrid_classifier= GridSearchCV(svm.SVC(kernel='rbf', random_state=0), SVMparam_grid)
SVMgrid_classifier= SVMgrid_classifier.fit(X_all,y_all)


print("INITIAL CLASSES: ", y_all)
print("NORMAL SVM prediction: ", SVMclassifier.predict(X_all))
print("TUNED SVM prediction: ", SVMgrid_classifier.predict(X_all))

Результат:

НАЧАЛЬНЫЕ КЛАССЫ: [0 1 2 2 0 0 2 0 1 0 0 1 2 0 0 1 1 1 2 1 2]

НОРМАЛЬНОЕ предсказание SVM: [0 1 2 2 0 0 20 1 0 0 1 2 0 0 1 1 1 2 1 2]

TUNED SVM прогноз: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

Я прилагаю данные на случай, если вы захотите попробовать сами:

https://drive.google.com/open?id=1LPRiMFNeSXu790lG_-NP3HAkvq8vyLcV

Заранее спасибо!

С уважением,

Люк

1 Ответ

0 голосов
/ 22 октября 2018

Проблема в том, что когда вы подходите и прогнозируете с помощью «нормального SVM», вы используете все данные для обучения, а затем прогнозируете на тех же данных.

Когда вы используете GridSearchCV, он выполняет K-кратноеперекрестная проверка по умолчанию (проверьте параметр 'cv'), что означает, что она будет разбивать данные на обучение и проверку, чтобы модель никогда не обучалась с полным набором данных, а затем прогнозировала (проверяла) данные, с которыми она не обучалась -лучшие параметры основаны на наибольшем балле, полученном на этапе проверки.

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

...