【发布时间】:2020-11-12 17:53:48
【问题描述】:
我正在创建一个分类器,它将矢量化的书籍文本作为输入,并作为输出预测这本书是“好”还是“坏”。
我有 40 本书,27 本书好,13 本书坏。我将每本书分成 5 条记录(5 个 10 页段)以增加数据量,因此总共 200 条记录。
最终,我会将模型拟合到所有书籍上,并使用它来预测未标记的书籍。
估计我的模型将具有的准确度的最佳方法是什么?我还将将此估计值用于模型比较、调整等。
我正在考虑的两个选项:
- 运行一个循环来测试训练将模型拆分 X 次,并查看每次拆分的准确度
- 使用交叉验证(特别是 GroupKFold,以便将每本书的 5 条记录保存在一起,因为如果不这样做将是重大泄漏)
我想尽快在很小的误差范围内估计准确度。重复的训练测试拆分速度较慢,因为即使我按标签分层(选择 8 本书好书和 4 本书坏书进行测试),特定模型的准确度也可能在 0.6 到 0.8 之间变化,所以我必须跑很多才能得到准确的估计。
另一方面,CV 每次运行时都给我相同的分数,并且似乎与 100 次训练测试拆分后的模型的平均准确度相对较好(在 1-1.5% 以内)。
CV 更快,所以我更喜欢使用它。 CV 在这里使用有意义吗?我目前正在使用 5 折(因此每次运行选择 8 个保留书,或总共 40 个保留记录)。
另外,CV 是否应该在我每次运行时都提供完全相同的准确度? (就此而言,以相同的顺序排列完全相同的准确度列表)。在将 X、y 和组放入 cross_val_score 之前,我正在改组我的语料库。 ShuffleSplit 会更好吗?这是我的代码:
for i in range(0,5):
dfcopy = df.copy()
dfcopy = dfcopy.sample(frac=1).reset_index(drop=True)
X, y = dfcopy.text, dfcopy.label
groups = dfcopy.title.tolist()
model = MultinomialNB()
name = 'LR'
pipe = Pipeline([('cleaner', clean_transformer()),
('vectorizer', bow_vector),
('classifier', model)])
score = cross_val_score(estimator=pipe, X=X, y=y, groups=groups, cv=GroupKFold())
print(score)
print(np.mean(score))
最后,我应该使用分层吗?我的想法是我应该,因为我实际上有 40 个项目要在训练和测试之间拆分,所以测试集(随机选择)可能会合理地最终成为全部/大部分好或全部/大部分坏,我不认为将是一个很好的表示准确性的测试集。
【问题讨论】:
标签: python machine-learning scikit-learn cross-validation train-test-split