如何改进我对德语文本的多类文本分类?
How to improve my multiclass text-classification on German text?
我是 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-如果我想有一个好的分类,我还能做什么
如果您想坚持使用此配置,提高准确性的最佳方法是通过 超参数 调整,或引入其他组件,例如 feature选择.
超参数调优
大多数机器学习算法和机器学习管道的一部分都有几个可以更改的参数。例如,TfidfVectorizer
具有不同的 ngram 范围、不同的分析级别、不同的分词器以及更多不同的参数。其中大部分会影响您的表现。因此,您可以做的是系统地改变这些参数(以及您 SVC
的参数),同时监控您在 开发集 上的准确性(即 不是测试数据!)。交叉验证通常用于此类设置,而不是固定的开发集。
在 sklearn
中执行此操作的最佳方法是通过 RandomizedSearchCV
(有关详细信息,请参阅 here)。 class 通过从选项集中随机抽样固定次数的迭代,自动交叉验证和搜索您预先指定的可能选项。通过将此技术应用于您的训练数据,您将自动找到对给定训练数据和选项表现更好的模型。理想情况下,这些模型也会在您的测试数据上表现更好。公平警告:交叉验证搜索技术可能需要一段时间才能 运行。
特征选择
除了网格搜索,另一种提高性能的方法是通过特征选择。特征选择通常包含一个统计测试,该测试确定哪些特征可以解释您试图解决的典型任务中的差异。 sklearn
中的特征选择方法详见here.
到目前为止,这里最重要的一点是,您添加到模型中的任何东西的性能都应该在独立的开发集或交叉验证中进行验证。留下你的测试数据。
我是 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-如果我想有一个好的分类,我还能做什么
如果您想坚持使用此配置,提高准确性的最佳方法是通过 超参数 调整,或引入其他组件,例如 feature选择.
超参数调优
大多数机器学习算法和机器学习管道的一部分都有几个可以更改的参数。例如,TfidfVectorizer
具有不同的 ngram 范围、不同的分析级别、不同的分词器以及更多不同的参数。其中大部分会影响您的表现。因此,您可以做的是系统地改变这些参数(以及您 SVC
的参数),同时监控您在 开发集 上的准确性(即 不是测试数据!)。交叉验证通常用于此类设置,而不是固定的开发集。
在 sklearn
中执行此操作的最佳方法是通过 RandomizedSearchCV
(有关详细信息,请参阅 here)。 class 通过从选项集中随机抽样固定次数的迭代,自动交叉验证和搜索您预先指定的可能选项。通过将此技术应用于您的训练数据,您将自动找到对给定训练数据和选项表现更好的模型。理想情况下,这些模型也会在您的测试数据上表现更好。公平警告:交叉验证搜索技术可能需要一段时间才能 运行。
特征选择
除了网格搜索,另一种提高性能的方法是通过特征选择。特征选择通常包含一个统计测试,该测试确定哪些特征可以解释您试图解决的典型任务中的差异。 sklearn
中的特征选择方法详见here.
到目前为止,这里最重要的一点是,您添加到模型中的任何东西的性能都应该在独立的开发集或交叉验证中进行验证。留下你的测试数据。