将训练集和测试集的数据除以训练集中的所有主题
Posted
技术标签:
【中文标题】将训练集和测试集的数据除以训练集中的所有主题【英文标题】:Divide data for training and test set with all subject in the training set 【发布时间】:2019-01-14 04:31:14 【问题描述】:我是机器学习的新手,我正在尝试处理 SVM。我有一个包含近 3000 个数据的语料库,其中包含大约 47 个主题,我计划对其进行 10 倍交叉验证。但是在交叉验证期间,我如何确保所有 47 个受试者都在 10 个组中的每个组中?
例如,一些主题是“apple”、“blackberry”、“sony”、“canon”、“htc”。我想确保交叉验证中的所有组都包含“apple”、“blackberry”、“sony”、“canon”、“htc”等,这意味着第 1 组 - 第 10 组有它们。
那么我如何确保这一点?我应该先将数据按主题分开,然后只将它们分成10组,然后再将它们全部合并在一起吗?
但是如果是这样,这是否意味着我已经手动将 10 组数据分成训练和测试集,10 次(手动交叉验证)然后只传递给 libSVM?或者我只需要准备 10 个包含所有主题的组,然后让 libSVM 进行自动交叉验证 -v 10?
回到主题,我如何用 Python 编程来分割数据?我的数据有 2 列(标签),一列用于主题,一列用于内容/文本。
【问题讨论】:
【参考方案1】:您可以使用 sklearn 库来拆分数据
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(df,tar,test_size=0.30)
上面的代码会将数据以 7:3 的比例拆分为训练和测试,并打乱它们,这样你就可以获得训练和验证的所有目标值。
【讨论】:
【参考方案2】:您要执行的操作称为分层。它确保在拆分数据时,保留每个类中样本的百分比。
在 python 中,这可以通过 scikit-learn 轻松完成:
要将数据拆分为训练/测试集,您可以使用sklearn.model_selection.train_test_split。根据文档,默认情况下它以分层方式拆分数据。您甚至可以通过将参数传递给 stratify
来修改它。
要为交叉验证生成折叠,您可以使用sklearn.model_selection.StratifiedShuffleSplit。
如果你想使用 sklearn 来训练你的模型,我建议你使用 sklearn.model_selection.StratifiedKFold。
【讨论】:
以上是关于将训练集和测试集的数据除以训练集中的所有主题的主要内容,如果未能解决你的问题,请参考以下文章