-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest.py
More file actions
122 lines (109 loc) · 5.3 KB
/
Copy pathtest.py
File metadata and controls
122 lines (109 loc) · 5.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import numpy as np
import pandas as pd
import streamlit as st
import matplotlib.pyplot as plt
import plotly_express as px
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, f1_score, confusion_matrix, recall_score, precision_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score, KFold
url1='https://raw.githubusercontent.com/Tim-IA/test/main/Filtred_spam.csv'
flitred_file=pd.read_csv(url1, encoding='latin-1')
url2='https://raw.githubusercontent.com/Tim-IA/test/main/spam.csv'
orininal_csv=pd.read_csv(url2, encoding='latin-1')
st.set_page_config(page_title='Réglage des hyperparamètres', layout='wide')
genre = st.radio(
"Dites Bonjour",
('Bonjour', 'Quoi'))
if genre =='Bonjour':
st.write('On commence notre projet')
else:
st.write("Vous n'avez pas dit Bonjour.")
st.write('On commence notre projet')
col1, col2 =st.columns(2)
about_expander = col1.expander('à propos',expanded=False)
with about_expander:
st.info("""
Cette application Web n'est qu'une simple démonstration du réglage des hypermètres
avec **GridSearchCV**. Les données spam originales et filtrées par Eric DOMAS sont
importées pour détecter les éventuels spams. Pour faire cette étude, les algorithmes
tels que SVM, KNN, Random Forest sont importés depuis la librairie Scikit learn.
""")
info_expander = col2.expander('Pourquoi régler les hyperparamètres?',expanded=False)
with info_expander:
st.info("""
**Hyperparamètres** décrivent les bases du modèle.
**Réglage des hyperparamètres** nous permet d'avoir une vue optimale de notre modèle
""")
st.title('spam')
st.write("""#Exploration des données""")
data_name=st.sidebar.selectbox("Selectionner les données", ('filtred csv', 'original csv'))
classifier=st.sidebar.selectbox("Selectionner un classifier", ("KNN", "SVM", "Random Forest"))
cv_count = st.sidebar.slider('Compter Cross-validation', 2, 5, 3)
def analyse(data_name):
st.title(data_name)
if data_name=='filtred csv':
df=flitred_file
st.write(df)
else:
df=orininal_csv
df=df.rename(columns={'v1':'type','v2': 'text'})
st.write(df)
plt.figure(figsize=(6,6))
df_count_type = pd.DataFrame(df.type.value_counts()).reset_index().rename(
columns={'index': 'type', 'type': 'count'})
pourcentage = px.pie(df_count_type, names='type', color='type',
values='count', title='Repartition des types de messages')
pie = st.write(pourcentage)
y = df['type'] = df['type'].map({'ham': 0, 'spam': 1})
X = df.drop(columns='type')
return y, X
y, X=analyse(data_name)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=42)
st.write('Shape:', X.shape)
def get_classifier(classifier):
model=None
parameters=None
if classifier=='KNN':
model=KNeighborsClassifier()
pipe = Pipeline(steps=[('scaler', StandardScaler()),('model', model)])
st.sidebar.write("**Nombre de Neighbors**")
K=st.sidebar.slider("", 1, 15)
parameters = {'model__n_neighbors':[K]}
elif classifier == 'SVM':
model=SVC()
pipe = Pipeline(steps=[('scaler', StandardScaler()),('model', model)])
st.sidebar.write("**Type de noyau**")
type_noyau = st.sidebar.multiselect('', options=['linear', 'rbf', 'poly'], default=['linear', 'rbf', 'poly'])
st.sidebar.write('**Réglage des paramétres C**')
C = st.sidebar.slider('', 1, 10)
parameters = {'model__C':[C], 'model__kernel':type_noyau}
else:
model = RandomForestClassifier()
pipe = Pipeline(steps=[('scaler', StandardScaler()),('model', model)])
st.sidebar.write('**Nombre des arbres**')
n = st.sidebar.slider('', 1, 220, 20)
st.sidebar.write('La profondeur maximale arbre')
md = st.sidebar.slider('', 2, 15, 1)
parameters = {'model__n_estimators':range(n),
'model__max_depth':range(md)}
grid = GridSearchCV(pipe, parameters, cv = cv_count, return_train_score=False)
grid.fit(X_train, y_train)
y_pred = grid.predict(X_test)
st.subheader('**Mean test score et Metriques**')
st.write('Best Score:', round(grid.best_score_, 2))
st.write("Coefficient de determination :", round(r2_score(y_test, y_pred), 3))
st.write('Precision:', round(precision_score(y_test, y_pred), 3))
st.write('Rappel:', round(recall_score(y_test, y_pred), 3))
#cm = confusion_matrix(y_test, y_pred, labels=grid.classes_)
#st.write("Matrice de confusion", ConfusionMatrixDisplay(confusion_matrix=cm,
#display_labels=['ham', 'spam']))
st.write("Matrice de confusion", confusion_matrix(y_test, y_pred))
st.write('f1_score', round(f1_score(y_test, y_pred), 3))
return model, parameters
model, parameters = get_classifier(classifier)