SVM застрял в оптимизации - PullRequest
0 голосов
/ 06 февраля 2019

Я запускаю случайный поиск в SVC в sklearn.Мой набор данных был нормализован, пересчитан, и я применил к нему PCA, в результате чего получилось 20 тысяч строк с 80 столбцами.Если я запускаю один SVM с перекрестной проверкой, это занимает больше времени, чем другие алгоритмы (что приемлемо), но это оценивает.Но когда я пытаюсь оптимизировать алгоритм, используя случайный поиск или другой метод настройки, SVM оценивает некоторые решения и застревает в процессе.

Fitting 3 folds for each of 100 candidates, totalling 300 fits
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.
[Parallel(n_jobs=-1)]: Done  25 tasks      | elapsed: 19.9min
[Parallel(n_jobs=-1)]: Done 146 tasks      | elapsed: 116.3min

Последняя запись была сделана 10 часов назад.Я знаю, что файл выполняется, потому что мой процессор используется на 100%, и терминал показывает мне:

.................................................................................

Количество точек увеличивается, что должно означать, что код все еще выполняется, но никогда не отлаживаетсяв терминале, как будто он застрял в некотором цикле вычисления.И когда я пытаюсь оценить один SVC в экземплярах параметров, которые застряли в настройке, они оценивают нормально.

Кто-нибудь сталкивался с этой ошибкой?

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


РЕДАКТИРОВАТЬ 1

Как уже говорилось, после импорта, обработки отсутствующих данных, нормализации, PCA и повторной выборки я запускаюслучайный поиск с SVM в качестве классификатора.Я позволил этому фрагменту работать в течение 2 часов, и (я думаю) я получил ошибку.Консоль просто показывает, что оценки выполняются, но единственными записями являются точки.

import numpy as np
import pandas as pd
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC


for _ in range(1):
    X_train = np.random.rand(20000,40)
    y_train = np.random.randint(0, 2, size=20000)
    # X_train = pd.DataFrame(X_train)

    #print(X_train)

    clf = SVC(verbose=3)
    gs = RandomizedSearchCV(
        clf,
        param_distributions={
            'C': 10. ** np.arange(-3, 4),
            'gamma': 10. ** np.arange(-4, 2),
            'kernel': ['rbf', "linear"],
            'class_weight':['balanced', None]
        },
        n_iter=25,
        cv=3,
        scoring="accuracy",
        verbose=3,
        n_jobs=-1
    )

    gs.fit(X_train, y_train)
    print(gs.cv_results_)

print("finishes")

Последние записи терминала были:

[LibSVM][CV]  kernel=linear, gamma=0.001, class_weight=balanced, C=0.1, score=0.4913017396520696, total=  54.3s
[CV] kernel=linear, gamma=0.001, class_weight=balanced, C=0.1 ........
.................................[LibSVM][CV]  kernel=rbf, gamma=0.0001, class_weight=balanced, C=1000.0, score=0.49324932493249324, total= 1.1min
[CV] kernel=linear, gamma=0.001, class_weight=balanced, C=0.1 ........
...........................................................................................
Warning: using -h 0 may be faster
*..*
optimization finished, #iter = 14179
obj = -1306.242506, rho = 0.343782
nSV = 13094, nBSV = 10655
Total nSV = 13094
..................................
Warning: using -h 0 may be faster
*.*
optimization finished, #iter = 14339
obj = -1309.955423, rho = -0.341516
nSV = 13131, nBSV = 11572
Total nSV = 13131
.................................................................[LibSVM][CV]  kernel=linear, gamma=0.001, class_weight=balanced, C=0.1, score=0.495949594959496, total=  53.8s
..............................[LibSVM][CV]  kernel=linear, gamma=0.001, class_weight=balanced, C=0.1, score=0.49414941494149417, total=  53.6s
...........................................................................................................................................
............................................................................................................................................
............................................................................................................................................
and an infinite number of dots, with more dots appearing every second

Этот последний был в терминале, в то время как ятакже получите некоторые выходные сообщения в консоли отладки:

Fitting 3 folds for each of 25 candidates, totalling 75 fits
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.
[Parallel(n_jobs=-1)]: Done  16 tasks      | elapsed:  4.8min

"Выполнено 16 задач" было получено полтора часа назад.Это означает, что для оценки 16 задач потребовалось 4,8 минуты, и после этого в терминале больше не было отладки.

...