2017-02-28 52 views
0

私はSVMの世界で初めて、チュートリアルを通して自分自身を教えようとしています。私は最近サンプルsvmテストを作成しようとしましたが、run-timeは無限に見えます。私のdataframeに7976の行があるとすると、典型的な処理時間はどのくらいですか?SVMでの処理時間

import numpy as np 
from sklearn import svm 
from sklearn import preprocessing 
import pandas as pd 
import os 

directory_name = 'D:\Timothy\Practice SVM\Data' 
name_of_file = 'Sample_SVM.csv' 

df_start = pd.read_csv(os.path.join(directory_name, name_of_file)) 
df_cleaned = df_start.dropna() 

X = df_cleaned.ix[1:8000, 'Sun'].as_matrix() 
X = X.reshape((7976,1)) #unsure if this step is needed 
X_test = df_cleaned.ix[8000:9913, 'Sun'].as_matrix() 

y = df_cleaned.ix[1:8000, 'Meter_Total'].as_matrix() 
y_test = df_cleaned.ix[8000:9913, 'Meter_Total'].as_matrix() 

model = svm.SVC(kernel='linear', C=1, gamma=1) 

model.fit(X,y) 
model.score(X, y) 

predicted = model.predict(X_test) 
+0

データは正規化されていますか? – hashcode55

答えて

0

前提:あなたは用語「ランタイム」を使用する場合、それは「トレーニング時間」または(与えられたプログラムで)「テスト時間」のいずれかになりますが、あなたは、データフレームがI、7976行を持っていると言ったので、それを訓練時間とみなすつもりです。

リニアSVMを考慮すると、トレーニング時に、2次問題を解くことによってベクトルwとバイアスbを推定し、それによってサポートベクトルを見つける必要があります。 一般的に、最適解に到達したかどうかをテストするには、n²ドットプロダクトの順序が必要であり、2次問題を解くには 'カーネル'行列の逆変換が必要です。これはn³程度です。 (ここで、nはトレーニングセット内のサンプル数である)。しかし、最適解を見積もる必要はほとんどありません。線形SVMが一定レベルの汎化誤差に達するための訓練時間は、訓練集合サイズが増加するにつれて実際には減少する。一般に、これはどのテクニックを使用しているかに大きく依存しますが、最先端のリニアSVMや近似ソルバを除き、すべてのトレーニング時間がn²程度になると予想しています。

正確には、scikit-learnパッケージの場合、liblinearのようなリニアSVMの場合(n_sample * n_features)、強い正則化(低C)を指定すると収束が速くなります。

関連する問題