[PYTHON] Über die Verarbeitungsgeschwindigkeit von SVM (SVC) von Scikit-Learn

2016.09.14 Hinzugefügt über die Variation der Verarbeitungszeit </ Font>

Ich habe die Verarbeitungsgeschwindigkeiten von SVC (rbf-Kernel und linearer Kernel) und LinearSVC von scikit-learn verglichen.

Die verwendeten Daten sind die Spam-Daten, die im R-Kernlab-Paket enthalten sind. Erklärende Variablen sind 4601 Stichproben, 57 Dimensionen, Die Etiketten sind Spam: 1813 Proben und Nicht-Spam: 2788 Proben.

Die Ergebnisse, wenn die Anzahl der Proben und die Anzahl der Dimensionen geändert werden, sind wie folgt.

result.png

Der lineare Kernel von SVC ist zu langsam. Ich möchte nur eine Rastersuche mit dem Kerneltyp durchführen. Es scheint besser, LinearSVC richtig zu verwenden.

Der Bestätigungscode ist unten. Der Parameter C wird zur Vereinfachung der Messung der Verarbeitungszeit zugewiesen. Für die Merkmalsauswahl (Dimensionsreduzierung) haben wir die Merkmalsbedeutung von Random Forest verwendet. Dies liegt daran, dass die Verarbeitungszeit länger wurde, als die Auswahl entsprechend getroffen wurde.

test_svm.py


# -*- coding: utf-8 -*-

import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.svm import LinearSVC
from sklearn import cross_validation
from sklearn.grid_search import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.utils import shuffle
from sklearn.ensemble import RandomForestClassifier
from scipy.stats.mstats import mquantiles


def grid_search(X, y, estimator, params, cv, n_jobs=3):
    mdl = GridSearchCV(estimator, params, cv=cv, n_jobs=n_jobs)
    t1 = time.clock()
    mdl.fit(X, y)
    t2 = time.clock()
    return t2 - t1


if __name__=="__main__":
    data = pd.read_csv('spam.txt', header=0)
    y = data['type']
    del data['type']
    
    data, y = shuffle(data, y, random_state=0)
    data = StandardScaler().fit_transform(data)
    
    clf = RandomForestClassifier(n_estimators=100)
    clf.fit(data, y)

    ndim, elp_rbf, elp_lnr, elp_lsvm = [], [], [], []
    for thr in mquantiles(clf.feature_importances_, prob=np.linspace(1., 0., 5)):
        print thr,
        X = data[:,clf.feature_importances_ >= thr]
        ndim.append(X.shape[1])
        
        cv = cross_validation.StratifiedShuffleSplit(y, test_size=0.2, random_state=0)

        print 'rbf',
        elp_rbf.append(grid_search(X, y, SVC(random_state=0),
            [{'kernel': ['rbf'], 'C': [1, 10, 100]}], cv))

        print 'linear',
        elp_lnr.append(grid_search(X, y, SVC(random_state=0),
            [{'kernel': ['linear'], 'C': [1, 10, 100]}], cv))

        print 'lsvm'
        elp_lsvm.append(grid_search(X, y, LinearSVC(random_state=0),
            [{'C': [1, 10, 100]}], cv))

    plt.figure()
    plt.title('Elapsed time - # of dimensions')
    plt.ylabel('Elapsed time [sec]')
    plt.xlabel('# of dimensions')
    plt.grid()
    plt.plot(ndim, elp_rbf, 'o-', color='r',
             label='SVM(rbf)')
    plt.plot(ndim, elp_lnr, 'o-', color='g',
             label='SVM(linear)')
    plt.plot(ndim, elp_lsvm, 'o-', color='b',
             label='LinearSVM')
    plt.legend(loc='best')
    plt.savefig('dimensions.png', bbox_inches='tight')
    plt.close()


    nrow, elp_rbf, elp_lnr, elp_lsvm = [], [], [], []
    for r in np.linspace(0.1, 1., 5):
        print r,
        X = data[:(r*data.shape[0]),:]
        yy = y[:(r*data.shape[0])]
        nrow.append(X.shape[0])
        
        cv = cross_validation.StratifiedShuffleSplit(yy, test_size=0.2, random_state=0)

        print 'rbf',
        elp_rbf.append(grid_search(X, yy, SVC(random_state=0),
            [{'kernel': ['rbf'], 'C': [1, 10, 100]}], cv))

        print 'linear',
        elp_lnr.append(grid_search(X, yy, SVC(random_state=0),
            [{'kernel': ['linear'], 'C': [1, 10, 100]}], cv))

        print 'lsvm'
        elp_lsvm.append(grid_search(X, yy, LinearSVC(random_state=0),
            [{'C': [1, 10, 100]}], cv))

    plt.figure()
    plt.title('Elapsed time - # of samples')
    plt.ylabel('Elapsed time [sec]')
    plt.xlabel('# of samples')
    plt.grid()
    plt.plot(nrow, elp_rbf, 'o-', color='r',
             label='SVM(rbf)')
    plt.plot(nrow, elp_lnr, 'o-', color='g',
             label='SVM(linear)')
    plt.plot(nrow, elp_lsvm, 'o-', color='b',
             label='LinearSVM')
    plt.legend(loc='best')
    plt.savefig('samples.png', bbox_inches='tight')
    plt.close()

