[PYTHON] À propos de la vitesse de traitement de SVM (SVC) de scikit-learn

2016.09.14 Ajouté à propos de la variation du temps de traitement </ Font>

J'ai comparé les vitesses de traitement du SVC de scikit-learn (noyau rbf et noyau linéaire) et LinearSVC.

Les données utilisées sont les données de spam incluses dans le package R kernlab. Les variables explicatives sont 4601 échantillons, 57 dimensions, Les étiquettes sont spam: 1813 échantillons et non-spam: 2788 échantillons.

Les résultats lorsque le nombre d'échantillons et le nombre de dimensions sont modifiés sont les suivants.

result.png

Le noyau linéaire de SVC est trop lent. Je veux juste faire une recherche dans la grille incluant le type de noyau, Il semble préférable d'utiliser correctement LinearSVC.

Le code de vérification est ci-dessous. Le paramètre C est attribué pour faciliter le traitement de la mesure du temps. Pour la sélection d'entités (réduction de dimension), nous avons utilisé l'importance des caractéristiques de Random Forest. En effet, le temps de traitement est devenu plus long lorsque la sélection a été effectuée de manière appropriée.

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()

Postscript

J'ai reçu un commentaire sur le temps de traitement de SVM (linéaire), donc je l'ai vérifié. Avec Python2.7.12, scikit-learn0.17.1, La figure ci-dessous montre la variation du temps de traitement lorsque le nombre de données est de 1000, le nombre de fonctionnalités est de 29 et 200 essais sont effectués.

SVM (linéaire) est suspect ...

freq.png

Recommended Posts

À propos de la vitesse de traitement de SVM (SVC) de scikit-learn
À propos du SVC du module svm (sans mathématiques)
J'ai vérifié la vitesse de traitement de la numpy unidimensionnelle
À propos du comportement de la file d'attente pendant le traitement parallèle
À propos de max_iter de LogisticRegression () de scikit-learn
python3 Mesurez la vitesse de traitement.
Traitement parallèle avec Parallel de scikit-learn
À propos des composants de Luigi
À propos des fonctionnalités de Python
Comment augmenter la vitesse de traitement de l'acquisition de la position des sommets
À propos de la valeur de retour de pthread_mutex_init ()
À propos de la valeur de retour de l'histogramme.
À propos du type de base de Go
À propos de la limite supérieure de threads-max
À propos du comportement de yield_per de SqlAlchemy
À propos de la taille des points dans matplotlib
À propos du traitement des demi-teintes couleur des images
À propos de la liste de base des bases de Python
Considérez la vitesse de traitement pour déplacer le tampon d'image avec numpy.ndarray
Parlons de la courbe de tonalité du traitement d'image ~ LUT est incroyable ~
A propos du comportement de enable_backprop de Chainer v2
À propos de l'environnement virtuel de Python version 3.7
A propos des arguments de la fonction setup de PyCaret
À propos de l'équation normale de la régression linéaire
L'histoire du traitement A du blackjack (python)
A propos des principales tâches de traitement d'image (vision par ordinateur) et de l'architecture utilisée
À propos de la précision de la méthode de calcul du rapport de circonférence d'Archimède
À propos du comportement de copy, deepcopy et numpy.copy
À propos de la notation de l'axe X du graphique à barres de Matplotlib
Afficher le résultat du traitement de la géométrie en Python
Écrire une note sur la version python de python virtualenv
Comparez la vitesse d'ajout et de carte Python
Traitement d'image? L'histoire du démarrage de Python pour
À propos du contenu de développement de l'apprentissage automatique (exemple)
Prédisez le deuxième tour de l'été 2016 avec scikit-learn
[Note] À propos du rôle du trait de soulignement "_" en Python
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
[Python] Déterminez le type d'iris avec SVM
Un moyen simple de mesurer la vitesse de traitement d'un disque reconnu par Linux
À propos du test
[Français] didacticiel scikit-learn 0.18 Didacticiel d'apprentissage statistique pour le traitement des données scientifiques Apprentissage non supervisé: recherche de représentation des données
J'ai jeté un œil au contenu de sklearn (scikit-learn) (1) ~ Qu'en est-il de l'implémentation de CountVectorizer? ~
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
À propos de la file d'attente
[Français] scikit-learn 0.18 Guide de l'utilisateur 3.2. Réglage des hyper paramètres de l'estimateur
Un mémorandum sur les avertissements dans les résultats de sortie de pylint
Jetez un œil au traitement de LightGBM Tuner
La décision de scikit-learn Comment visualiser un modèle en bois
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
Pensez à la nouvelle génération de Rack et WSGI
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
À propos de l'inefficacité du transfert de données dans luigi on-memory
Examiner le traitement de fermeture de l'ensemble de données Python (wrapper SQLAlchemy)
À propos de l'ordre épuré dans l'ordre d'importation flake8
Une histoire sur le changement du nom principal de BlueZ
Notes personnelles sur l'intégration de vscode et anaconda
Un mémorandum sur la mise en œuvre des recommandations en Python