не может передавать данные массива при вызове сохраненного классификатора

Я создал классификатор, используя https://gist.github.com/zacstewart/5978000 . Для обучения классификатора я использую следующий код

import os import numpy NEWLINE = '\n' SKIP_FILES = set(['cmds']) def read_files(path): for root, dir_names, file_names in os.walk(path): for path in dir_names: read_files(os.path.join(root, path)) for file_name in file_names: if file_name not in SKIP_FILES: file_path = os.path.join(root, file_name) if os.path.isfile(file_path): past_header, lines = False, [] f = open(file_path) for line in f: if past_header: lines.append(line) elif line == NEWLINE: past_header = True f.close() yield file_path, NEWLINE.join(lines).decode('cp1252', 'ignore') from pandas import DataFrame def build_data_frame(path, classification): data_frame = DataFrame({'text': [], 'class': []}) for file_name, text in read_files(path): data_frame = data_frame.append( DataFrame({'text': [text], 'class': [classification]}, index=[file_name])) return data_frame HAM = 0 SPAM = 1 SOURCES = [ ('data/spam', SPAM), ('data/easy_ham', HAM), ('data/hard_ham', HAM), ('data/beck-s', HAM), ('data/farmer-d', HAM), ('data/kaminski-v', HAM), ('data/kitchen-l', HAM), ('data/lokay-m', HAM), ('data/williams-w3', HAM), ('data/BG', SPAM), ('data/GP', SPAM), ('data/SH', SPAM) ] data = DataFrame({'text': [], 'class': []}) for path, classification in SOURCES: data = data.append(build_data_frame(path, classification)) data = data.reindex(numpy.random.permutation(data.index)) import numpy from sklearn.feature_extraction.text import CountVectorizer count_vectorizer = CountVectorizer() counts = count_vectorizer.fit_transform(numpy.asarray(data['text'])) from sklearn.naive_bayes import MultinomialNB classifier = MultinomialNB() targets = numpy.asarray(data['class']) clf = classifier.fit(counts, targets) from sklearn.externals import joblib joblib.dump(clf, 'my_trained_data.pkl', compress=9) 

Если я тестирую пример в этом файле, он работает правильно. Но я пытаюсь сохранить классификатор в my_trained_data.pkl, затем назову его задницей

 from sklearn.externals import joblib clf = joblib.load('my_trained_data.pkl') examples = ['Free Viagra call today!', "I'm going to attend the Linux users group tomorrow."] predictions = clf.predict(examples) 

Это дает следующую ошибку.

 TypeError: Cannot cast array data from dtype('float64') to dtype('S32') according to the rule 'safe' 

Ниже приводится след

 In [12]: runfile('/home/harpreet/Machine_learning/untitled0.py', wdir='/home/harpreet/Machine_learning') MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True) Traceback (most recent call last): File "<ipython-input-12-521f3ed1e6da>", line 1, in <module> runfile('/home/harpreet/Machine_learning/untitled0.py', wdir='/home/harpreet/Machine_learning') File "/home/harpreet/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 682, in runfile execfile(filename, namespace) File "/home/harpreet/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 78, in execfile builtins.execfile(filename, *where) File "/home/harpreet/Machine_learning/untitled0.py", line 13, in <module> clf.predict(examples) File "/home/harpreet/anaconda/lib/python2.7/site-packages/sklearn/naive_bayes.py", line 62, in predict jll = self._joint_log_likelihood(X) File "/home/harpreet/anaconda/lib/python2.7/site-packages/sklearn/naive_bayes.py", line 441, in _joint_log_likelihood return (safe_sparse_dot(X, self.feature_log_prob_.T) File "/home/harpreet/anaconda/lib/python2.7/site-packages/sklearn/utils/extmath.py", line 180, in safe_sparse_dot return fast_dot(a, b) TypeError: Cannot cast array data from dtype('float64') to dtype('S32') according to the rule 'safe' 

One Solution collect form web for “не может передавать данные массива при вызове сохраненного классификатора”

Вам необходимо преобразовать тестовый документ с тем же экземпляром vectorizer вектора:

 examples_vectors = count_vectorizer.transform(examples) clf.predict(examples_vectors) 

В общем, проще использовать конвейер:

 from sklearn.pipeline import make_pipeline pipeline = make_pipeline(CountVectorizer(), MultinomialNB()) pipeline.fit(data['text'].values, data['class'].values) 

тогда позже:

 pipeline.predict(examples) 
  • Предупреждение о устаревании в загрузчике формата scikit-learn svmlight
  • Как функция sklearn.svm.svc функция pred_proba () работает внутри?
  • Масштабирование цели приводит к тому, что Scikit-learn регрессия SVM разбивается
  • Стратифицированный поезд / тест-раскол в scikit-learn
  • Как рассчитывается оценка scikit-learn cross_val_predict?
  • TFIDF для большого набора данных
  • Объединение пользовательских функций с помощью CountVectorizer
  • scikit .predict () порог по умолчанию
  • Python - лучший язык программирования в мире.