我在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 回答
您是否扩展了数据?
这可能成为SVM的一个问题 . 根据A Practical Guide to Support Vector Classification
现在举个例子,我将使用sklearn乳腺癌数据集:
输出:
所以你可以看到,在这个具有形状(560,30)的数据集中,我们通过一点扩展得到了非常显着的性能提升 .
此行为取决于具有大值的功能 . 考虑在无限维空间中工作 . 随着您填充无限维空间的值越大,其多维产品之间的空间越大,得到的结果就越大 . 我不能强调 a lot 足够了 . 阅读The Curse of Dimensionality,并阅读不仅仅是我链接的wiki条目 . 这种间距使得该过程需要更长的时间 . 试图在这个巨大的空间中分离类的数学背后变得非常复杂,特别是随着特征和观察数量的增加 . 因此,缩放数据至关重要 . 即使您只是进行简单的线性回归,这也是一种很好的做法,因为您将消除对具有较大值的要素的任何可能偏差 .