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