J'ai modifié le code dans le chapitre sur le sous-échantillonnage de cette page pour le faire fonctionner.
python
#Méthode pour s'assurer que le nombre de données positives et négatives dans les données de train est le même
#Référence: https://qiita.com/ryouta0506/items/619d9ac0d80f8c0aed92
#Cluster avec kmeans et échantillonner à un taux constant pour chaque cluster
# X :DataFrame des pandas
# target_column_name :nom de la classe. "Indicateur de début" etc.
# minority_label :Valeur d'étiquette minoritaire. Par exemple, "1".
def under_sampling(X, target_column_name, minority_label):
    
    #Cachez-le car il apparaît à chaque fois
    import warnings
    warnings.simplefilter('ignore', pd.core.common.SettingWithCopyWarning)
    
    #Diviser en majorité et en minorité
    X_majority = X.query(f'{target_column_name} != {minority_label}')
    X_minority = X.query(f'{target_column_name} == {minority_label}')
    #Clustering avec KMeans
    from sklearn.cluster import KMeans
    km = KMeans(random_state=43)
    km.fit(X_majority)
    X_majority['Cluster'] = km.predict(X_majority)
    #Calculer le nombre d'échantillons à extraire pour chaque cluster
    ratio = X_majority['Cluster'].value_counts() / X_majority.shape[0] 
    n_sample_ary = (ratio * X_minority.shape[0]).astype('int64').sort_index()
    
    #Extraire des échantillons pour chaque cluster
    dfs = []
    for i, n_sample in enumerate(n_sample_ary):
        dfs.append(X_majority.query(f'Cluster == {i}').sample(n_sample))
    
    #Assurez-vous de combiner également les données relatives aux minorités
    dfs.append(X_minority)
    
    #Créer des données après le sous-échantillonnage
    X_new = pd.concat(dfs, sort=True)
    
    #Supprimé car inutile
    X_new = X_new.drop('Cluster', axis=1)
    
    return X_new
        Recommended Posts