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

#python #pandas #scikit-learn #naivebayes #multinomial

#python #панды #scikit-learn #наивный ответ #многочленный

Вопрос:

Я использую naive bayes для прогнозирования названия страны по набору адресов, я попробовал это

 import re
import numpy as np
import pandas as pd
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
def normalize_text(s):
    s = s.lower()
    s = re.sub('sW',' ',s)
    s = re.sub('Ws',' ',s)
    s = re.sub('s ',' ',s)
    return(s)
df['TEXT'] = [normalize_text(s) for s in df['Full_Address']]

# pull the data into vectors
vectorizer = CountVectorizer()
x = vectorizer.fit_transform(df['TEXT'])

encoder = LabelEncoder()
y = encoder.fit_transform(df['CountryName'])

# split into train and test sets
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

nb = MultinomialNB()
nb.fit(x_train, y_train)
y_predicted = nb.predict(x_test)
 

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

Обновить:

 df['Predicted'] = nb.predict(x)

         CountryName                                       Full_Address  
8913       Indonesia  EJIP Industrial Park Plot 1E-2, Sukaresmi, Cik...   
7870   United States    360 Thelma Street, Sandusky, Michigan 48471 USA   
32037          China  1027, 26/F, Zhao Feng Mansion, Chang Ning Road...   
38769    New Zealand  NZ - 164 ST. ASAPH STREET, tCHRISTCHURCH 8011...   
46639          India  301-306, Sahajanand Trade Center, Opp. Kothawa...   

                                                    TEXT  Predicted  
8913   ejip industrial park plot 1e-2 sukaresmi cikar...         66  
7870       360 thelma street sandusky michigan 48471 usa        169  
32037  1027 26/f zhao feng mansion chang ning road sh...         30  
38769  nz 164 st asaph street christchurch 8011 new z...        112  
46639  301-306 sahajanand trade center opp kothawala ...         65
 

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

1. Может быть, я что-то упускаю, но я думаю, что в основном это должно быть df['Predicted'] = nb.predict(x)

2. он показывает столбец целых чисел вместо названий стран, я уверен, что каждое целое число указывает на название страны, но как я могу получить названия стран на самом деле? @piterbarg

Ответ №1:

Вы должны использовать обратное значение encoder.fit_transform для прогнозируемых значений y , примененных к выходным данным модели. Итак, что-то вроде

 df['Predicted'] = encoder.inverse_transform(nb.predict(x))
 

Это предполагает, что nb.predict(x) вывод представляет собой список целых чисел (а не список списков) — возможно, вам придется внести некоторые изменения, если это не так. Поскольку я не могу запустить ваш код без доступа к df , я не могу сказать