import numpy as np
import matplotlib.pyplot as plt
# from IPython.display import set_matplotlib_formats
# set_matplotlib_formats('svg')
import pandas as pd
penguins = pd.read_csv(r"\\serveur01\HOSPITF\Travail\Téléchargements\data/penguins.csv")

print(penguins)

#%% prelim
# Utilisation de SVG pour faire des figures plus nettes
# from IPython.display import set_matplotlib_formats
# set_matplotlib_formats('svg')
fig = plt.figure(figsize=(15, 5))

# Figure 1 dans une grille (1 x 3)
ax = plt.subplot(1, 3, 1)
ax.scatter(penguins["bill_length_mm"], penguins["body_mass_g"])
plt.xlabel("Longueur du bec (mm)")
plt.ylabel("Poids (g)")

# Figure 2 dans une grille (1 x 3)
ax = plt.subplot(1, 3, 2)
ax.scatter(penguins["bill_depth_mm"], penguins["body_mass_g"])
plt.xlabel("Hauteur du bec (mm)")
plt.ylabel("Poids (g)")

# Figure 3 dans une grille (1 x 3)
ax = plt.subplot(1, 3, 3)
ax.scatter(penguins["flipper_length_mm"], penguins["body_mass_g"])
plt.xlabel("Longueur de la palette natatoire (mm)")
plt.ylabel("Poids (g)")

X = np.array(penguins[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]])
y_regress =np.array( penguins["body_mass_g"])

plt.show()
#%%

fig = plt.figure(figsize=(15, 5))

# Figure 1 dans une grille (1 x 3)
ax = plt.subplot(1, 3, 1)
for penguin_sex in ["male", "female"]:
    ax.scatter(penguins.loc[penguins["sex"] == penguin_sex]["bill_length_mm"],
               penguins.loc[penguins["sex"] == penguin_sex]["bill_depth_mm"],
               label=penguin_sex)
plt.xlabel("Longueur du bec (mm)")
plt.ylabel("Hauteur du bec (mm)")

# Figure 2 dans une grille (1 x 3)
ax = plt.subplot(1, 3, 2)
for penguin_sex in ["male", "female"]:
    ax.scatter(penguins.loc[penguins["sex"] == penguin_sex]["bill_length_mm"],
               penguins.loc[penguins["sex"] == penguin_sex]["flipper_length_mm"],
               label=penguin_sex)
plt.xlabel("Longueur du bec (mm)")
plt.ylabel("Longueur de la palette natatoire (mm)")

# Figure 3 dans une grille (1 x 3)
ax = plt.subplot(1, 3, 3)
for penguin_sex in ["male", "female"]:
    ax.scatter(penguins.loc[penguins["sex"] == penguin_sex]["bill_depth_mm"],
               penguins.loc[penguins["sex"] == penguin_sex]["flipper_length_mm"],
               label=penguin_sex)
plt.xlabel("Hauteur du bec (mm)")
plt.ylabel("Longueur de la palette natatoire (mm)")

plt.legend()
plt.show()

#%%
y_classif = pd.Categorical(penguins["sex"]).codes
print(y_classif.shape)
print(y_classif)

#%%regression linéaire
n_samples, n_features = X.shape
print("Nous avons n=%d observations et p=%d variables." % (n_samples, n_features))

from sklearn import linear_model
linreg = linear_model.LinearRegression()
linreg.fit(X, y_regress)
print("Le poids (g) d'un manchot est prédit par %.2f " % linreg.intercept_, end='')
print("+ %.2f x bill_length_mm + %.2f x bill_depth_mm + %.2f x flipper_length_mm" % (tuple(linreg.coef_)))

y_pred = linreg.predict(X)

plt.scatter(y_regress, y_pred)

plt.xlabel("Poids réel (g)")
plt.ylabel("Poids prédit (g)")
plt.show()

