Diamonds - Encoding




1. 1. Analyse du dataset pour l'encodage


Analyse du Dataset
df = sns.load_dataset('diamonds')
df.head()
   carat      cut color clarity  depth  table  price     x     y     z
0   0.23    Ideal     E     SI2   61.5   55.0    326  3.95  3.98  2.43
1   0.21  Premium     E     SI1   59.8   61.0    326  3.89  3.84  2.31
2   0.23     Good     E     VS1   56.9   65.0    327  4.05  4.07  2.31
3   0.29  Premium     I     VS2   62.4   58.0    334  4.20  4.23  2.63
4   0.31     Good     J     SI2   63.3   58.0    335  4.34  4.35  2.75
3 colonnes ne sont pas numériques et ont une hiérachie :
- 'cut' : Qualité de la découpe du diamand
- 'color' : Qualité de la couleur du diamand
- 'clarity' : Qualité de la transparence du diamand

Liste des valeurs de la colonne 'cut'
df['cut'].unique()
['Ideal', 'Premium', 'Good', 'Very Good', 'Fair']
Categories (5, object): ['Ideal', 'Premium', 'Very Good', 'Good', 'Fair']

Liste des valeurs de la colonne 'color'
df['color'].unique()
['E', 'I', 'J', 'H', 'F', 'G', 'D']
Categories (7, object): ['D', 'E', 'F', 'G', 'H', 'I', 'J']

Liste des valeurs de la colonne 'clarity'
df['clarity'].unique()
['SI2', 'SI1', 'VS1', 'VS2', 'VVS2', 'VVS1', 'I1', 'IF']
Categories (8, object): ['IF', 'VVS1', 'VVS2', 'VS1', 'VS2', 'SI1', 'SI2', 'I1']



2. 2. Encodage (ordinal)


Ordinal Encoder
from sklearn.preprocessing import OrdinalEncoder

cut_order = ['Very Bad', 'Bad', 'Fair', 'Good', 'Very Good', 'Premium', 'Ideal']
color_order = ['J', 'I', 'H', 'G', 'F', 'E', 'D']
clarity_order = ['I1', 'SI2', 'SI1', 'VS2', 'VS1', 'VVS2', 'VVS1', 'IF']

encoder = OrdinalEncoder(
categories = [cut_order, color_order, clarity_order],
handle_unknown = 'use_encoded_value',
unknown_value = -1
)
encoder.fit_transform(df[['cut', 'color', 'clarity']])
       cut  color  clarity
0      4.0    5.0      1.0
1      3.0    5.0      2.0
2      1.0    5.0      4.0
3      3.0    1.0      3.0
4      1.0    0.0      1.0
...    ...    ...      ...
53935  4.0    6.0      2.0
53936  1.0    6.0      2.0
53937  2.0    6.0      2.0
53938  3.0    2.0      1.0
53939  4.0    6.0      1.0

[53940 rows x 3 columns]

Si de nouvelles données...
encoder.transform([['Fair', 'G', 'A+']])
   cut  color  clarity
0  0.0    3.0     -1.0
Remarque
Il est intéressant d'ajouter des catégories qui n'existent pas encore dans le dataset. Par exemple 'Bad' et 'Very Bad'