Machine learning scikitlearn删除不太频繁的分类类
我在做一个分类任务,不同的类的数量是1500。从中,我想删除那些频率小于10的类(和相应的记录) 我可以编写这样的函数: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
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. ]])