Фрейм данных с прогнозируемыми значениями из классификатора

#python #pandas #scikit-learn

#python #панды #scikit-learn

Вопрос:

Я хотел бы знать, как создать новый фрейм данных pandas с новыми электронными письмами с их прогнозируемым значением. Я использовал следующую модель:

 import string

from nltk.corpus import stopwords
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix, accuracy_score
from sklearn.naive_bayes import MultinomialNB

df = pd.DataFrame(data={'Email': [
"Hi, I am Andrew and I want too buy VIAGRA",
"Dear subscriber, your account will be closed",
"Please click below to verify and access email restore",
"Hi Anne, I miss you so much! Can’t wait to see you",
"Dear Professor Johnson, I was unable to attend class today",
"I am pleased to inform you that you have won our grand prize.",
"I can’t help you with that cuz it’s too hard.",
"I’m sorry to tell you but im sick and will not be able to come to class.",
"Can I see an example before all are shipped or will that cost extra?",
"I appreciate your assistance and look forward to hearing back from you.",], 
'Spam': [1, 1, 1, 0, 0, 1, 0, 0, 0, 0]})

def fun(text):    
    # Removing Punctuations
    remove_punc = [c for c in text if c not in string.punctuation]
    remove_punc = ''.join(remove_punc)

    # Removing StopWords
    cleaned = [w for w in remove_punc.split() if w.lower() not in stopwords.words('english')]

    return cleaned

vectorizer = CountVectorizer(analyzer=fun)
X = vectorizer.fit_transform(df['Email'])

X_train, X_test, y_train, y_test = train_test_split(X, df['Spam'], test_size = 0.25, random_state = 0)
classifier = MultinomialNB()
classifier.fit(X_train, y_train)

pred = classifier.predict(X_test)
  

Дан список новых электронных писем:

 new_email = ["Hi, my name is Christopher", "Buy this movie at a great price!!!", "Should we meet?"]
  

Я хотел бы создать новый фрейм данных, который содержит эти электронные письма и прогнозируемое значение:

 Email                                 Spam
Hi, my name is Christopher             1
Buy this movie at a great price!!!     1
University of London: meeting request  0
  

То, что я сделал для одного электронного письма, было следующим:

 X_new = vectorizer.transform(fun(new_email))

and predicted as follows:
classifier.predict(X_new)
  

Однако мне понадобится фрейм данных, подобный приведенному выше.
Не могли бы вы, пожалуйста, помочь мне в этом?

Ответ №1:

Удаление fun() в вашем X_new назначении устраняет проблему. Вам это не нужно, потому fun что уже было назначено как analyzer в конструкторе вашего vectorizer .

Код

 new_email = [
    "Hi, my name is Christopher", 
    "Buy this movie at a great price!!!",
    "Should we meet?"
]

X_new = vectorizer.transform(new_email)

pred_new = classifier.predict(X_new)

pd.DataFrame(
    data={
        "Email": new_email,
        "Spam": pred_new
    }
)
  

Вывод

                                 Email  Spam
0          Hi, my name is Christopher     0
1  Buy this movie at a great price!!!     0
2                     Should we meet?     0
  

Примечание.1. Прогнозируемый результат спама немного отличается от вашего сообщения (строка 0, 1), но вся процедура должна быть неповрежденной. Замена предложений на ранее обученные выборки показывает, что модель работала правильно. Я не уверен, вызвано ли это врожденной случайностью в процессе обучения.

Комментарии:

1. большое вам спасибо, Билл Хуанг. Действительно оценил вашу помощь