我在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比两者都要长得多?它可以根据我的数据发生巨大变化吗?
答案 0 :(得分:9)
您是否扩展了数据?
这可能成为SVM的一个问题。根据{{3}}
因为内核值通常取决于内部产品 特征向量,例如线性内核和多项式内核,大的属性值可能会导致数值问题。
现在举个例子,我将使用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 Practical Guide to Support Vector Classification,并阅读不仅仅是我链接的wiki条目。这种间距使得该过程需要更长的时间。试图在这个巨大的空间中分离类的数学背后变得非常复杂,特别是随着特征和观察数量的增加。因此,始终扩展数据至关重要。即使您只是进行简单的线性回归,这也是一种很好的做法,因为您将消除对具有较大值的要素的任何可能偏差。