使用多项式内核提高SVM的速度

时间:2019-04-02 09:42:15

标签: python performance machine-learning scikit-learn svm

我是机器学习的新手。
我正在将支持向量机(SVM)与“多项式”内核一起用于多类分类。我的数据集大小为(56010395, 4),形式为(无样本,无特征)。但是,从过去的1周开始,我的机器一直在不断地训练,并且训练仍然没有结束。我的代码真的很基础,所以我不明白我的代码有什么问题。我无法对数据集进行二次抽样。我的RAM是15 GB,正在使用i7 Intel CPU。

我已经尝试过使用线性分类器的SVM,并且训练在3小时内以75%的精度完成。此外,数据还使用MinMaxscaler进行了缩放。

from sklearn.svm import SVC
X_train, X_test, y_train, y_test = train_test_split(X_data, y_labels, test_size=0.3, random_state=0)

print('start training')
start = time. time()
svm_model_linear = SVC(kernel='poly', degree=3, C=1.0, gamma = 'auto').fit(X_train, y_train)
print('training_finished')
end = time. time()
print('time: ', end - start)
svm_predictions = svm_model_linear.predict(X_test)

1 个答案:

答案 0 :(得分:0)

SVM的训练时间与样本数量成正比,甚至更差。对于O(n ^ 2),时间与c * n ^ 2)成比例。 您的计算机上具有10万个功能时,您的模型配置大约需要20秒,因此,c=2e9周围的常量不变。因此,56 010 395个样本的预期训练时间为72天,可能更多。

因此可以对数据集进行子采样,或使用其他分类器。您可以使用小型多层感知器来获得类似于具有多项式kerne的SVM的表现力。可以使用SGD进行小批量训练。使用铰链损耗与SVM使用的损耗相同。

顺便说一句,您基本上总是需要为SVM优化超参数C。最佳实践方法是在gridsearch中进行5倍交叉验证。因此,您应该计划至少训练50个模型...


import time

from sklearn.svm import SVC
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
import numpy
import pandas

def time_training(estimator, n_samples):
    X, y = make_moons(n_samples=n_samples, noise=0.1, random_state=1)
    X = numpy.concatenate([X, X], axis=1)
    assert (X.shape[1] == 4), X.shape

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

    start = time. time()
    estimator.fit(X_train, y_train)
    end = time.time()
    t = end-start
    print('took', n_samples, t)
    return t

def main():
    model = SVC(kernel='poly', degree=3, C=1.0, gamma = 'auto')
    sizes = numpy.array((100, 1e3, 1e4, 2e4, 4e4, 6e4, 1e5, 1.1e5, 1.2e5)).astype(int)
    times = [ time_training(model, s) for s in sizes ]

    df = pandas.DataFrame({
        'samples': sizes,
        'time': times,
    })
    df.to_csv('temp/svmtrain.csv')

if __name__ == '__main__':
    main()

[jon@jon-thinkpad ~]$ python3 temp/svm-training-time.py
took 100 0.0006172657012939453
took 1000 0.00444340705871582
took 10000 0.26808977127075195
took 20000 1.1068146228790283
took 40000 3.8822362422943115
took 60000 8.051671743392944
took 100000 20.05191993713379
took 110000 36.83517003059387
took 120000 61.012284994125366
>>> 0.26/(10000**2)
2.6e-09
>>> 20/(100000**2)
2e-09
>>> 2e-9*(56e6**2)/(3600*24)
72.5925925925926