首页 文章

SVM内核的速度?线性与RBF对比

提问于
浏览
5

我在Python中使用scikitlearn来创建一些SVM模型,同时尝试不同的内核 . 代码非常简单,遵循以下形式:

from sklearn import svm
clf = svm.SVC(kernel='rbf', C=1, gamma=0.1) 
clf = svm.SVC(kernel='linear', C=1, gamma=0.1) 
clf = svm.SVC(kernel='poly', C=1, gamma=0.1) 
t0 = time()
clf.fit(X_train, y_train)
print "Training time:", round(time() - t0, 3), "s"
pred = clf.predict(X_test)

数据是8个特征和超过3000个观测值 . 我很惊讶地看到rbf在一秒钟内完成,而线性花费了90秒,而poly则需要数小时 .

我认为非线性内核会更复杂并且需要更多时间 . 是否有一个原因是线性比rbf花费的时间长得多,并且poly比两者都要长得多?它可以根据我的数据发生巨大变化吗?

1 回答

  • 8

    您是否扩展了数据?

    这可能成为SVM的一个问题 . 根据A Practical Guide to Support Vector Classification

    因为内核值通常取决于特征向量的内积,例如线性内核和多项式内核,大的属性值可能会导致数值问题 .

    现在举个例子,我将使用sklearn乳腺癌数据集:

    from time import time
    
    from sklearn.datasets import load_breast_cancer
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.svm import SVC
    
    data = load_breast_cancer()
    X = data.data
    y = data.target
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    
    clf_lin = SVC(kernel='linear', C=1.0, gamma=0.1)
    clf_rbf = SVC(kernerl='rbf', C=1.0, gamma=0.1)
    
    start = time()
    clf_lin.fit(X_train, y_train)
    print("Linear Kernel Non-Normalized Fit Time: {0.4f} s".format(time() - start))
    start = time()
    clf_rbf.fit(X_train, y_train)
    print("RBF Kernel Non-Normalized Fit Time: {0.4f} s".format(time() - start))
    
    scaler = MinMaxScaler()  # Default behavior is to scale to [0,1]
    X = scaler.fit_transform(X)
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    
    start = time()
    clf_lin.fit(X_train, y_train)
    print("Linear Kernel Normalized Fit Time: {0.4f} s".format(time() - start))
    start = time()
    clf_rbf.fit(X_train, y_train)
    print("RBF Kernel Normalized Fit Time: {0.4f} s".format(time() - start))
    

    输出:

    Linear Kernel Non-Normalized Fit Time: 0.8672
    RBF Kernel Non-Normalized Fit Time: 0.0124
    Linear Kernel Normalized Fit Time: 0.0021
    RBF Kernel Normalized Fit Time: 0.0039
    

    所以你可以看到,在这个具有形状(560,30)的数据集中,我们通过一点扩展得到了非常显着的性能提升 .

    此行为取决于具有大值的功能 . 考虑在无限维空间中工作 . 随着您填充无限维空间的值越大,其多维产品之间的空间越大,得到的结果就越大 . 我不能强调 a lot 足够了 . 阅读The Curse of Dimensionality,并阅读不仅仅是我链接的wiki条目 . 这种间距使得该过程需要更长的时间 . 试图在这个巨大的空间中分离类的数学背后变得非常复杂,特别是随着特征和观察数量的增加 . 因此,缩放数据至关重要 . 即使您只是进行简单的线性回归,这也是一种很好的做法,因为您将消除对具有较大值的要素的任何可能偏差 .

相关问题