File size: 2,877 Bytes
2477a46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Module de prétraitement des données pour les modèles de machine learning.
Ce module contient des fonctions pour identifier les types de features (numériques et catégorielles)
et pour construire des préprocesseurs adaptés aux différents types de modèles (linéaires, basés sur les arbres, boosting)."""
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler


def get_feature_types(X: pd.DataFrame):
    """
    Identifie les colonnes numériques et catégorielles.
    args:
        X : pd.DataFrame
    returns:
        numeric_features : list
        categorical_features : list
    """
    numeric_features = X.select_dtypes(include=["int64", "float64"]).columns.tolist()
    categorical_features = X.select_dtypes(include=["object", "category"]).columns.tolist()

    return numeric_features, categorical_features


def build_linear_preprocessor(X: pd.DataFrame):
    """
    Preprocessing pour modèles linéaires.
    Numériques :
        StandardScaler
    Catégorielles :
        OneHotEncoder
    args:
        X : pd.DataFrame
    returns:
        preprocessor : ColumnTransformer
    """
    numeric_features, categorical_features = get_feature_types(X)

    preprocessor = ColumnTransformer(
        transformers=[
            ("num", StandardScaler(), numeric_features),
            ("cat", OneHotEncoder(handle_unknown="ignore", sparse_output=False), categorical_features),
        ],
        remainder="drop",
    )

    return preprocessor


def build_tree_preprocessor(X: pd.DataFrame):
    """
    Preprocessing pour modèles basés sur les arbres.
    Numériques :
        Pas de transformation
    Catégorielles :
        OneHotEncoder
    args:
        X : pd.DataFrame
    returns:
        preprocessor : ColumnTransformer
    """
    numeric_features, categorical_features = get_feature_types(X)

    preprocessor = ColumnTransformer(
        transformers=[
            ("num", "passthrough", numeric_features),
            ("cat", OneHotEncoder(handle_unknown="ignore", sparse_output=False), categorical_features),
        ],
        remainder="drop",
    )

    return preprocessor


def build_preprocessor(X: pd.DataFrame, model_type: str):
    """
    Construit un préprocesseur adapté au type de modèle.
    args:
        X : pd.DataFrame
        model_type : str, parmi 'linear', 'tree', 'boosting'
    returns:
        preprocessor : ColumnTransformer
    """
    if model_type == "linear":
        return build_linear_preprocessor(X)

    elif model_type in ["tree", "boosting"]:
        return build_tree_preprocessor(X)

    else:
        raise ValueError(
            "model_type doit être parmi : 'linear', 'tree', 'boosting'"
        )

def get_categorical_features(X):
    return X.select_dtypes(include=["object", "category"]).columns.tolist()