Поиск по сетке занимает более 30 минут. Есть ли способ уменьшить это? (Юпитер Лазурный) - PullRequest
0 голосов
/ 04 июля 2018

Я выполняю grid-search для дизайна SVR, который разделен по временным рядам. Моя проблема в том, что поиск по сетке занимает около 30 минут, что слишком долго. У меня большой набор данных, состоящий из 17 800 бит данных, однако эта длительность слишком велика. Есть ли способ, которым я мог бы сократить эту продолжительность? Мой код:

from sklearn.svm import SVR
from sklearn.model_selection import TimeSeriesSplit
from sklearn import svm
from sklearn.preprocessing import MinMaxScaler
from sklearn import preprocessing as pre

X_feature = X_feature.reshape(-1, 1)
y_label = y_label.reshape(-1,1)

param = [{'kernel': ['rbf'], 'gamma': [1e-2, 1e-3, 1e-4, 1e-5],
                       'C': [1, 10, 100, 1000]},
                       {'kernel': ['poly'], 'C': [1, 10, 100, 1000], 'degree': [1, 2, 3, 4]}] 


reg = SVR(C=1)
timeseries_split = TimeSeriesSplit(n_splits=3)
clf = GridSearchCV(reg, param, cv=timeseries_split, scoring='neg_mean_squared_error')


X= pre.MinMaxScaler(feature_range=(0,1)).fit(X_feature)

scaled_X = X.transform(X_feature)


y = pre.MinMaxScaler(feature_range=(0,1)).fit(y_label)

scaled_y = y.transform(y_label)



clf.fit(scaled_X,scaled_y )

Мои данные для шкалы y:

 [0.11321139]
 [0.07218848]
 ...
 [0.64844211]
 [0.4926122 ]
 [0.4030334 ]]

А мои данные для масштабированного Х:

[[0.2681013 ]
 [0.03454225]
 [0.02062136]
 ...
 [0.92857565]
 [0.64930691]
 [0.20325924]]

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

В зависимости от размера данных и классификатора, это может занять много времени. В качестве альтернативы, вы можете попробовать разбить процесс на более мелкие части, используя только один раз ядро ​​за один раз, как это,

param_rbf = {'kernel': ['rbf'], 'gamma': [1e-2, 1e-3, 1e-4, 1e-5],
                   'C': [1, 10, 100, 1000]}

Тогда используйте это так

clf = GridSearchCV(reg, param_rbf, cv=timeseries_split, scoring='neg_mean_squared_error')

Точно так же, делайте предсказания отдельно для разных ядер, по словарю разных параметров

params_poly = {'kernel': ['poly'], 'C': [1, 10, 100, 1000], 'degree': [1, 2, 3, 4]}

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

Также установите для параметра verbose значение True. Это поможет вам показать прогресс классификатора.

Кроме того, установка n_jobs=-1 не обязательно может привести к снижению скорости. См. Этот ответ для справки.

0 голосов
/ 04 июля 2018

Используйте GridSearchCV(..., n_jobs=-1) для параллельного использования всех доступных ядер ЦП.

В качестве альтернативы вы можете использовать RandomizedSearchCV

...