Machine learning scikitlearn删除不太频繁的分类类

Machine learning scikitlearn删除不太频繁的分类类,machine-learning,keras,scikit-learn,Machine Learning,Keras,Scikit Learn,我在做一个分类任务,不同的类的数量是1500。从中,我想删除那些频率小于10的类(和相应的记录) 我可以编写这样的函数: code_freq_hash = {} for code in y: code_freq_hash.setdefault(code, 0) code_freq_hash[code] += 1 获取每个类的频率,然后删除相应的记录。 但是,我想知道在scikit learn或keras中是否有一个内置函数来实现这一点。一个解决方案可能是以下代码片段: impo

我在做一个分类任务,不同的类的数量是1500。从中,我想删除那些频率小于10的类(和相应的记录)

我可以编写这样的函数:

code_freq_hash = {}
for code in y:
    code_freq_hash.setdefault(code, 0)
    code_freq_hash[code] += 1
获取每个类的频率,然后删除相应的记录。
但是,我想知道在scikit learn或keras中是否有一个内置函数来实现这一点。一个解决方案可能是以下代码片段:

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]

更为优雅的是,如下所述,
相关标签=独特的[外观>=10]

以下是使用numpy和pandas的示例解决方案


创建一个包含两个功能和一个
class
列的数据集

data = np.hstack((np.array(np.random.randn(20,2)), np.random.choice(np.arange(20), (20,1))))
努比 熊猫 将数据集(numpy数组)转换为数据帧

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
计算出现次数并仅过滤出现两次以上的类(在您的情况下,将2设置为10)

您可以通过
d.values

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.        ]])

在Sklearn中没有直接的解决方案,但正如您所提到的,它可以通过自定义函数实现

将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame({'labels':np.random.randint(0,10,size=50000),
“输入”:np.random.choice(['sample text 1','sample text 1',],size=50000)})
阈值=5000
labels\u df=df.labels.value\u counts()
过滤的标签=标签[labels\u df>阈值].索引
new_df=df.loc[df['labels'].isin(过滤的_标签),:]
新形状
#(25290, 2)

您的数据集是熊猫数据帧还是numpy数组?基于pandas/numpy的解决方案有效吗?numpy解决方案有效
d = df.loc[df['class'].isin(df['class'].value_counts().index[df['class'].value_counts() > 2])]
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.        ]])