GridSearchCV extrem langsam auf kleine dataset in scikit-learn
Dies ist ungerade. Kann ich erfolgreich führen Sie das Beispiel grid_search_digits.py
. Allerdings bin ich nicht in der Lage zu tun, ein grid-search auf meinen eigenen Daten.
Habe ich Folgendes setup:
import sklearn
from sklearn.svm import SVC
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import LeaveOneOut
from sklearn.metrics import auc_score
# ... Build X and y ....
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
'C': [1, 10, 100, 1000]},
{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]
loo = LeaveOneOut(len(y))
clf = GridSearchCV(SVC(C=1), tuned_parameters, score_func=auc_score)
clf.fit(X, y, cv=loo)
....
print clf.best_estimator_
....
Aber ich habe nie übergeben bekommen clf.fit
(ich ließ es laufen für ~1 Stunde).
Ich habe versucht auch mit
clf.fit(X, y, cv=10)
und mit
skf = StratifiedKFold(y,2)
clf.fit(X, y, cv=skf)
und hatte das gleiche problem (es endet nie die clf.fit-Anweisung). Meine Daten sind einfach:
> X.shape
(27,26)
> y.shape
27
> numpy.sum(y)
5
> y.dtype
dtype('int64')
>?y
Type: ndarray
String Form:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1]
Length: 27
File: /home/jacob04/opt/python/numpy/numpy-1.7.1/lib/python2.7/site-
packages/numpy/__init__.py
Docstring: <no docstring>
Class Docstring:
ndarray(shape, dtype=float, buffer=None, offset=0,
strides=None, order=None)
> ?X
Type: ndarray
String Form:
[[ -3.61238468e+03 -3.61253920e+03 -3.61290196e+03 -3.61326679e+03
7.84590361e+02 0.0000 <...> 0000e+00 2.22389150e+00 2.53252959e+00
2.11606216e+00 -1.99613432e+05 -1.99564828e+05]]
Length: 27
File: /home/jacob04/opt/python/numpy/numpy-1.7.1/lib/python2.7/site-
packages/numpy/__init__.py
Docstring: <no docstring>
Class Docstring:
ndarray(shape, dtype=float, buffer=None, offset=0,
strides=None, order=None)
Ist dies alles mit der neuesten version von scikit-learn (0.13.1) und:
$ pip freeze
Cython==0.19.1
PIL==1.1.7
PyXB==1.2.2
PyYAML==3.10
argparse==1.2.1
distribute==0.6.34
epc==0.0.5
ipython==0.13.2
jedi==0.6.0
matplotlib==1.3.x
nltk==2.0.4
nose==1.3.0
numexpr==2.1
numpy==1.7.1
pandas==0.11.0
pyparsing==1.5.7
python-dateutil==2.1
pytz==2013b
rpy2==2.3.1
scikit-learn==0.13.1
scipy==0.12.0
sexpdata==0.0.3
six==1.3.0
stemming==1.0.1
-e git+https://github.com/PyTables/PyTables.git@df7b20444b0737cf34686b5d88b4e674ec85575b#egg=tables-dev
tornado==3.0.1
wsgiref==0.1.2
Das seltsame ist, dass die Montage einer einzelnen SVM ist extrem schnell:
> %timeit clf2 = svm.SVC(); clf2.fit(X,y)
1000 loops, best of 3: 328 us per loop
Update
Habe ich bemerkt, dass wenn ich pre-Skalierung der Daten mit:
from sklearn import preprocessing
X = preprocessing.scale(X)
die grid-Suche ist extrem schnell.
Warum? Warum GridSearchCV
ist so empfindlich auf die Skalierung während einer regulären svm.SVC().fit
nicht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits erwähnt,
für
SVM
-basierte Klassifikatoren ( wiey == np.int*
)Vorverarbeitung ist ein muss, ansonsten ist der ML-Schätzer ist die Vorhersage-Fähigkeit verloren, direkt schräg features " Einfluss auf eine Entscheidung-Funktion.
Als widersprochen und die Verarbeitung mal:
[C,gamma]
Landschaft.
Manchmal, die
GridSearchCV()
können in der Tat eine riesige Menge an CPU-Zeit /CPU-poolOfRESOURCEs, auch nach all den oben genannten Tipps sind verwendet.Also, ruhig bleiben und keine Panik, wenn Sie sicher sind, dass das Feature-Engineering, Daten-Vernunft & FeatureDOMAIN Vorverarbeitung korrekt ausgeführt wurde.
Gefragt haben, wie oben über "... eine regelmäßige
svm.SVC().fit
"bitte berücksichtigen Sie,
es verwendet Standard -
[C,gamma]
Werte und haben somit keine Relevanz für das Verhalten Ihres Modells /ProblemDOMAIN.Re: Update
oh ja, in der Tat, Regularisierung/Skalierung des SVM-Eingänge ist eine zwingende Aufgabe für das AI/ML-tool.
scikit-learn ist eine gute Instrumentierung zu produzieren und re-use -
aScalerOBJECT
für beide a-priori-Skalierung ( voraDataSET
geht in.fit()
) & ex-post-ad-hoc-Skalierung, wenn Sie brauchen, um re-scale eine neue Beispiel und senden Sie es an den Prädiktor zu beantworten, es ist Magieüber eine Anfrage zu
anSvmCLASSIFIER.predict( aScalerOBJECT.transform( aNewExampleX ) )
( Ja,
aNewExampleX
kann eine matrix, so ist zu Fragen, für eine "vektorisierte" Verarbeitung von mehreren Antworten )Leistung Linderung von O(M^2.N^1) rechnerische Komplexität
Im Gegensatz zu den weiter unten gepostet, denke mal, dass das Problem-"Breite", gemessen als
N
== eine Anzahl von SVM-Funktionen in der matrixX
ist verantwortlich für eine Gesamt-Rechenzeit, der SVM-Klassifikator mit rbf-kernel ist by-design einO(M^2.N^1)
problem.So, es gibt quadratische Abhängigkeit von der Gesamtzahl der Beobachtungen ( Beispiele ), zog in eine Ausbildung (
.fit()
) oder CrossValidation-phase und man kann kaum sagen, daß der betreute learning classifier wird besser Vorhersagekraft, wenn man "reduziert" die ( linear ) "Breite" von Funktionen, die per se tragen die Eingänge in die konstruierte Vorhersagekraft der SVM-Klassifikator, nicht wahr?Support-Vektor-Maschinen sind empfindlich auf die Skalierung. Es ist sehr wahrscheinlich, dass Ihr SVC ist eine lange Zeit zu bauen ein individuelles Modell. GridSearch ist im Grunde eine brute-force-Methode, die ausgeführt wird, die von den Basis-Modellen mit verschiedenen Parametern. Also, wenn Ihr GridSearchCV die Zeit nehmen, zu bauen, es ist eher wegen