Последние две недели я изучал и вел блог о теореме Байеса и наивных байесовских классификаторах. На этой неделе я проверил знания и построил классификатор, который пытается предсказать континент, на котором находится страна, на основе числовых данных из The Word Factbook.

Наивные байесовские классификаторы работают, присваивая вероятность наблюдению с учетом априорной вероятности того, что это наблюдение произойдет. Сначала вы сегментируете данные по целевой переменной y, чтобы вычислить среднее значение и стандартное отклонение каждого подмножества данных для каждой функции x. Затем вы используете эту статистику для расчета распределения вероятностей данных в каждой группе или вашего правдоподобия. Затем вы вычисляете частоту появления каждой целевой переменной y или априорную вероятность для каждого класса. Наконец, вы можете предсказать неизвестные переменные, умножив их вероятность на вероятность класса.

В python вы можете рассчитать каждый шаг с помощью основных пользовательских функций NumPy. Я сделал это на простом примере, однако это становится более сложным, когда у вас есть множество наблюдений и более двух классов. Вы также можете использовать Scikit-learn, который, к счастью, встроен в наивные байесовские методы.

Данные

Данные по странам взяты из набора данных Fernando Lasso's kaggle. Он содержит данные о странах и территориях, взятые из The World Factbook за период с 1970 по 2017 год. В нем 277 записей, каждая из которых содержит 20 столбцов данных, включая название. Первые пять рядов показаны ниже:

Первым шагом в этом процессе является очистка данных. Возможно, вы заметили, что десятичная дробь в этом наборе данных представлена ​​символом запятой, что широко распространено за пределами США. Pandas будет считать, что эти значения являются строками, а не числами с плавающей запятой. Вам нужно будет заменить каждое значение запятой десятичной точкой, прежде чем преобразовывать эти значения в числа с плавающей запятой. Это можно сделать за один раз с помощью команды countries_edited['column_name'] = countries['column_name'].str.replace( ',' , '.' ).astype(float) (есть много способов сделать это, вот один пример).

Другие задачи по очистке могут заключаться в уточнении целевой переменной, которой в моем случае является столбец Регион. Например, я агрегирую каждый регион по континентам, потому что данных недостаточно и имеется большой дисбаланс классов в данных. Вы также можете сделать это с помощью .replace метода pandas.

Закончив с этим шагом, я удалил 19 записей, в которых значения NaN присутствовали в многочисленных строках. Некоторые из этих групп были заморскими территориями или территориями, данные по которым непрозрачны. Остальные подсчеты целевой переменной выглядят так:

Построение классификатора

Чтобы подготовить фрейм данных для классификатора Naive Baye от Scikit-learn, вы должны разделить данные на два, где один фрейм данных Y содержит целевой столбец, а другой фрейм данных X содержит все функций. Затем вам нужно преобразовать значения фрейма данных Y в числовые идентификаторы с помощью метода LabelEncoder() (необходимо использовать fit_transform() с фреймом данных Y). Есть шесть континентов со странами на них, поэтому числа будут целыми числами от 0 до 5. Затем вам нужно создать поезд и тестовый набор данных для классификатора, используя метод .train_test_split().

Поскольку каждая функция имеет разный масштаб, средние значения и стандартные отклонения не будут сопоставимы. Население, например, имеет гораздо больший масштаб, чем уровень грамотности. Чтобы сделать каждую функцию сопоставимой по величине, необходимо использовать средство масштабирования. Фрейм данных функций X необходимо преобразовать с помощью масштабатора, например метода StandardScaler().

Scikit-learn имеет удобный GaussianNB() классификатор, который можно использовать для подбора обучающих данных. В наивных байесовских классификаторах вычисленная вероятность или вероятность того, что наблюдение принадлежит классу, может быть представлена ​​как процент наблюдений, принадлежащих этому классу. Как только вы подходите к классификатору, вы можете вызвать атрибут .class_prior_, чтобы просмотреть вероятность каждого класса.

Наконец, мы готовы использовать классификатор. Вы можете вызвать метод classifier.predict() в кадре обучающих данных X. Scikit-learn также предлагает несколько показателей классификации, например точность. Теперь вы можете оценить классификатор с помощью метода accuracy_score(test, prediction). Код указан ниже и в моем профиле GitHub здесь.

Оценка точности моего классификатора составила всего 0,66, а это означает, что одних экономических и демографических данных недостаточно, чтобы делать надежные прогнозы с теми ограниченными данными, которые у меня были.

Заключение

Хотя мой наивный байесовский классификатор не работал хорошо, он научил меня принципам этой мощной модели категоризации. Scikit-learn содержит инструменты для упрощения реализации и оценки этих моделей. Эту модель можно использовать для более сложных тем, таких как НЛП, к чему стремились последние три блога.