机器学习笔记——数据集分割

在模型训练之前,要首先划分训练集与测试集,如何对原始数据集进行训练集与测试集的划分?训练集与测试集的比例各占多少?如何保证各自内部标签分布平衡都会影响模型训练的最终效果。

好在R和Python中有现成的数据集分割函数,避免手动写函数导致划分比例不合理、训练集与测试集的样本的结构与总体不均衡的问题。

R语言中caTools包中的sample.split函数可以用来自动将原始数据集分割成训练集和测试集。

方法一——caTools中的sample.split函数

library("caTools")
set.seed(123)

data(iris)
table(iris$Species)

    setosa versicolor  virginica 
        50         50         50

split = sample.split(iris$Species,SplitRatio = .8)
train_data = subset(iris,split == TRUE)
test_data  = subset(iris,split == FALSE)

table(train_data$Species)
    setosa versicolor  virginica 
        40         40         40

table(test_data$Species)
    setosa versicolor  virginica 
        10         10         10

划分方法二——createDataPartition函数

library("caret")
split1  <- createDataPartition(y=iris$Species,p=0.8,list = FALSE)

train_data <- iris[split1,]
table(train_data$Species)
    setosa versicolor  virginica 
        40         40         40 

test_data  <- iris[-split1,]
table(test_data$Species)
    setosa versicolor  virginica 
        10         10         10

可以看到无论是caTools包中的sample.split函数还是caret包中的createDataPartition函数,都针对分类标签做了混合后的分层随机抽样,这样可以保证训练集与测试集内的各类标签分布比例与样本总体的分布比例严格一致,否则如果仅仅使用sample函数,无法达到分层随机抽样的目的。

Python的sk-learn库中也有现成的数据集分割工具可用。

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import pandas as pd

iris  = load_iris()
data = iris['data']
iris_data = pd.DataFrame(
         data = data,
         columns = ['sepal_length','sepal_width','petal_length','petal_width']
        )
iris_data["Species"] = iris[ 'target']
iris_data["Species"] = iris_data["Species"].map({0:"setosa",1:"versicolor",2:"virginica"})

iris_data["Species"].value_counts()
versicolor    50
virginica     50
setosa        50
Name: Species, dtype: int64

x,y = iris_data.iloc[:,0:-1],iris_data.iloc[:,-1]
train_data,test_data,train_target,test_target = train_test_split(x,y,test_size = 0.2,stratify = y)

train_target.value_counts()
test_target.value_counts()

这里有一个细节,其中train_test_split函数中有两个特殊的参数:shuffle和stratify。

shuffle参数相当于对原始数据进行混合抽样,相当于扑克牌发牌前的洗牌,保证随机性。

stratify参数则可以保证训练集&测试集中样本标签结构比例与指定的总体中样本标签结构比例一致,特别是在原始数据中样本标签分布不均衡时非常有用,达到分层随机抽样的目的。

而对于训练集与测试集的划分比例上来看,目前没有一个统一的比例标准,在机器学习类的参考资料中,推荐的比例是训练集和测试集的比例保持在1:2~1:4之间为佳。

倘若使用验证集,则建议保持6:2:2左右的训练集、验证集及测试集比例。

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2018-09-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能头条

Azure Machine Learning 上如何选择合适的机器学习算法

16760
来自专栏CSDN技术头条

详解 BP 神经网络基本原理及 C 语言实现

BP(Back Propagation)即反向传播,指的是一种按照误差反向传播来训练神经网络的方法。而 BP 神经网络即为一种按照误差反向传播的方法训练的神经网...

55640
来自专栏机器之心

教程 | 使用Keras实现多输出分类:用单个模型同时执行两个独立分类任务

之前我们介绍了使用 Keras 和深度学习的多标签分类(multi-label classification),参阅 https://goo.gl/e8RXtV...

82320
来自专栏用户2442861的专栏

SSD人脸检测以及FDDB检测结果分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

91130
来自专栏码洞

人工不智能之sklearn聚类

线性回归是一种有监督算法,提供了输入数据x和参考目标值y,参考目标提供了一种纠错机制,是对预测结果y_的监督,如果y和y_相差过大,说明拟合的模型可能存在问题。...

7310
来自专栏机器之心

资源 | GitHub新项目:轻松使用多种预训练卷积网络抽取图像特征

选自GitHub 机器之心整理 参与:思源 最近 GitHub 有一个非常有意思的项目,它可以使用多种预训练 TensorFLow 模型计算图像特征。对于每一个...

33860
来自专栏杨熹的专栏

Ensemble Learners

Udacity Ensemble Learners ---- Boosting Algorithm 不需要绞尽脑汁去想很复杂的 Rules,只需要一些简单的 ...

37270
来自专栏机器之心

资源 | 一个Python特征选择工具,助力实现高效机器学习

项目地址:https://github.com/WillKoehrsen/feature-selector

21420
来自专栏宏伦工作室

动手实现notMNIST数据集图片分类

23130
来自专栏ATYUN订阅号

智能主题检测与无监督机器学习:识别颜色教程

介绍 人工智能学习通常由两种主要方法组成:监督学习和无监督的学习。监督学习包括使用现有的训练集,这种训练集由预先标记的分类数据列组成。机器学习算法会发现数据的...

56240

扫码关注云+社区

领取腾讯云代金券