Ich habe den Code im Unterabtastungskapitel von dieser Seite geändert, damit er funktioniert.
python
#Methode, um sicherzustellen, dass die Anzahl der positiven und negativen Daten in den Zugdaten gleich ist
#Referenz: https://qiita.com/ryouta0506/items/619d9ac0d80f8c0aed92
#Cluster mit kmean und Stichprobe mit konstanter Rate für jeden Cluster
# X :DataFrame von Pandas
# target_column_name :Name der Klasse. "Onset Flag" etc.
# minority_label :Minority Label Wert. Zum Beispiel "1".
def under_sampling(X, target_column_name, minority_label):
#Verstecke es, weil es jedes Mal erscheint
import warnings
warnings.simplefilter('ignore', pd.core.common.SettingWithCopyWarning)
#Teilen Sie sich in Mehrheit und Minderheit
X_majority = X.query(f'{target_column_name} != {minority_label}')
X_minority = X.query(f'{target_column_name} == {minority_label}')
#Clustering mit KMeans
from sklearn.cluster import KMeans
km = KMeans(random_state=43)
km.fit(X_majority)
X_majority['Cluster'] = km.predict(X_majority)
#Berechnen Sie, wie viele Proben für jeden Cluster extrahiert werden sollen
ratio = X_majority['Cluster'].value_counts() / X_majority.shape[0]
n_sample_ary = (ratio * X_minority.shape[0]).astype('int64').sort_index()
#Extrahieren Sie Proben für jeden Cluster
dfs = []
for i, n_sample in enumerate(n_sample_ary):
dfs.append(X_majority.query(f'Cluster == {i}').sample(n_sample))
#Stellen Sie sicher, dass Sie auch Minderheitendaten kombinieren
dfs.append(X_minority)
#Erstellen Sie Daten nach der Unterabtastung
X_new = pd.concat(dfs, sort=True)
#Gelöscht, weil es nicht nötig ist
X_new = X_new.drop('Cluster', axis=1)
return X_new
Recommended Posts