将分类管道应用于数据集的子集

时间:2019-05-14 13:11:40

标签: python pandas svm

我正在处理短文本片段(1-3个句子)的分类。在主题方面,数据集包含有关植物,动物和无关材料的文本。首先,我使用分类器(线性SVM)标记每个代码段的类别(svm_gen:0-不相关; 1-植物; 2-动物)。可以正常工作。

现在,每个类别都有子类别,我也想使用各自的算法对其进行分类。说,对于植物(svm_plant:0-其他,1-母猪,2-生长,3-收获),对于动物(svm_animal:0-其他,1-饲料,2-宠物,3-玩耍)。如何将各个管道有选择地应用于预先分类的变量,而不进行拆分,然后再次追加数据集?

如前所述,我可以基于预分类来分割数据集,将第二轮分类器应用于新的熊猫数据框,然后将它们附加回去。有更好的方法吗?

svm_gen = Pipeline([( ... )])
svm_gen.fit()
df_complete['Topic'] = svm_gen.predict(df_complete['Text'])

# write all texts concerning animals into a new df to apply the respective SVM
df_plant = df_complete[df_complete.Topic == 1]

# same for animals

# categories both individually for the sub-categories

# glue them back together

df_final = df_plant.append(df_animals, ingnore_index = True)

基本上,我想要一个最终的数据集(pandas数据框),其中包含“文本”列,“主题”列,然后是“子主题”列。根据文本在第一轮分类中所属于的类别,对后者进行选择性分类。有点像:

df_complete.loc[df_complete['Topic'] == 1, 'sub_Topic'] = svm_plant.predict['Text']
df_complete.loc[df_complete['Topic'] == 2, 'sub_Topic'] = svm_animals.predict['Text']
df_complete.loc[df_complete['Topic'] == 0, 'sub_Topic'] = 'n/a'

1 个答案:

答案 0 :(得分:0)

简短回答

来自scikit docs

  

管道可用于将多个估算器链接为一个。...

  

管道中的所有估计量(最后一个除外)必须为   变压器(即必须具有转换方法)。最后的估算者   可以是任何类型(变压器,分类器等)。

因此,在管道末端只能有一个分类器,而scikit管道是顺序的。您必须使用不同的数据集训练不同的分类器(重复使用相同的管线)并手动选择它们。