Jak zapisać wyszkolonego klasyfikatora Naive Bayes na dysk i użyć go do przewidywania danych?
Mam następujący przykładowy program ze strony scikit-learn:
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print "Number of mislabeled points : %d" % (iris.target != y_pred).sum()
Możesz także użyć joblib.dump i joblib.load, który jest znacznie bardziej wydajny w obsłudze tablic numerycznych niż domyślny program wybierający Pythona.
Joblib jest zawarty w scikit-learn:
Edycja: w Pythonie 3.8+ można teraz używać piklowania do efektywnego trawienia obiektów z dużymi tablicami numerycznymi jako atrybutami, jeśli używasz protokołu piklowania 5 (co nie jest domyślne).
źródło
fit
metody, jeśli tego właśnie szukasz. To powiedziawszy,joblib.load
nie powinno zgłaszać wyjątku po pomyślnymjoblib.dump
wywołaniu go z Pythona z tą samą wersją biblioteki scikit-learn.--pylab
flagi wiersza poleceń ani%pylab
magii, ponieważ wiadomo, że niejawne przeciążenie przestrzeni nazw przerywa proces wytrawiania.%matplotlib inline
Zamiast tego użyj jawnego importu i magii.To, czego szukasz, nazywa się trwałością modelu w sklearnach i jest udokumentowane we wstępie oraz w sekcjach trwałości modelu .
Więc zainicjalizowałeś swój klasyfikator i trenowałeś go przez długi czas
Po tym masz dwie opcje:
1) Za pomocą marynaty
2) Korzystanie z Joblib
Jeszcze raz pomocne jest przeczytanie wyżej wymienionych linków
źródło
W wielu przypadkach, szczególnie w przypadku klasyfikacji tekstowej, nie wystarczy po prostu przechowywać klasyfikator, ale trzeba również przechowywać wektoryzator, aby wektoryzować dane wejściowe w przyszłości.
przyszły przypadek użycia:
Przed zrzuceniem wektoryzatora można usunąć właściwość stop_words_ wektoryzatora poprzez:
aby dumping był bardziej wydajny. Również jeśli parametry klasyfikatora są rzadkie (jak w większości przykładów klasyfikacji tekstu), możesz przekonwertować parametry z gęstego na rzadkie, co spowoduje ogromną różnicę pod względem zużycia pamięci, ładowania i zrzutu. Sparsify model przez:
Który automatycznie będzie działał dla SGDClassifier, ale jeśli wiesz, że twój model jest rzadki (dużo zer w pliku clf.coef_), możesz ręcznie przekonwertować plik clf.coef_ na csr scipy rzadką macierz poprzez:
a następnie możesz przechowywać go bardziej wydajnie.
źródło
sklearn
estymatory wdrażają metody ułatwiające zapisywanie odpowiednich przeszkolonych właściwości estymatora. Niektóre estymatory implementują__getstate__
same metody, ale inne, jak na przykładGMM
użycie podstawowej implementacji, która po prostu zapisuje wewnętrzny słownik obiektów:Zalecaną metodą zapisania modelu na dysku jest użycie
pickle
modułu:Powinieneś jednak zapisać dodatkowe dane, abyś mógł ponownie przeszkolić swój model w przyszłości lub ponieść straszne konsekwencje (takie jak zamknięcie się w starej wersji sklearn) .
Z dokumentacji :
Jest to szczególnie prawdziwe w przypadku estymatorów
tree.pyx
zestawów, które opierają się na module napisanym w Cython (np.IsolationForest
), Ponieważ tworzy ono sprzężenie z implementacją, co nie gwarantuje stabilności między wersjami sklearn. W przeszłości widział niezgodne wstecz wstecz zmiany.Jeśli twoje modele stają się bardzo duże, a ładowanie staje się uciążliwe, możesz również użyć bardziej wydajnych
joblib
. Z dokumentacji:źródło
but can only pickle to the disk and not to a string
Ale możesz zalać to w StringIO z joblib. To właśnie robię cały czas.The training data, e.g. a reference to a immutable snapshot
tutaj? TIA!sklearn.externals.joblib
została zaniechana , ponieważ0.21
i zostaną usunięte wv0.23
:Dlatego musisz zainstalować
joblib
:i na koniec wypisz model na dysk:
Teraz, aby odczytać zrzucony plik, wystarczy uruchomić:
źródło