用训练集中的所有科目划分训练和测试集的数据

时间:2018-08-07 07:03:55

标签: python-2.7 svm cross-validation libsvm

我是机器学习的新手,我正在尝试处理SVM。我的语料库包含将近3000个数据,涉及47个主题,我打算与之进行10倍交叉验证。但是,如何在交叉验证期间确保所有47个受试者都属于10组中的每个组?

例如,某些主题是“苹果”,“黑莓”,“索尼”,“佳能”,“ htc”。我要确保交叉验证中的所有组都包含“苹果”,“黑莓”,“索尼”,“佳能”,“ htc”等,这意味着第1组-第10组拥有它们。

那么我该如何确保呢?我是否应该先按主题将数据分开,然后将它们分别分成10组,然后再将它们合并在一起?

但是,如果是这样,这是否意味着我已将10组数据手动分为训练和测试集,进行了10次(手动交叉验证),然后仅传递给libSVM?或者我只需要准备其中包含所有主题的10个小组,然后让libSVM执行自动交叉验证-v 10?

回到主题,我如何在Python中编程以拆分数据?我的数据有2列(标签),一列是主题,一列是内容/文本。

2 个答案:

答案 0 :(得分:1)

您可以使用sklearn库拆分数据

from sklearn.cross_validation import train_test_split    
x_train,x_test,y_train,y_test = train_test_split(df,tar,test_size=0.30)

上面的代码将数据按7:3的比例分为训练和测试数据,并对其进行混洗,以便获得训练和验证的所有目标值。

答案 1 :(得分:0)

您要执行的操作称为分层。这样可以确保在拆分数据时保留每个类别中的样本百分比。

在python中,这可以通过scikit-learn轻松完成:

  • 您可以使用sklearn.model_selection.train_test_split将数据拆分为训练/测试集。根据文档,默认情况下,它以分层方式拆分数据。您甚至可以通过向{% extends "blogs/base.html" %} {% block content %} <p>Make a new post:</p> <post action="{% url 'blogs:new_post' %}" method='post'> {% csrf_token %} {{ post.as_p }} <button name='submit'>Add Post</button> </post> {% endblock content %} 传递参数来修改它。

  • 要生成用于交叉验证的折叠,可以使用sklearn.model_selection.StratifiedShuffleSplit

  • 如果您想使用sklearn训练模型,建议您使用sklearn.model_selection.StratifiedKFold