我是NLP的新手,这让我有点困惑。我试图在我的数据集上使用SVC进行文本分类。我有一个6个类的不平衡数据集。这篇文章是健康、体育、文化、经济、科学和网络课程的新闻。我用TF-以色列国防军进行矢量化。
预处理步骤:lower-case所有文本并删除stop-words。因为我的文本是德语的,所以我没有使用lemmatization。
我的第一次尝试:
from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.2, random_state=42)
X_train = train['text']
y_train = train['category']
X_test = test['text']
y_test = test['category']
# Linear SVC:
text_clf_lsvc = Pipeline([('tfidf', TfidfVectorizer()), ('clf', LinearSVC()),])
predictions = text_clf_lsvc.predict(X_test)我的节拍器敏锐度为: 93%。
然后我决定降低维数:所以在我的第二次尝试中,我添加了TruncatedSVD
# Linear SVC:
text_clf_lsvc = Pipeline([('tfidf', TfidfVectorizer()),('svd', TruncatedSVD()),
('clf', LinearSVC()),])
predictions = text_clf_lsvc.predict(X_test)我的节拍器锐度分数下降到34%。
我的问题:
1-如果我想坚持TF-IDF和SVC分类,我如何改进我的模型?
如果我想得到一个好的分类,我还能做什么?
发布于 2020-12-04 14:54:33
考虑到您想要坚持这种配置,提高精度的最佳方法是通过超参数调优或引入其他组件,例如特性选择。
超参数整定
大多数机器学习算法和机器学习管道的部分都有几个可以更改的参数。例如,TfidfVectorizer具有不同的ngram范围、不同的分析级别、不同的标记器和更多的参数。这些都会影响你的表现。因此,您可以做的是系统地更改这些参数(以及SVC的参数),同时监视开发集的准确性(即,而不是测试数据!)。交叉验证通常用于这些类型的设置,而不是固定的开发集。
在sklearn中这样做的最好方法是通过RandomizedSearchCV (详见这里 )。这个类自动交叉验证和搜索您预先指定的可能选项,方法是从固定次数的迭代的选项集中随机抽样。通过将此技术应用于您的培训数据,您将自动找到对给定的培训数据和选项性能更好的模型。理想情况下,这些模型对测试数据的性能也会更好。公平警告:交叉验证的搜索技术可能需要一段时间才能运行。
特征选择
除了网格搜索之外,另一种提高性能的方法是通过特征选择。特征选择通常由统计测试组成,该测试确定要解决的典型任务中的哪些特性可以解释差异。sklearn中的特征选择方法是详细的这里。
到目前为止,这里最重要的一点是,您添加到模型中的任何内容的性能都应该在独立的开发集合上进行验证,或者在交叉验证中验证。远离您的测试数据。
https://stackoverflow.com/questions/65143979
复制相似问题