[英]Profiling SVM (e1071) in R
我是R和SVM的新手,我正在嘗試從e1071
包中分析svm
功能。 但是,我找不到任何大型數據集,這些數據集允許我獲得改變輸入數據大小的良好分析范圍。 有誰知道如何工作svm
? 我應該使用哪個數據集? svm
任何特定參數使其更難工作?
我復制了一些用於測試性能的命令。 也許最有用也更容易得到我在這里嘗試的東西:
#loading libraries
library(class)
library(e1071)
#I've been using golubEsets (more examples availables)
library(golubEsets)
#get the data: matrix 7129x38
data(Golub_Train)
n <- exprs(Golub_Train)
#duplicate rows(to make the dataset larger)
n<-rbind(n,n)
#take training samples as a vector
samplelabels <- as.vector(Golub_Train@phenoData@data$ALL.AML)
#calculate svm and profile it
Rprof('svm.out')
svmmodel1 <- svm(x=t(n), y=samplelabels, type='C', kernel="radial", cross=10)
Rprof(NULL)
我不斷增加數據集重復行和列,但我達到了內存的極限,而不是讓svm
更難工作......
在“工作SVM”方面 - 什么使SVM工作“更難”是一個更復雜的模型,不容易分離,更高的維度和更大,更密集的數據集。
SVM性能下降:
改變參數
您是否可以更改參數以使SVM花費更長時間。 當然,參數會影響您將獲得的解決方案的質量,並且可能沒有任何意義。
使用C-SVM,變化的C將導致不同的運行時間。 (nu-SVM中的相似參數是nu)如果數據集是合理可分的,那么使C更小將導致更長的運行時間,因為SVM將允許更多的訓練點成為支持向量。 如果數據集不是很可分離,那么使C更大將導致更長的運行時間,因為您實際上告訴SVM您需要一個與數據緊密匹配的窄邊距解決方案,並且當數據不容易計算時需要更長的時間來計算分離。
通常,您在進行參數搜索時會發現,有些參數會增加計算時間而精度沒有明顯提高。
其他參數是內核參數,如果你改變它們以增加計算內核的復雜性,那么SVM運行時自然會增加。 線性內核很簡單,速度最快; 非線性內核當然需要更長的時間。 一些參數可能不會增加內核的計算復雜性,但會強制使用更復雜的模型,這可能需要更長的SVM才能找到最佳解決方案。
要使用的數據集:
UCI機器學習庫是數據集的重要來源。
MNIST手寫識別數據集是一個很好用的 - 您可以隨機選擇數據的子集來創建越來越大的數據集。 請記住,鏈接中的數據包含所有數字,SVM當然是二進制的,因此您必須將數據減少到兩位數或執行某種多類SVM。
您也可以輕松生成數據集 。 要生成線性數據集,隨機選擇超平面的法向量,然后生成數據點並確定它所在的超平面的哪一側以標記它。 添加一些隨機性以允許超平面的特定距離內的點有時被不同地標記。 通過增加類之間的重疊來增加復雜性。 或者生成一些正態分布點的簇,標記為1或-1,以便分布在邊緣重疊。 經典的非線性示例是棋盤格。 生成點並以棋盤圖案標記它們。 更難以擴大正方形的數量,增加尺寸並增加數據點的數量。 當然,你必須使用非線性內核。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.