0

以下は、ガウスプロセス(GP)をトレーニングし、MNISTデータセットから画像を分類するために評価するコードです。遅い予測:Scikitガウスプロセス分類

import numpy as np 


from sklearn.metrics.classification import accuracy_score, log_loss 
from sklearn.gaussian_process import GaussianProcessClassifier 
from sklearn.gaussian_process.kernels import RBF 
from sklearn import datasets 
from sklearn.datasets import fetch_mldata 

import random 

SAMPLE_SIZE = 2000 

def build_and_optimize(hp_space): 
    build_train() 
    return 

def build_train(hp_space): 
    l_scale = hp_space['l_scale'] 
    bias = hp_space['bias'] 
    gp_fix = GaussianProcessClassifier(kernel=bias * RBF(length_scale=l_scale), optimizer=None, multi_class='one_vs_rest') 

    X_train, X_test, y_train, y_test = prepare_data() 


    gp_fix.fit(X_train, y_train) 

    print("Log Marginal Likelihood (initial): %.3f" 
     % gp_fix.log_marginal_likelihood(gp_fix.kernel_.theta)) 


    y_ = gp_fix.predict(X_test[0:500]) 
    print(y_) 
    print(y_test[0:500]) 
    print("Accuracy: %.3f (initial)" 
     % (accuracy_score(y_test[0:500], y_))) 

    return 


def prepare_data(): 
    mnist = fetch_mldata('MNIST original', data_home='./') 
    mnist.keys() 

    images = mnist.data 
    targets = mnist.target 

    X_data = images/255.0 
    Y = targets 
    shuf = random.sample(range(len(X_data)), SAMPLE_SIZE) 

    X_train = [] 
    for x in shuf: X_train.append(X_data[x]) 

    y_train = [] 
    for x in shuf: y_train.append(Y[x]) 

    c_shuf = set(range(len(X_data))) - set(shuf) 

    X_test = [] 
    for x in c_shuf: X_test.append(X_data[x]) 

    y_test = [] 
    for x in c_shuf: y_test.append(Y[x]) 

    return X_train, X_test, y_train, y_test 

if __name__ == "__main__": 
    hp_space = {} 
    hp_space['l_scale'] = 1.0 
    hp_space['bias'] = 1.0 

    build_train(hp_space) 

モデルのトレーニングはかなりの時間がかかるようです。しかし、予測には時間がかかります。理由は何であるかのような任意のポインタですか?

+0

回答が不十分なパフォーマンスを解決したかどうか教えてください。 – sera

+0

@seraそれはあまり改善されません(それでも数分かかる)。しかし、私はそれをプロファイルしませんでした。 –

答えて

0

あなたは= addindでn_jobsをプロセスをスピードアップすることができ-1次のように:

gp_fix = GaussianProcessClassifier(kernel=bias * RBF(length_scale=l_scale), optimizer=None, multi_class='one_vs_rest', n_jobs = -1) 

この方法をドキュメントから:

計算に使用するジョブの数。 -1の場合、すべてのCPUが使用されます。 1を指定すると、並列計算コードはまったく使用されず、デバッグに役立ちます。 -1より下のn_jobsでは、(n_cpus + 1 + n_jobs)が使用されます。したがって、n_jobs = -2では、1つを除くすべてのCPUが使用されます。

出典:here

0

あなたはガウス過程を考えることができるとのSVMは、両方のモデルを構築するために、カーネルトリックを使用するのです、多少類似したモデルです。 Lik SVMs、GPsはトレーニングにO(n^3)時間を要し、nはトレーニングセット内のデータポイントの数である。したがって、データセットのサイズを増やしていくうちに、訓練に時間がかかり、データセットが急速に成長することが自然に予想されます。

同様に、GP予測は、最近傍サーチおよびSVMSと同様に、予測当たりO(n)時間かかる。しかし、GPソリューションは密集しています。つまり、すべてのトレーニングポイントを使用して予測を行います。つまり、SVMが疎なので、いくらか捨て去ります。

関連する問題