python - 如何改进我对德语文本的多类文本分类?
问题描述
我是 NLP 的新手,这让我有点困惑。我正在尝试在我的数据集上使用 SVC 进行文本分类。我有 6 个类的不平衡数据集。文本是健康、体育、文化、经济、科学和网络类别的新闻。我正在使用 TF-IDF 进行矢量化。
预处理步骤: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)
我的 metrci 准确度分数是:93%
然后我决定降低维数:所以在我第二次尝试时,我添加了 TruncatedSVD
# Linear SVC:
text_clf_lsvc = Pipeline([('tfidf', TfidfVectorizer()),('svd', TruncatedSVD()),
('clf', LinearSVC()),])
predictions = text_clf_lsvc.predict(X_test)
我的 metrci 准确度分数下降到 34%。
我的问题:
1- 如果我想坚持使用 TF-IDF 和 SVC 进行分类,我该如何改进我的模型
2- 如果我想有一个好的分类,我还能做什么
解决方案
鉴于您想要坚持使用此配置,提高准确性的最佳方法是通过超参数调整,或通过引入额外的组件,例如特征选择。
超参数调优
大多数机器学习算法和机器学习管道的一部分都有几个可以更改的参数。例如,TfidfVectorizer
具有不同的 ngram 范围、不同的分析级别、不同的分词器,以及更多要变化的参数。其中大部分会影响你的表现。因此,您可以做的是系统地改变这些参数(以及您的参数),同时监控您在开发集SVC
上的准确性(即,不是测试数据!)。在这些类型的设置中通常使用交叉验证而不是固定的开发集。
最好的方法sklearn
是通过 a RandomizedSearchCV
(有关详细信息,请参阅此处)。此类通过从选项集中随机抽样固定迭代次数来自动交叉验证和搜索您预先指定的可能选项。通过将此技术应用于您的训练数据,您将自动找到对您的给定训练数据和您的选项表现更好的模型。理想情况下,这些模型也会在您的测试数据上表现得更好。公平警告:交叉验证的搜索技术可能需要一段时间才能运行。
特征选择
除了网格搜索,另一种提高性能的方法是通过特征选择。特征选择通常由统计测试组成,该测试确定哪些特征解释了您尝试解决的典型任务中的差异。这里sklearn
详细介绍了中的特征选择方法。
到目前为止,这里最重要的一点是,您添加到模型中的任何内容的性能都应该在独立开发集或交叉验证中进行验证。不理会您的测试数据。
推荐阅读
- php - CSS 和 Bootstrap 在 laravel5.8 中不起作用。我怎样才能解决这个问题?
- r - 无响应的滑块
- python - 由于 socket.py 中的错误,无法设置服务器
- c# - 如何解决 Azure Web 应用程序上的“请求标头过长”
- python - 尝试处理 IndentationError 异常
- kendo-ui-angular2 - 按下带有文本框值的回车键后如何触发事件?
- python - 使用 pyserial 的 AT+CIMI 命令导致空字符串
- arrays - Array 仅打印最后一项回收站视图
- javascript - 错误:TS2304:找不到名称“t”。在运行角度项目时
- javascript - 远程脚本之前或之后的dataLayer:Google Analytics和TagManager的区别