我是机器学习的新手,我正在尝试处理SVM。我的语料库包含将近3000个数据,涉及47个主题,我打算与之进行10倍交叉验证。但是,如何在交叉验证期间确保所有47个受试者都属于10组中的每个组?
例如,某些主题是“苹果”,“黑莓”,“索尼”,“佳能”,“ htc”。我要确保交叉验证中的所有组都包含“苹果”,“黑莓”,“索尼”,“佳能”,“ htc”等,这意味着第1组-第10组拥有它们。
那么我该如何确保呢?我是否应该先按主题将数据分开,然后将它们分别分成10组,然后再将它们合并在一起?
但是,如果是这样,这是否意味着我已将10组数据手动分为训练和测试集,进行了10次(手动交叉验证),然后仅传递给libSVM?或者我只需要准备其中包含所有主题的10个小组,然后让libSVM执行自动交叉验证-v 10?
回到主题,我如何在Python中编程以拆分数据?我的数据有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。