Использование полиномиального байесовского классификатора - PullRequest
2 голосов
/ 10 марта 2020

Я новичок в python и scikit, поэтому, пожалуйста, потерпите меня, если это глупый вопрос. Я следовал некоторым учебникам, чтобы сделать многочленный наивный байесовский классификатор, используя sklearn, и я обучил и протестировал его с приличной точностью. Однако я подошел к концу учебников и понял, что на самом деле не знаю, как подать новые данные для их классификации. Вот мой код:

import sklearn as skl;
import pandas as pd;
from sklearn.metrics import accuracy_score, precision_score, recall_score;
from sklearn.model_selection import train_test_split;
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB;
from sklearn.metrics import confusion_matrix;
import matplotlib.pyplot as plt;
import seaborn as sns;
import numpy as np;

def print_top10(vectorizer, clf):
    feature_names = vectorizer.get_feature_names()
    class_labels = clf.classes_
    for i, class_label in enumerate(class_labels):
        top10 = np.argsort(clf.coef_[0])[-10:]
        print("%s: %s" % (class_label,
              " ".join(feature_names[j] for j in top10)))

df = pd.read_excel(r'C:\Users\Nicholas\vegas700.xlsx');

#edit:
df2 = pd.read_excel(r'C:\Users\Nicholas\vegasunlabeled.xlsx');

X_train, X_test, y_train, y_test = train_test_split(df['text'], df['label'], random_state=11, test_size=0.25);

#edit:
finalx_train, finalx_test, finaly_train, finaly_test = train_test_split(df['text'], df['label'], random_state=1, test_size=0.99)

cv = CountVectorizer(strip_accents='ascii', token_pattern=u'(?ui)\\b\\w*[a-z]+\\w*\\b', lowercase=True, stop_words='english');

X_train_cv = cv.fit_transform(X_train.values.astype('U'));
X_test_cv = cv.transform(X_test.values.astype('U'));
#edit:
finalx_cv = cv.transform(finalx_test.values.astype('U'));

print("training...");
mnb = MultinomialNB();
mnb.fit(X_train_cv, y_train);
#edit:
new_predictions = mnb.predict_log_proba(finalx_cv)
print(new_predictions)

Как мне использовать / дать моему классификатору новый набор данных, и как я могу получить его, чтобы дать мне процентное отображение каждого класса в этом новом наборе?

Редактировать: vegas700.xlsx имеет три столбца: по порядку слева направо они называются 'id', 'text' и 'label'. id это просто номер элемента, text это текст, а label это класс, 0 или 1.

После добавления новых строк кода я получаю результат:

[[-8.24928263e+00 -2.61480227e-04]
 [-4.33474053e+00 -1.31919059e-02]
 [-3.81104731e+00 -2.23734239e-02]
 ...
 [-1.62156753e-04 -8.72702816e+00]
 [-3.35454988e+00 -3.55495505e-02]
 [-1.16414198e-01 -2.20824326e+00]]

Понятия не имею, что это значит, и понятия не имею, правильно ли это.

1 Ответ

0 голосов
/ 13 марта 2020

Ваша проблема использует предикат_log_proba вместо предиката. То, что вы видите, - это журнал вероятности того, что каждая выборка равна 0 или 1, что полезно, если вы хотите увидеть, насколько «уверена» ваша модель для каждой метки. Если вы хотите видеть только сами ярлыки, используйте предикат. Подробнее здесь .

Редактировать: Поскольку это простая проблема двух классов, вам просто нужно сложить прогнозируемые результаты и разделить на форму для процента выборок, помеченных 1:

preds = mnb.predict(x)
print(100*preds.sum()/len(preds))

Еще одно предложение для расширения до новых наборов данных я хотел бы изучить функцию pipe в sklearn. Таким образом, вы можете создать конвейер, который включает любые преобразования и быстро go из файла в новый набор данных для прогнозирования. Кроме того, вам не нужно разделять тест на поезда для новых данных.

...