from sklearn import metrics
print("La RMSE de notre modèle est %.2f g" % (metrics.mean_squared_error(y_regress, y_pred, squared=False)))
print("Le coefficient de détermination de notre modèle est R2 = %.2f" % (metrics.r2_score(y_regress, y_pred)))

from sklearn import model_selection
(X_train, X_test, y_train, y_test) = model_selection.train_test_split(X, y_regress, test_size=0.3, random_state=25)
print(y_test)
X_train.shape, y_train.shape, X_test.shape, y_test.shape
print("Le jeu d'entraînement contient %d observations et le jeu de test %d observations." % (X_train.shape[0], X_test.shape[0]))

linreg.fit(X_train, y_train)
y_test_pred = linreg.predict(X_test)
plt.scatter(y_test, y_test_pred)

plt.xlabel("Poids réel (g)")
plt.ylabel("Poids prédit (g)")

plt.title("Prédictions de la régression linéaire sur le jeu de test")
plt.show()

print("La RMSE de notre modèle est %.2f g" % (metrics.mean_squared_error(y_test, y_test_pred, squared=False)))

print("Le coefficient de détermination de notre modèle est R2 = %.2f" % (metrics.r2_score(y_test, y_test_pred)))

#%%regression logistique
y_classif = pd.Categorical(penguins["sex"]).codes

logreg = linear_model.LogisticRegression(penalty="l2",tol=0.01, solver="saga")

logreg.fit(X_train, y_train)
print("La probabilité qu'un manchot soit mâle est prédite par sigma (%.2f " % logreg.intercept_[0], end='')
print("+ %.2f x bill_length_mm + %.2f x bill_depth_mm + %.2f x flipper_length_mm)" % (tuple(logreg.coef_[0])))

y_test_pred = logreg.predict(X_test)

cm=metrics.confusion_matrix(y_test, y_test_pred)
print("%d manchots mâles ont été incorrectement prédits femelle." % cm[1, 0])
print("%d manchots femelles ont été incorrectement prédits mâles." % cm[0, 1])

print("%.f%% des prédictions du modèle sur le jeu de test sont correctes." % (100*metrics.accuracy_score(y_test, y_test_pred)))


disp=metrics.ConfusionMatrixDisplay(metrics.confusion_matrix(y_test, y_test_pred))
disp.plot()
plt.show()

#%% KNN
from sklearn import model_selection
(X_train, X_test, y_train, y_test) = model_selection.train_test_split(X, y_regress, test_size=0.3, random_state=25)

from sklearn import neighbors
knnreg = neighbors.KNeighborsRegressor(n_neighbors=7)
knnreg.fit(X_train, y_train)
y_test_pred = knnreg.predict(X_test)
plt.scatter(y_test, y_test_pred)
plt.plot(y_test,y_test,'r')

plt.xlabel("Poids réel (g)")
plt.ylabel("Poids prédit (g)")

plt.show()

from sklearn import metrics
print("La RMSE de notre modèle est %.2f g" % (metrics.mean_squared_error(y_test, y_test_pred, squared=False)))
print("Le coefficient de détermination de notre modèle est R2 = %.2f" % (metrics.r2_score(y_test, y_test_pred)))

##
(X_train, X_test, y_train, y_test) = model_selection.train_test_split(X, y_classif, test_size=0.3, random_state=25, stratify=y_classif)

knnclass = neighbors.KNeighborsClassifier(n_neighbors=7)
knnclass.fit(X_train, y_train)
y_test_pred = knnclass.predict(X_test)


print("%d manchots mâles ont été incorrectement prédits femelle." % metrics.confusion_matrix(y_test, y_test_pred)[1, 0])
print("%d manchots femelles ont été incorrectement prédits mâles." % metrics.confusion_matrix(y_test, y_test_pred)[0, 1])
print("%.f%% des prédictions du modèle sur le jeu de test sont correctes." % (100*metrics.accuracy_score(y_test, y_test_pred)))

disp=metrics.ConfusionMatrixDisplay(metrics.confusion_matrix(y_test, y_test_pred))
disp.plot()
plt.show()