Nachtrag

Ich habe einen Kommentar zur Verarbeitungszeit von SVM (linear) erhalten und ihn überprüft. Mit Python2.7.12, scikit-learn0.17.1, Die folgende Abbildung zeigt die Variation der Verarbeitungszeit, wenn die Anzahl der Daten 1000 beträgt, die Anzahl der Merkmale 29 beträgt und 200 Versuche durchgeführt werden.

SVM (linear) ist verdächtig ...

freq.png

Recommended Posts

Über die Verarbeitungsgeschwindigkeit von SVM (SVC) von Scikit-Learn
Über SVC des SVM-Moduls (ohne Mathematik)
Ich habe die Verarbeitungsgeschwindigkeit der numpy eindimensionalisierung überprüft
Informationen zum Verhalten der Warteschlange während der Parallelverarbeitung
Über max_iter von LogisticRegression () von scikit-learn
python3 Messen Sie die Verarbeitungsgeschwindigkeit.
Parallele Verarbeitung mit Parallel von Scikit-Learn
Über die Komponenten von Luigi
Über die Funktionen von Python
So erhöhen Sie die Verarbeitungsgeschwindigkeit der Erfassung der Scheitelpunktposition
Über den Rückgabewert von pthread_mutex_init ()
Über den Rückgabewert des Histogramms.
Über den Grundtyp von Go
Über die Obergrenze von Threads-max
Über das Verhalten von Yield_per von SqlAlchemy
Über die Größe der Punkte in Matplotlib
Über die Farbhalbtonverarbeitung von Bildern
Informationen zur Grundlagenliste der Python-Grundlagen
Berücksichtigen Sie die Verarbeitungsgeschwindigkeit, um den Bildpuffer mit numpy.ndarray zu verschieben
Lassen Sie uns über die Tonkurve der Bildverarbeitung sprechen ~ LUT ist erstaunlich ~
Informationen zum Verhalten von enable_backprop von Chainer v2
Informationen zur virtuellen Umgebung von Python Version 3.7
Über die Argumente der Setup-Funktion von PyCaret
Über die Normalgleichung der linearen Regression
Die Geschichte der Verarbeitung A von Blackjack (Python)
Über die Hauptaufgaben der Bildverarbeitung (Computer Vision) und die verwendete Architektur
Informationen zur Genauigkeit der Berechnungsmethode für das Umfangsverhältnis von Archimedes
Über das Verhalten von copy, deepcopy und numpy.copy
Informationen zur X-Achsen-Notation des Balkendiagramms von Matplotlib
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Vergleichen Sie die Geschwindigkeit von Python Append und Map
Bildverarbeitung? Die Geschichte, Python für zu starten
Über die Entwicklungsinhalte des maschinellen Lernens (Beispiel)
Prognostizieren Sie die zweite Runde des Sommers 2016 mit scikit-learn
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
[Python] Bestimmen Sie den Typ der Iris mit SVM
Eine einfache Möglichkeit, die Verarbeitungsgeschwindigkeit einer von Linux erkannten Festplatte zu messen
Über den Test
[Übersetzung] scikit-learn 0.18 Tutorial Statistisches Lernen Tutorial für die wissenschaftliche Datenverarbeitung Unbeaufsichtigtes Lernen: Suche nach Datendarstellung
Ich habe mir den Inhalt von sklearn (scikit-learn) angesehen. (1) ~ Was ist mit der Implementierung von CountVectorizer? ~
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Über die Warteschlange
[Übersetzung] scikit-learn 0.18 Benutzerhandbuch 3.2. Optimieren der Hyperparameter des Schätzers
Ein Memorandum über Warnungen in Pylint-Ausgabeergebnissen
Werfen Sie einen Blick auf die Verarbeitung von LightGBM Tuner
Die Entscheidung von scikit-learn Wie man ein Holzmodell visualisiert
[Kapitel 6] Einführung in Scicit-Learn mit 100 Klopfen Sprachverarbeitung
Denken Sie an das Rack und WSGI der nächsten Generation
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Über die Ineffizienz der Datenübertragung im luigi on-memory
Untersuchen Sie die genaue Verarbeitung des Python-Datasets (SQLAlchemy-Wrapper).
Über die übersichtliche Anordnung in der Importreihenfolge von Flake8
Eine Geschichte über die Änderung des Master-Namens von BlueZ
Persönliche Hinweise zur Integration von vscode und anaconda
Ein Memorandum über die Umsetzung von Empfehlungen in Python