Вероятностный СВМ, регрессия - PullRequest
0 голосов
/ 12 января 2019

В настоящее время я реализовал вероятностный (по крайней мере, я так думаю) для бинарных классов. Теперь я хочу расширить этот подход для регрессии, и я пытаюсь использовать его для набора данных Бостона. К сожалению, кажется, что мой алгоритм застрял, код, который я сейчас выполняю, выглядит так:

from sklearn import decomposition
from sklearn import svm
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston

boston = load_boston()

X = boston.data
y = boston.target
inputs_train, inputs_test, targets_train, targets_test = train_test_split(X, y, test_size=0.33, random_state=42)

def plotting():
    param_C = [0.01, 0.1]
    param_grid = {'C': param_C, 'kernel': ['poly', 'rbf'], 'gamma': [0.1, 0.01]}
    clf = GridSearchCV(svm.SVR(), cv = 5, param_grid= param_grid)
    clf.fit(inputs_train, targets_train)
    clf = SVR(C=clf.best_params_['C'], cache_size=200, class_weight=None, coef0=0.0,
              decision_function_shape='ovr', degree=5, gamma=clf.best_params_['gamma'],
              kernel=clf.best_params_['kernel'],
              max_iter=-1, probability=True, random_state=None, shrinking=True,
              tol=0.001, verbose=False)
    clf.fit(inputs_train, targets_train)
    a = clf.predict(inputs_test[0])
    print(a)


plotting()

Может кто-нибудь сказать мне, что не так в этом подходе, это не факт, что я получаю какое-то сообщение об ошибке (я знаю, я их исключил выше), но код никогда не перестает работать. Любые предложения приветствуются.

1 Ответ

0 голосов
/ 13 января 2019

Есть несколько проблем с вашим кодом.

  • Начнем с того, что вечность - это first clf.fit (то есть поиск по сетке), и поэтому вы не увидели никаких изменений при установке max_iter и tol в вашу секунду clf.fit.

  • Во-вторых, часть clf=SVR() не будет работать, потому что:

    • Вы должны импортировать его, SVR не распознается
    • У вас есть куча недопустимых аргументов (decision_function_shape, probability, random_state и т. Д.) - проверьте документы на наличие допустимых SVR аргументов.
  • В-третьих, вам не нужно явно подбирать лучшие параметры; Вы должны просто запросить refit=True в своем GridSearchCV определении и затем использовать clf.best_estimator_ для своих прогнозов (РЕДАКТИРОВАТЬ после комментария: просто clf.predict также будет работать).

Итак, переместив материал за пределы любого определения функции, вот рабочая версия вашего кода:

from sklearn.svm import SVR
# other imports as-is

# data loading & splitting as-is

param_C = [0.01, 0.1]
param_grid = {'C': param_C, 'kernel': ['poly', 'rbf'], 'gamma': [0.1, 0.01]}
clf = GridSearchCV(SVR(degree=5, max_iter=10000), cv = 5, param_grid= param_grid, refit=True,)
clf.fit(inputs_train, targets_train)
a = clf.best_estimator_.predict(inputs_test[0])
# a = clf.predict(inputs_test[0]) will also work 
print(a)
# [ 21.89849792]

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

Вы получите пару предупреждений (, а не ошибки), т.е. после установки:

/ databricks / питон / Библиотека / python3.5 / сайт-пакеты / sklearn / SVM / base.py: 220: ConvergenceWarning: Solver завершился рано (max_iter = 10000). Рассматривать предварительная обработка данных с помощью StandardScaler или MinMaxScaler.

и после прогнозирования:

/ databricks / питон / Библиотека / python3.5 / сайт-пакеты / sklearn / Utils / validation.py: 395: DeprecationWarning: Передача 1d массивов, поскольку данные устарели в 0,17 и повысит ValueError в 0,19. Изменить ваши данные либо с помощью X.reshape (-1, 1), если ваши данные имеют одну функцию или X.reshape (1, -1) если он содержит один образец. DeprecationWarning)

, который уже содержит некоторые советы о том, что делать дальше ...

Последнее, но не менее важное: вероятностный классификатор (т. Е. Производящий вероятностей вместо жестких меток ) является допустимым, но "вероятностная" регрессионная модель не ...

Протестировано с Python 3.5 и scikit-learn 0.18.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...