Université de Bordeaux, Master Mention MIAGE¶

Données & Intelligence Artificielle¶

Machine Learning : Classifieurs de Bayes¶

A la main :¶

In [41]:
import pandas as pa

dic = {'S': ['M', 'M', 'M', 'M', 'F', 'F', 'F', 'F'],
      'H': [1.82, 1.80, 1.70, 1.80, 1.52, 1.65, 1.68, 1.75],
      'W': [82, 86, 77, 75, 45, 68, 59, 68],
      'F': [30, 28, 30, 25, 15, 20, 18, 23]}

data = pa.DataFrame(data=dic)
In [42]:
print(data)
   S     H   W   F
0  M  1.82  82  30
1  M  1.80  86  28
2  M  1.70  77  30
3  M  1.80  75  25
4  F  1.52  45  15
5  F  1.65  68  20
6  F  1.68  59  18
7  F  1.75  68  23
In [43]:
data = data.sample(frac=1)
print(data)
   S     H   W   F
2  M  1.70  77  30
0  M  1.82  82  30
5  F  1.65  68  20
7  F  1.75  68  23
1  M  1.80  86  28
4  F  1.52  45  15
3  M  1.80  75  25
6  F  1.68  59  18
In [44]:
X = data[['H', 'W', 'F']]
y = data['S']
In [45]:
#entrainement : il s'agit essentiellement d'inférer les valeurs des m et s de chaque variable
import numpy as np

means = []
sigmas = []


for c in X.columns:
    means.append([np.mean(X[c][y=='M']), np.mean(X[c][y=='F'])])
    sigmas.append([np.sqrt(np.var(X[c][y=='M'])), np.sqrt(np.var(X[c][y=='F']))])
print('means: ', means)
print('sigmas: ', sigmas)


#propbas a priori:
probas = [len(y[y=='M'])/len(y), len(y[y=='F'])/len(y)]
print(probas)
means:  [[1.78, 1.65], [80.0, 60.0], [28.25, 19.0]]
sigmas:  [[0.04690415759823434, 0.08336666000266532], [4.301162633521313, 9.40744386111339], [2.0463381929681126, 2.9154759474226504]]
[0.5, 0.5]
In [46]:
import scipy.stats as st
def predict(item):
    p_m = 1
    p_f = 1
    for i in range(len(means)):
        p_m *= st.norm.pdf(item[i], means[i][0], sigmas[i][0])
        p_f *= st.norm.pdf(item[i], means[i][1], sigmas[i][1])
    if probas[0] * p_m > probas[1] * p_f :
        return 'M'
    return 'F'

print(predict([1.81, 59, 21]))
F

Avec sklearn:¶

In [31]:
from sklearn.naive_bayes import GaussianNB
nb = GaussianNB()
nb.fit(X, y)
Out[31]:
GaussianNB(priors=None, var_smoothing=1e-09)
In [35]:
print(nb.predict([[1.81, 59, 21]])[0])
F
In [ ]: