РЪКОВОДИТЕЛ НА НАИВНИЯ БЕЙС

Как да внедрим Naive Bayes?

Раздел 2: Изграждане на модела в Python

Справка Какво е Naive Bayes? Раздел 1: Дефиниране на модела, преди да продължите...

[1] Импортиране на библиотеки

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
  • NumPy е библиотека на Python, използвана за работа с масиви.
  • Matplotlib е библиотека на Python, използвана за създаване на статични, анимирани и интерактивни визуализации.
  • Pandas е библиотека на Python, използвана за осигуряване на бързи, гъвкави и изразителни структури от данни.

Защо тази стъпка: Библиотеките на Python са набор от полезни функции, които елиминират необходимостта от писане на кодове от нулата, особено при разработване на машинно обучение, задълбочено обучение, наука за данни, приложения за визуализация на данни и други!

[2] Четене и съхраняване на данни

df = pd.read_csv('Mammographic_Data_Cleaned.csv')
df.info()
...
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 831 entries, 0 to 830
Data columns (total 5 columns):
AGE         831 non-null float64
SHAPE       831 non-null int64
MARGIN      831 non-null int64
DENSITY     831 non-null int64
SEVERITY    831 non-null int64
dtypes: float64(1), int64(4)
memory usage: 32.6 KB

Забележка: Използваният тук набор от данни е предварително обработен и почистен. За да следвате стъпките, вижте Кода на GitHub.

Забележете как SHAPE, MARGIN и DENSITY са int64 типове данни. Тъй като тези функции са номинални, те трябва да бъдат преобразувани в object типове данни. Ако типовете данни за вашия набор от данни са правилни, тогава тази стъпка може да се пропусне или да се направи справка със следния код:

for data in [df]:
# Convert Data Type for SHAPE
    data['SHAPE'] = data['SHAPE'].astype(str)
# Convert Data Type for MARGIN
    data['MARGIN'] = data['MARGIN'].astype(str)
# Convert Data Type for DENSITY
    data['DENSITY'] = data['DENSITY'].astype(str)

Защо тази стъпка: За да се използват данните и да се извършват манипулации с тях, данните трябва да се четат и съхраняват в еднаква структура. Pandas се използва за четене на .csv файла и за съхраняване на данните във формат на рамка с данни, наречен df.

[3] Разделени данни (независими променливи [X] и зависима променлива [y])

dependentVar = 'SEVERITY'
X = df.loc[:, df.columns != dependentVar]
y = df[dependentVar].values
print("Number of observations and dimensions in 'X':", X.shape)
print("Number of observations in 'y':", y.shape)
...
Number of observations and dimensions in 'X': (831, 4)
Number of observations in 'y': (831,)

Защо тази стъпка: Целта е да се използват независимите променливи (или характеристики) за прогнозиране на зависимата променлива (или резултат). Следователно тези променливи трябва да бъдат разделени на X и y, където X представлява всички характеристики, въведени в модела, а y представлява крайния резултат от модела.

[4] Кодиране на независими променливи [X]

X = pd.get_dummies(X)
print("Number of observations and dimensions in 'X':", X.shape)
print("Number of observations in 'y':", y.shape)
...
Number of observations and dimensions in 'X': (831, 14)
Number of observations in 'y': (831,)

Забележка: Забележете как характеристиките на X.shape са се увеличили от 4 на 14. Това означава, че към модела са добавени още 10 функции. За да разберете добавените функции, направете справка със следния код:

features = X.columns.tolist()
print(features)
...
['AGE', 'SHAPE_1', 'SHAPE_2', 'SHAPE_3', 'SHAPE_4', 'MARGIN_1', 'MARGIN_2', 'MARGIN_3', 'MARGIN_4', 'MARGIN_5', 'DENSITY_1', 'DENSITY_2', 'DENSITY_3', 'DENSITY_4']

Забележка: Забележете как например функцията SHAPE е разделена на четири нови функции: SHAPE_1, SHAPE_2, SHAPE_3 и SHAPE_4.

SHAPE_1 е представен като [1, 0, 0, 0]

SHAPE_2 е представен като [0, 1, 0, 0]

SHAPE_3 е представен като [0, 0, 1, 0]

SHAPE_4 е представен като [0, 0, 0, 1]

  • Едно горещо кодиране: Всеки етикет е картографиран към двоичен вектор.

