В вашем примерном фрейме данных вы можете просто опустить отображение Harms на части int, которые будут автоматически обрабатываться оценщиками Scikit (MultinomialNB в вашем случае).
Что вы можете сделать так:
d={'Reported Harms':['Fell','Constipation','Surgical Delay'],
'Complaint Description':['Patient Fell on face','Could not use bathroom','Medical rep was late']}
df=pd.DataFrame(data=d)
# Convert the text features to numerical
corpus=df["Complaint Description"]
vectorizer=CountVectorizer(min_df=1)
X = vectorizer.fit_transform(corpus).toarray()
# No need to do anything to target classes
results = df["Reported Harms"]
# Now continue with your code
clf=MultinomialNB()
# You can directly do this (or continue with train_test_split as you originally had)
clf.fit(X, results)
А теперь для прогнозов, когда вы делаете clf.predict()
, исходные тексты будут возвращаться автоматически.
d={'Reported Harms':['Surgical Delay', 'Constipation', 'Fell'],
'Complaint Description':['Ambulance arrived late', 'Having problems passing urine in bathroom', 'Fell on road',]}
dff = pd.DataFrame(data=d)
vec_text=vectorizer.transform(dff["Complaint Description"]).toarray()
ids=dff["Complaint Description"]
predictions = clf.predict(vec_text)
print(predictions)
# Output:
array(['Surgical Delay',
'Constipation',
'Fell'], dtype='|S14')
, которые вы можете напрямую назначить кадру данных без какого-либо сопоставления или обратного сопоставления.
dff['prediction'] = predictions
Хитрость в том, что оценщики Scikit автоматически преобразуют предоставленные текстовые цели в числовые, используя внутренний кодировщик LabelEncoder, как предложено @MaxU в его ответе, поэтому вам не нужно делать это явно.
Надеюсь, это прояснит.