Je fais une tâche de classification où le nombre de classes distinctes est de 1500. À partir de celles-ci, je voudrais supprimer ces classes (et l'enregistrement correspondant) dont la fréquence est inférieure à 10.
Je peux écrire une fonction quelque chose comme ceci:
code_freq_hash = {} for code in y: code_freq_hash.setdefault(code, 0) code_freq_hash[code] += 1
pour obtenir la fréquence de chaque classe, puis supprimer les enregistrements correspondants. Cependant, je me demande s'il existe une fonction intégrée pour faire cela dans scikit learn ou keras
3 Réponses :
Une solution pourrait être l'extrait de code suivant:
import numpy as np unique, appearances = np.unique(a, return_counts=True) code_freq_hash = [(unique[i], appearances[i]) for i in range(len(unique)) if appearances[i] >= 10]
Encore plus élégant, comme indiqué ci-dessous, relevant_labels = unique [apparences> = 10]
p >
Voici un exemple de solution utilisant numpy et pandas.
Création d'un ensemble de données avec deux fonctionnalités et une colonne class
array([[-1.35736852, 1.57580524, 5. ], [ 0.46359614, 1.02004142, 6. ], [-0.39093188, -0.41896435, 6. ], [ 0.20954221, 0.79715056, 5. ], [ 0.12658469, -0.34519613, 5. ], [-1.04240815, 1.05019427, 6. ], [-0.2216682 , 1.76374209, 5. ], [-0.0456175 , 1.15938322, 5. ], [ 1.45250806, -0.78511526, 5. ]])
Numpy
d = df.loc[df['class'].isin(df['class'].value_counts().index[df['class'].value_counts() > 2])]
Conversion de l'ensemble de données (tableau numpy) en un dataframe pandas
df = pd.DataFrame(data) # renamming the last column to the name "class" df.rename(columns={ df.columns[-1]: "class" }, inplace=True) 0 1 class 0 0.542154 -0.434981 3.0 1 1.513857 -0.606722 17.0 2 0.372834 -0.120914 0.0 3 -1.357369 1.575805 5.0 4 0.547217 0.719883 4.0 5 0.818016 -0.243919 9.0 6 -0.400552 0.066519 19.0 7 0.463596 1.020041 6.0 8 0.850465 -0.814260 14.0 9 1.693060 0.186741 17.0 10 -0.287775 -0.190247 3.0 11 -0.390932 -0.418964 6.0 12 0.209542 0.797151 5.0 13 0.126585 -0.345196 5.0 14 -0.151729 -1.260708 4.0 15 -1.042408 1.050194 6.0 16 -0.221668 1.763742 5.0 17 -0.045617 1.159383 5.0 18 1.452508 -0.785115 5.0 19 2.125601 1.745009 2.0
Compter les occurrences et filtrer uniquement les classes qui se produisent plus de deux fois (définir 2 à 10 dans votre cas)
val, count = np.unique(data[:,-1], return_counts=True) val[count>2] out = data[np.isin(data[:, -1], val[np.isin(val, val[count>2])])] # replace 2 with 10 for your problem
Vous pouvez obtenir le tableau numpy comme d .values
data = np.hstack((np.array(np.random.randn(20,2)), np.random.choice(np.arange(20), (20,1))))
Il n'y a pas de solution directe pour cela dans Sklearn mais comme vous l'avez mentionné, cela pourrait être réalisé par des fonctions personnalisées.
import pandas as pd import numpy as np df = pd.DataFrame({'labels': np.random.randint(0,10,size=50000), 'input': np.random.choice(['sample text 1','sample text 1'],size=50000)}) threshold = 5000 labels_df=df.labels.value_counts() filtered_labels = labels_df[labels_df>threshold].index new_df = df.loc[df['labels'].isin(filtered_labels),:] new_df.shape #(25290, 2)
Votre ensemble de données est-il une trame de données Pandas ou un tableau numpy? Une solution basée sur pandas / numpy fonctionnerait-elle?
La solution numpy fonctionnera