拆分机器学习模型的数据
数据是每个机器学习问题的核心。没有合适的数据,机器学习模型就像没有灵魂的身体。但是在当今“大数据”的世界中,收集数据不再是一个大问题。我们每天都在有意(或无意)生成庞大的数据集。然而,手头有多余的数据仍然不能解决问题。 ML模型要给出合理的结果,我们不仅需要输入大量数据,还要保证数据的质量。
虽然理解原始数据本身就是一门艺术,需要良好的特征工程技能和领域知识(在特殊情况下),但质量数据只有在正确使用之前是没有用的。 ML/DL 从业者面临的主要问题是如何划分训练和测试数据。尽管乍一看似乎是一个简单的问题,但只有深入研究才能衡量其复杂性。糟糕的训练和测试集可能会对模型的输出产生不可预测的影响。这可能会导致数据过拟合或欠拟合,我们的模型最终可能会给出有偏差的结果。
那么如何划分数据呢?
理想情况下,数据应分为 3 组——即训练、测试和坚持交叉验证或开发 (dev) 集。让我们首先简要了解这些集合的含义以及它们应该具有什么类型的数据。
- 动车组:
训练集将包含将输入模型的数据。简单来说,我们的模型将从这些数据中学习。例如,回归模型将使用此数据中的示例来查找梯度以降低成本函数。然后这些梯度将用于降低成本并有效地预测数据。 - 开发集:
开发集用于验证经过训练的模型。这是最重要的设置,因为它将构成我们模型评估的基础。如果训练集上的错误和开发集上的错误之间的差异很大,则意味着模型方差大,因此属于过度拟合的情况。 - 测试集:
测试集包含我们测试训练和验证模型的数据。它告诉我们我们的整体模型有多有效,以及它预测一些没有意义的东西的可能性有多大。有大量的评估指标(如精确率、召回率、准确率等)可用于衡量我们模型的性能。
选择训练/开发/测试集的一些技巧
- 训练集、开发集和测试集的大小仍然是讨论的重要话题之一。尽管对于一般机器学习问题,80/20/20 的训练/开发/测试集比率是可以接受的,但在当今的大数据世界中,20% 相当于一个庞大的数据集。我们可以轻松地使用这些数据进行训练,并帮助我们的模型学习更好和多样化的特征。因此,在大型数据集(我们有数百万条记录)的情况下,98/1/1 的训练/开发/测试拆分就足够了,因为即使 1% 也是大量数据。
旧分布:Train (80%) Dev (20%) Test (20%)
所以现在我们可以使用一个名为 Turicreate 的机器学习库来拆分我们的数据集。它将帮助我们将数据拆分为训练、测试和开发。
Python3
# Importing the turicreate Library
import turicreate as tc
# Now Loading the data
data=tc.SFrame("data.csv")
# Turicreate has a library named as random
# split that will the data randomly among the train,test
# Dev will be part of test set and we will split that data later.
train_data_set,test_data=data.random_split(.8,seed=0)
# In this 0.8 it means that we will have 80%
# as our training data and rest 20% data as test data
# Here seed is for giving the same set for
# train and test again and again
# Now we will split our test_data into
# two different sets of equal length
test_data_set,dev_set=test_data.random_split(.5,seed=0)
# It will split the test data into 50%
# for dev_set and 50% for test_data_set
#Now making a example model for showing
# how to use these sets.
model=tc.linear_regression.create(train_data,target=["XYz"],validation set=dev_set)
# In this model we have our validation
# set as dev_set and input data as our train_data
# XYZ are random features about data
# Now we will validate and test our model
# with the help of our test_data_set
model.predict(test_data_set[1])
#It will predict
Python3
# Importing the turicreate Library
import turicreate as tc
# Now Loading the data
data=tc.SFrame("data.csv")
# Turicreate has a library named as
# random split that will the data
# randomly among the train,test
#Dev will be part of test set and
# we will split that data later.
train_data_set,test_data=data.random_split(.98,seed=0)
# In this 0.8 it means that we will have 98%
# as our training data and rest 2% data as test data
# Here seed is for giving the same set for train and
# test again and again
# Now we will split our test_data into two
# different sets of equal length
test_data_set,dev_set=test_data.random_split(.5,seed=0)
# It will split the test data into 50%
# for dev_set and 50% for test_data_set
# Now making a example model for showing
# how to use these sets.Here 50% means that
# 50% of the test_data
model=tc.linear_regression.create(train_data,target=["XYz"],validation set=dev_set)
# In this model we have our validation set
# as dev_set and input data as our train_data
# XYZ are random features about data
# Now we will validate and test our model
# with the help of our test_data_set
model.predict(test_data_set[1])
#It will predict
大数据时代分布:
Train (98%) | Dev (1%) | Test (1%) |
- 开发和测试集应该来自相同的分布。我们应该更喜欢获取整个数据集并对其进行洗牌。然后我们可以将其随机拆分为 dev 和 test 集
- 训练集可能来自与开发/测试集略有不同的分布
- 我们应该选择一个开发和测试集来反映我们期望在未来获得的数据以及您认为重要的数据。开发集和测试集应该使您的模型变得更加健壮
蟒蛇3
# Importing the turicreate Library
import turicreate as tc
# Now Loading the data
data=tc.SFrame("data.csv")
# Turicreate has a library named as
# random split that will the data
# randomly among the train,test
#Dev will be part of test set and
# we will split that data later.
train_data_set,test_data=data.random_split(.98,seed=0)
# In this 0.8 it means that we will have 98%
# as our training data and rest 2% data as test data
# Here seed is for giving the same set for train and
# test again and again
# Now we will split our test_data into two
# different sets of equal length
test_data_set,dev_set=test_data.random_split(.5,seed=0)
# It will split the test data into 50%
# for dev_set and 50% for test_data_set
# Now making a example model for showing
# how to use these sets.Here 50% means that
# 50% of the test_data
model=tc.linear_regression.create(train_data,target=["XYz"],validation set=dev_set)
# In this model we have our validation set
# as dev_set and input data as our train_data
# XYZ are random features about data
# Now we will validate and test our model
# with the help of our test_data_set
model.predict(test_data_set[1])
#It will predict
处理不匹配的训练和开发/测试集:
可能存在训练集和开发/测试集来自略有不同的分布的情况。例如,假设我们正在构建一个移动应用程序来将鲜花分为不同的类别。用户将单击花的图像,我们的应用程序将输出花的名称。
现在假设在我们的数据集中,我们有 200,000 张来自网页的图像,而只有 10,000 张图像是从移动相机生成的。在这种情况下,我们有两种可能的选择:
选项 1:我们可以随机打乱数据并将数据划分为训练/开发/测试集Set Train (205,000) Dev (2,500) Test (2,500) Source Random Random Random
在这种情况下,所有训练集、开发集和测试集都来自相同的分布,但问题是开发集和测试集将有大量来自我们不关心的网络图像数据。
选项 2:我们可以将网页中的所有图像都放入训练集,向其中添加 5,000 个相机生成的图像,并将其余 5,000 个相机图像划分为开发和测试集。Set Train (205,000) Dev (2,500) Test (2,500) Source (200,000 from web app and 5,000 camera) Camera Camera
在这种情况下,我们以我们真正关心的分布(相机图像)为目标,因此从长远来看它会带来更好的性能。
何时更改开发/测试集?
假设我们有 2 个模型 A 和 B,在开发集上的错误率分别为 3% 和 5%。虽然看起来 A 的性能更好,但假设它也允许一些审查数据,这对您来说是不可接受的。在 B 的情况下,虽然它确实有很高的错误率,但放手审查数据的概率可以忽略不计。在这种情况下,指标和开发集偏爱模型 A,但您和其他用户偏爱模型 B。这表明用于评估的指标或开发/训练集存在问题。
为了解决这个问题,我们可以在审查数据的情况下向成本函数添加惩罚。一个原因可能是开发/测试集中的图像是高分辨率的,但实时图像是模糊的。在这里,我们需要更改开发/测试集分布。这完全是关于为 ML 问题拆分数据集。