File size: 5,960 Bytes
4b88786
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42fded5
 
 
 
 
 
 
 
 
4b88786
 
f7993e0
4b88786
 
 
f7993e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4b88786
 
 
 
 
 
 
 
 
 
 
 
 
f7993e0
30c2773
 
 
 
 
 
 
4b88786
 
30c2773
 
4b88786
 
30c2773
 
 
 
 
4b88786
30c2773
 
 
 
 
 
 
 
 
 
 
 
4b88786
30c2773
 
4b88786
 
 
 
 
42fded5
4b88786
 
 
f7993e0
 
 
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import importlib


from st_on_hover_tabs import on_hover_tabs

import streamlit as st

import streamlit_presentation
import streamlit_presentation.analyse
importlib.reload(streamlit_presentation.analyse)
from streamlit_presentation.analyse import repartition_par_categorie
from streamlit_presentation.analyse import repartition_longueur_categorie


import streamlit_presentation.preprocessing
importlib.reload(streamlit_presentation.preprocessing)
from streamlit_presentation.preprocessing import detection_langage_et_traduction

import streamlit_presentation.modele
importlib.reload(streamlit_presentation.modele)
from streamlit_presentation.modele import presentation_modele
from sklearn.metrics import f1_score

plt.rcParams['font.size'] = 12
plt.rcParams['axes.labelsize'] = 10
plt.rcParams['axes.titlesize'] = 12
plt.rcParams['xtick.labelsize'] = 8
plt.rcParams['ytick.labelsize'] = 8
plt.rcParams['legend.fontsize'] = 8
plt.rcParams['lines.linewidth'] = 1

#on charge les donnees utilisees
data = pd.read_csv( 'data.csv')
extract_data = pd.read_csv( 'data_tr_extract.csv')
sum_data = pd.read_csv( 'data_sum_extract.csv')
test_data = pd.read_pickle( 'data_test.pkl')

from keras.models import load_model
import tensorflow as tf
from tensorflow.keras import backend as K
import ast


def f1_weighted(true, pred):  

    # Classes
    classes = K.arange(0, 27) 
    true = K.one_hot(K.cast(true, 'int32'), 27)
    
    # Calcule les TP, FP, FN pour chaque classe
    tp = K.dot(K.transpose(true), K.round(pred))
    fp = K.dot(K.transpose(1-true), K.round(pred))
    fn = K.dot(K.transpose(true), 1-K.round(pred))

    # Calcule le score F1 pour chaque classe
    p = tp / (tp + fp + K.epsilon())
    r = tp / (tp + fn + K.epsilon())
    f1 = 2*p*r / (p+r+K.epsilon())

    
    weighted_f1 = K.sum(f1 * K.sum(true, axis=0) / K.sum(true))
    return weighted_f1

model = load_model("final_model_kfold.h5", custom_objects={'f1_weighted': f1_weighted})





from sklearn.preprocessing import LabelEncoder
encoder =  LabelEncoder()
y_test = encoder.fit_transform(test_data["prdtypecode"])
class_labels = encoder.classes_
label_size = 27



####### Page principale
st.set_page_config(layout="wide",page_title="Rakuten Challenge")
hide_default_format = """
       <style>
       #MainMenu {visibility: hidden; }
       footer {visibility: hidden;}
       </style>
       """
st.markdown(hide_default_format, unsafe_allow_html=True)

st.markdown('<style>' + open('./style.css').read() + '</style>', unsafe_allow_html=True)

st.title("Rakuten Challenge")

with st.sidebar:
    tabs = on_hover_tabs(tabName=['Introduction', "Analyse", "Preprocessing", "Modèle", "Pistes exploratoires"], 
                         iconName=['apps', 'bar_chart', "sync", "memory", "topic"], 
                         styles = {'navtab': {'background-color':'RGB(55,71,79)',
                                                  'color': 'RGB(180,180,180)',
                                                  'font-size': '18px',
                                                  'transition': '.3s',
                                                  'white-space': 'nowrap',
                                                  'text-transform': 'uppercase'},
                                       'tabOptionsStyle': {':hover :hover': {'color': 'RGB(235,197,82)',
                                                                      'cursor': 'pointer'}},
                                       'iconStyle':{'position':'fixed',
                                                    'left':'7.5px',
                                                    'text-align': 'left'},
                                       'tabStyle' : {'list-style-type': 'none',
                                                     'margin-bottom': '30px',
                                                     'padding-left': '30px'}},
                         default_choice=0)

st.markdown("""
<style>
    .rounded-border-parent {
        border-radius: 15px !important;
        border: 1px solid blue !important;
        background-color: lightgray !important;
    }
</style>
""", unsafe_allow_html=True)


if tabs == "Introduction":
    st.write("### Introduction")
    st.write("""
Le catalogue de l’ecommerce Rakuten comporte des centaines de milliers d’articles mis à jour régulièrement. Le besoin de l’entreprise est de les classer automatiquement dans leur catégorie.
 
L’objectif de notre projet est de de prédire le code type d’un produit à partir de données textes décrivant des produits ainsi que leurs images associées.

Notre étude doit déterminer la qualité et la pertinence des données, d’évaluer un prétraitement possible et proposer une solution de classification l’exploitation de ces dernières
""")

elif tabs == "Analyse":
    st.write("### Analyse")
    st.write("Extrait de la base de données fournie par Rakuten:")
    st.dataframe(data.head(30))
    st.write("")
    st.write("### Regard sur les données:")
    st.write("")
    st.write("")
    st.write("Une distribution des observations par code produit non balancée:")
    st.write("")
    repartition_par_categorie(st, data)
    st.write("")
    st.divider()
    st.write("")
    st.write("### Variabilité de la taille des champs textes:")
    st.write("")
    st.text("""
    Pourcentage de valeurs manquantes pour la description : 35.09%
    Pourcentage de valeurs manquantes pour la designation : 0.00%         
             """)
    
    st.write("")
    st.write("")
    repartition_longueur_categorie(st, data)
    st.write("")
    

elif tabs == "Preprocessing":
    detection_langage_et_traduction(st, extract_data, sum_data)

elif tabs == "Modèle":
    presentation_modele(st, test_data, model,class_labels,y_test,encoder)

elif tabs == "Pistes exploratoires":
    st.write("# Pistes exploratoires")
    st.write("Ici")