Защо тази стъпка: Алгоритмите за машинно обучение изискват входните и изходните променливи да бъдат представени като числа. Тъй като този набор от данни включва категорични характеристики, те трябва да бъдат кодирани в числа, преди да могат да бъдат използвани за напасване и оценка на модел.

[5] Мащабиране на функции

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit_transform(X)
print(X)
...
[[ 0.76580356 -0.54443719 -0.52583048 ... -0.2688086   0.31497039
  -0.09859277]
 [ 0.15166622 -0.54443719 -0.52583048 ... -0.2688086   0.31497039
  -0.09859277]
 [-1.89545824  1.83675916 -0.52583048 ... -0.2688086   0.31497039
  -0.09859277]
 ...
 [ 0.56109111 -0.54443719 -0.52583048 ... -0.2688086   0.31497039
  -0.09859277]
 [ 0.69756608 -0.54443719 -0.52583048 ... -0.2688086   0.31497039
  -0.09859277]
 [ 0.42461615 -0.54443719 -0.52583048 ... -0.2688086   0.31497039
  -0.09859277]]

Защо тази стъпка: Някои алгоритми за машинно обучение изчисляват разстоянието между две точки, като използват евклидовото разстояние. Ако една от характеристиките има широк диапазон от стойности, разстоянието ще бъде доминирано от тази характеристика. Стандартизацията и нормализацията са техники, които се използват в диапазона от независими променливи, за да позволят на всяка характеристика да допринесе пропорционално за крайното разстояние.

[6] Разделени данни (обучение и тест)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 32)
print("Number of observations and dimensions in training set:", X_train.shape)
print("Number of observations and dimensions in test set:", X_test.shape)
print("Number of observations in training set:", y_train.shape)
print("Number of observations in test set:", y_test.shape)
...
Number of observations and dimensions in training set: (623, 14)
Number of observations and dimensions in test set: (208, 14)
Number of observations in training set: (623,)
Number of observations in test set: (208,)
  • Тренировъчен комплект се използва за обучение или напасване на модела.
  • Тестов набор се използва за получаване на безпристрастна оценка на крайния модел.

Защо тази стъпка: За да оцените прогнозната ефективност на модела, е важно да имате безпристрастна оценка. Това може да се постигне чрез разделяне на набора от данни, преди да се използва. Данните се разделят произволно на набор за обучение и набор за тестване, където 75% от данните се държат настрана за данните за обучение, а останалите 25% от данните се държат настрана за данните за тестване.

[7] Изградете модел върху данни за обучение

from sklearn.naive_bayes import GaussianNB
nbModel = GaussianNB()
nbModel.fit(X_train, y_train)
...
GaussianNB(priors=None, var_smoothing=1e-09)

Защо тази стъпка: За да обучите модела на данни за обучение, така че да може точно да предвиди резултата.

[8] Прогнозиране на данни от тестване

y_pred = nbModel.predict(X_test)
print(y_pred)
...
[0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0]

Защо тази стъпка: За да получите прогноза на модела върху данните от тестване, за да оцените точността и ефективността на модела.

[9] Числен анализ

from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_pred), ": is the confusion matrix")
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred), ": is the accuracy score")
from sklearn.metrics import precision_score
print(precision_score(y_test, y_pred), ": is the precision score")
from sklearn.metrics import recall_score
print(recall_score(y_test, y_pred), ": is the recall score")
from sklearn.metrics import f1_score
print(f1_score(y_test, y_pred), ": is the f1 score")
...
[[83 25]
 [25 75]] : is the confusion matrix 

0.7596153846153846 : is the accuracy score
0.75 : is the precision score
0.75 : is the recall score
0.75 : is the f1 score

Забележка: С помощта на матрицата на объркването могат да бъдат извлечени стойностите True Positive, False Positive, False Negative и True Negative, което ще помогне при изчисляването на резултата за точност, резултата за прецизност, резултата за припомняне и резултата f1:

  • Истински положителен = 83
  • Грешно положителен резултат = 25
  • Грешно отрицателно = 25
  • Истински отрицателен = 75

Защо тази стъпка: За да оцените ефективността на класификационен модел.



Следва — Как да подобрим Naive Bayes? Раздел 3: Настройка на модела в Python