Применение оптимизации SciPy к встроенной модели sci-kit - PullRequest
4 голосов
/ 07 января 2020

В последнее время я столкнулся с проблемой, которую, как мне кажется, SciPy может стать хорошим кандидатом для решения. Однако я не смог правильно его применить. Не уверен, что я что-то упускаю или что то, что я ищу, на самом деле вообще невозможно.

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

from sklearn.model_selection import train_test_split 
from sklearn.svm import SVR
from scipy.optimize import minimize
import numpy as np
import pandas as pd

time_studied = [12, 10, 4, 7, 6, 11, 6]
hours_slept = [8, 7, 1, 3, 8, 6, 5]
grade = [10, 9, 2, 5, 7, 8, 8.5, 6]

X = np.array([time_studied, hours_slept]).T
y = np.array([grade]).T 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)    
model = SVR(kernel='poly', C=100, gamma='auto', degree=3, epsilon=.1, coef0=1)
model.fit(X,y)

Затем я пытаюсь применить оптимизатор к этой функции, чтобы найти оптимальный баланс между сном и учебой. Поскольку проверенный метод регрессии возвращает функцию, я предполагаю, что было бы возможно применить минимизацию SciPy. Но, когда я пытаюсь применить это, с чем-то вроде этого

bnds = [(0,12), (0,8)]
x0 = [0,0]
residual_plant = minimize(model, x0, method='SLSQP',bounds=bnds,options = {'eps': np.radians(5.0)})

я получаю следующую ошибку

TypeError: 'SVR' object is not callable

Итак, очевидно, что можно вызвать оптимизатор прямо из моего модель. Поэтому здесь возникает мой вопрос, как можно было бы получить доступ к функции, соответствующей моим данным, и найти оптимальное время сна + время обучения x класс (в данном случае это очевидный ожидаемый результат)

Я что-то упустил? Можно ли сделать то, к чему я стремлюсь?

1 Ответ

3 голосов
/ 07 января 2020

Попробуйте:

residual_plant = minimize(lambda x: model.predict(np.array([x])), x0, method='SLSQP',bounds=bnds,options = {'eps': np.radians(5.0)})

Первый аргумент minimize для SciPy: , а не , просто model.predict, потому что SciPy пытается передать массив 1D своей целевой функции, но model.predict ожидает двумерный массив.

(Кстати, в настройках обучения для вымышленной модели y - это второй столбец X, а список grades никогда не используется. Я подозреваю, что y должно быть np.array([grades]).T. Поскольку это не ваша реальная модель, это, вероятно, не критично.)

Справочная документация для метода predict: https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html?highlight=svr#sklearn .svm .SVR.predict

Пример использования метода predict можно найти здесь: https://scikit-learn.org/stable/auto_examples/svm/plot_svm_regression.html#sphx -glr-auto-examples-svm-plot-svm-regression-py

...