web-dev-qa-db-fra.com

Prédire le temps nécessaire à la classification scikit-learn

Existe-t-il un moyen de prédire combien de temps il faudra pour exécuter un classificateur à partir de sci-kit learn en fonction des paramètres et du jeu de données? Je sais, jolie méta, non?

Certaines combinaisons de classificateurs/paramètres sont assez rapides, et certaines prennent tellement de temps que je finis par tuer le processus. Je voudrais un moyen d'estimer à l'avance combien de temps cela prendra.

Sinon, j'accepterais quelques indications sur la manière de définir des paramètres communs pour réduire le temps d'exécution.

21
ntaggart

Il existe des classes très spécifiques de classificateurs ou de régresseurs qui rapportent directement le temps restant ou la progression de votre algorithme (nombre d'itérations, etc.). La plupart de ces opérations peuvent être activées en passant l'option verbose=2 (tout nombre élevé> 1) au constructeur de modèles individuels. Remarque: ce comportement est conforme à sklearn-0.14. Les versions précédentes ont une sortie verbeuse légèrement différente (toujours utile).

Le meilleur exemple de ceci est ensemble.RandomForestClassifier ou ensemble.GradientBoostingClassifier` qui imprime le nombre d'arbres construits jusqu'à présent et le temps restant.

clf = ensemble.GradientBoostingClassifier(verbose=3)
clf.fit(X, y)
Out:
   Iter       Train Loss   Remaining Time
     1           0.0769            0.10s
     ...

Ou

clf = ensemble.RandomForestClassifier(verbose=3)
clf.fit(X, y)
Out:
  building tree 1 of 100
  ...

Cette information de progression est assez utile pour estimer le temps total. 

Ensuite, il existe d'autres modèles, tels que les SVM, qui affichent le nombre d'itérations d'optimisation effectuées, mais ne rapportent pas directement le temps restant.

clf = svm.SVC(verbose=2)
clf.fit(X, y)
Out:
   *
    optimization finished, #iter = 1
    obj = -1.802585, rho = 0.000000
    nSV = 2, nBSV = 2
    ...

Les modèles tels que les modèles linéaires ne fournissent pas ces informations de diagnostic pour autant que je sache. 

Consultez ce fil pour en savoir plus sur la signification des niveaux de verbosité: scikit-learn fit fit le temps restant

31
Sudeep Juvekar

Si vous utilisez IPython, vous pouvez envisager d’utiliser les commandes magiques intégrées telles que% time et% timeit

% time - Heure d'exécution d'une instruction ou d'une expression Python. Les temps de la CPU et de l'horloge murale sont imprimés et la valeur de l'expression (le cas échéant) est renvoyée. Notez que sous Win32, l'heure système est toujours signalée comme 0, car elle ne peut pas être mesurée.

% timeit - Heure d'exécution d'une instruction ou d'une expression Python à l'aide du module timeit.

Exemple:

In [4]: %timeit NMF(n_components=16, tol=1e-2).fit(X)
1 loops, best of 3: 1.7 s per loop

Références: 

https://ipython.readthedocs.io/fr/stable/interactive/magics.html

http://scikit-learn.org/stable/developers/performance.html

0
Gustavo Bertoli

Nous travaillons actuellement sur un paquet package qui donne des estimations de la durée d'exécution de ajustements scikit-learn. 

En gros, vous le lanceriez juste avant d’exécuter algo.fit (X, y) pour obtenir une estimation de l’exécution.

Voici un cas d'utilisation simple:

from scitime import Estimator 
estimator = Estimator() 
rf = RandomForestRegressor()
X,y = np.random.Rand(100000,10),np.random.Rand(100000,1)
# Run the estimation
estimation, lower_bound, upper_bound = estimator.time(rf, X, y)

N'hésitez pas à jeter un coup d'oeil!

0
Nathan Toubiana