2014-11-19 5 views
0

Я пытаюсь разборки обученного классификатора SVM из библиотеки Scikit-learn, так что мне не нужно ее обучать и снова. Но когда я передаю тестовые данные классификатору, загруженному из рассола, я получаю необычно высокие значения для точности, f меры и т. Д. Если тестовые данные передаются непосредственно классификатору, который не маринован, он дает значительно более низкие значения , Я не понимаю, почему травление и расклеивание объекта классификатора меняет способ его поведения. Может кто-то, пожалуйста, помогите мне с этим?Травление обученного классификатора дает разные результаты по результатам, полученным непосредственно от недавно обученного классификатора

Я делаю что-то вроде этого:

from sklearn.externals import joblib 
joblib.dump(grid, 'grid_trained.pkl') 

Здесь grid является обучением объекта классификатора. Когда я ее расклеиваю, он действует очень сильно, когда он используется напрямую.

+1

Там не должно быть никаких разница. Вы травляете/рассыпаете с той же версией scikit-learn? Можете ли вы дать минимальный пример для воспроизведения поведения? –

ответ

0

Там не должно быть никакого различия, как указано @AndreasMueller, вот модифицированный пример из http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html#loading-the-20-newgroups-dataset с помощью pickle:

from sklearn.datasets import fetch_20newsgroups 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer 
from sklearn.naive_bayes import MultinomialNB 

# Set labels and data 
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med'] 
twenty_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42) 

# Vectorize data 
count_vect = CountVectorizer() 
X_train_counts = count_vect.fit_transform(twenty_train.data) 

# TF-IDF transformation 
tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts) 
X_train_tf = tf_transformer.transform(X_train_counts) 
tfidf_transformer = TfidfTransformer() 
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts) 

# Train classifier 
clf = MultinomialNB().fit(X_train_tfidf, twenty_train.target) 

# Tag new data 
docs_new = ['God is love', 'OpenGL on the GPU is fast'] 
X_new_counts = count_vect.transform(docs_new) 
X_new_tfidf = tfidf_transformer.transform(X_new_counts) 
predicted = clf.predict(X_new_tfidf) 

answers = [(doc, twenty_train.target_names[category]) for doc, category in zip(docs_new, predicted)] 


# Pickle the classifier 
import pickle 
with open('clf.pk', 'wb') as fout: 
    pickle.dump(clf, fout) 

# Let's clear the classifier 
clf = None 

with open('clf.pk', 'rb') as fin: 
    clf = pickle.load(fin) 

# Retag new data 
docs_new = ['God is love', 'OpenGL on the GPU is fast'] 
X_new_counts = count_vect.transform(docs_new) 
X_new_tfidf = tfidf_transformer.transform(X_new_counts) 
predicted = clf.predict(X_new_tfidf) 

answers_from_loaded_clf = [(doc, twenty_train.target_names[category]) for doc, category in zip(docs_new, predicted)] 

assert answers_from_loaded_clf == answers 
print "Answers from freshly trained classifier and loaded pre-trained classifer are the same !!!" 

Это то же самое при использовании sklearn.externals.joblib тоже:

# Pickle the classifier 
from sklearn.externals import joblib 
joblib.dump(clf, 'clf.pk') 

# Let's clear the classifier 
clf = None 

# Loads the pretrained classifier 
clf = joblib.load('clf.pk') 

# Retag new data 
docs_new = ['God is love', 'OpenGL on the GPU is fast'] 
X_new_counts = count_vect.transform(docs_new) 
X_new_tfidf = tfidf_transformer.transform(X_new_counts) 
predicted = clf.predict(X_new_tfidf) 

answers_from_loaded_clf = [(doc, twenty_train.target_names[category]) for doc, category in zip(docs_new, predicted)] 

assert answers_from_loaded_clf == answers 
print "Answers from freshly trained classifier and loaded pre-trained classifer are the same !!!" 
Смежные вопросы