Невозможно использовать Pandas и NLTK для обучения наивного байесовского (машинного обучения) на Python
Вот что я пытаюсь сделать. У меня есть CSV. файл с колонкой 1 с именами людей (то есть: "Майкл Джордан", "Андерсон Сильва", "Мухаммед Али") и колонка 2 с этнической принадлежностью людей (то есть: английский, французский, китайский).
В своем коде я создаю фрейм данных Pandas, используя все данные. Затем создайте дополнительные фреймы данных: один только с китайскими именами, а другой только с некитайскими. А потом я создаю отдельные списки.
Функция three_split извлекает особенность каждого имени, разбивая их на трехсимвольные подстроки. Например, "Кэти Перри" в "кат", "Аты", "ты", "yp"... и т. Д.
Затем я тренируюсь с Наивным Байесом и наконец проверяю результаты.
Нет ошибок при запуске моих кодов, но когда я пытаюсь использовать некитайские имена непосредственно из базы данных и ожидаю, что программа вернет False (не китайский), она возвращает True (китайский) для любого проверяемого имени. Любая идея?
import pandas as pd
from pandas import DataFrame, Series
import numpy as np
import nltk
from nltk.classify import NaiveBayesClassifier as nbc
from nltk.classify import PositiveNaiveBayesClassifier
# Get csv file into data frame
data = pd.read_csv("C:\Users\KubiK\Dropbox\Python exercises_KW\_Scraping\BeautifulSoup\FamilySearch.org\FamSearch_Analysis\OddNames_sampleData3.csv",
encoding="utf-8")
df = DataFrame(data)
df.columns = ["name", "ethnicity"]
# Recategorize different ethnicities into 1) Chinese or 2) non-Chinese; and then create separate lists
df_chinese = df[(df["ethnicity"] == "chinese") | (df["ethnicity"] == "Chinese")]
chinese_names = list(df_chinese["name"])
df_nonchinese = df[(df["ethnicity"] != "chinese") & (df["ethnicity"] != "Chinese") & (df["ethnicity"].notnull() == True)]
nonchinese_names = list(df_nonchinese["name"])
# Function to split word string into three-character substrings
def three_split(word):
word = str(word).lower().replace(" ", "_")
split = 3
return dict(("contains(%s)" % word[start:start+split], True)
for start in range(0, len(word)-2))
# Training naive bayes machine learning algorithm
positive_featuresets = list(map(three_split, chinese_names))
unlabeled_featuresets = list(map(three_split, nonchinese_names))
classifier = PositiveNaiveBayesClassifier.train(positive_featuresets, unlabeled_featuresets)
# Testing results
name = "Hubert Gillies" # A non-Chinese name from the dataset
print classifier.classify(three_split(name))
>>> True # Wrong output
1 ответ
Там может быть много проблем, когда речь идет о том, почему вы не получаете желаемых результатов, чаще всего это либо:
- Особенности не достаточно сильны
- Недостаточно данных о тренировках
- Неправильный классификатор
- Ошибки кода в классификаторах NLTK
По первым трем причинам нет возможности проверить / разрешить, если вы не опубликуете ссылку на свой набор данных, а мы посмотрим, как это исправить. Что касается последней причины, не должно быть одного для основных NaiveBayes
а также PositiveNaiveBayes
классификатор.
Итак, вопрос, который нужно задать:
- Сколько экземпляров обучающих данных (т.е. строк) у вас есть?
- Почему вы не нормализовали свои метки (т.е. китайский | китайский -> китайский) после того, как прочитали набор данных перед тем, как извлечь функции?
- Какие еще особенности следует учитывать?
- Рассматривали ли вы использование NaiveBayes вместо PositiveNaiveBayes?