如何在Python中分割数据以进行训练和测试,而不使用Sklearn




如何在Python中分割数据以进行训练和测试,而不使用Sklearn

在机器学习或人工智能模型领域,数据是其基础。处理数据的方式决定了模型的整体性能。这包括不可或缺的将数据集分成学习和验证集的任务。虽然sklearn的train_test_split()是一个常用的方法,但有时Python爱好者可能没有它,或者想知道如何手动实现类似的结果。本文将介绍如何在不依赖sklearn的情况下将数据分成学习和验证集。我们将利用Python的内置库来实现这个目标。

示例1:分离数据的原理

在深入了解细节之前,让我们先了解一下原理。机器学习算法需要大量的数据来学习。这个数据集合,即学习集,帮助模型解析模式并进行预测。然而,为了评估模型的能力,我们需要一些模型之前未接触过的数据。这些未触及的数据就是验证集。

如果将相同的数据用于学习和验证,会导致过拟合的模型 – 模型在学习数据上表现出色,但在未触及的数据上表现不佳。因此,数据通常被分成70-30或80-20的比例,其中较大的部分用于学习,较小的部分用于验证。



在Python中手动分离数据

我们将从使用Python内置操作进行简单而有效的数据分离开始。这里使用的样本是一个整数列表,但该技术适用于任何数据类型。

假设我们有以下数据集data:

data = list(range(1, 101))  # data is a list of integers from 1 to 100
  • 目标是将这些数据分成80%的学习数据和20%的验证数据。

  • 最初,我们将导入必要的库。

  • 随机模块提供了各种生成随机数的函数,我们将利用它来对数据进行洗牌。然后,我们将洗牌后的数据。

  • 在洗牌数据之后,我们将其分隔为学习集和验证集。

split_index决定了数据被分叉的点。我们将其计算为split_ratio和数据集大小的乘积。

最后,我们使用切片来创建学习和验证数据集。

学习数据包括列表开头到split_index之间的元素,验证数据由split_index到列表结束的元素组成。

示例

import random
random.shuffle(data)

split_ratio = 0.8  # We are using an 80-20 split here
split_index = int(split_ratio * len(data))

train_data = data[:split_index]
test_data = data[split_index:]

输出

train_data = [65, 51, 8, 82, 15, 32, 11, 74, 89, 29, 50, 
34, 93, 84, 37, 7, 1, 83, 17, 24, 5, 33, 49, 90, 35, 57, 
47, 73, 46, 95, 10, 80, 59, 94, 63, 27, 31, 52, 18, 76, 
91, 71, 20, 68, 70, 87, 26, 64, 99, 42, 61, 69, 79, 12, 
3, 66, 96, 75, 30, 22, 100, 14, 97, 56, 55, 58, 28, 23, 
98, 6, 2, 88, 43, 41, 78, 60, 72, 39]

test_data = [45, 53, 48, 16, 9, 62, 13, 81, 92, 54, 21, 
38, 25, 44, 85, 19, 40, 77, 67, 4]

由于代码涉及到数据的随机洗牌,每次尝试运行时输出可能会有所不同。

示例2:利用Numpy来分离数据

另一种无需sklearn的分离数据的技术是利用numpy库。Numpy是一个强大的用于数值计算的库,可以用来构建数组并高效地对其进行操作。



以下是利用numpy来分离数据的方法:

  • 首先,导入numpy库。然后,构建一个numpy数组。

  • 洗牌该数组。最后,拆分数组。

索引表示我们的数据池分成学习和验证子集的点。它是通过利用预定的拆分比例(在我们的例子中为80-20拆分的0.8)乘以数据点的累积计数来确定的。

最后一步是使用计算得到的拆分索引创建训练和测试数据集。我们使用列表切片来进行此操作。

示例

import numpy as np

data = np.array(range(1, 101))  
# data is a numpy array of integers from 1 to 100
np.random.shuffle(data)

split_ratio = 0.8  # We are using an 80-20 split here
split_index = int(split_ratio * len(data))

train_data = data[:split_index]
test_data = data[split_index:]

输出

train_data = [52, 13, 87, 68, 48, 4, 34, 9, 74, 25, 
30, 38, 90, 83, 54, 45, 61, 73, 80, 14, 70, 63, 75, 
81, 97, 60, 96, 8, 43, 20, 79, 46, 50, 76, 18, 84, 
26, 31, 71, 56, 22, 88, 64, 95, 91, 78, 69, 19, 42, 
67, 77, 2, 41, 32, 11, 94, 40, 59, 17, 57, 99, 44, 
5, 93, 62, 23, 3, 33, 47, 92]

test_data = [49, 66, 7, 58, 37, 98, 100, 24, 6, 55, 
28, 16, 85, 65, 51, 35, 12, 10, 86, 29]

结论

将数据分成学习集和验证集是机器学习和数据科学项目中的重要一步。虽然sklearn提供了一个简单的方法来执行此任务,但是理解如何手动完成此任务是至关重要的。如我们所示,可以使用Python的内置操作或numpy库来实现这一目标。

选择使用sklearn、Python的内置操作或numpy取决于您的具体要求和限制。每种方法都有其优点和缺点。手动方法能够更好地控制过程,而sklearn的train_test_split()方法更简单易用,并且包含了额外的属性,例如分层抽样。



Python 精选笔记
如何在Python中返回一个函数?如何在Python中安装matplotlib?Python - 分割包含散乱字符的字符串Python - 记录列表XORPython – 向记录的末尾添加数据Python - 键值大于K的记录在Python中垂直打印列表Python - 列表中字符串平均长度Python列表中的交替循环Python程序实现混淆词游戏Python-记录联合Python程序计算列表中元组的重复项Python程序:将字符串的字符转换为相反的大小写Python - 打印给定年份列表中的闰年数量Python - 打印所有子列表中的共同元素Python - 删除嵌套列表中的所有元素如何在Python列表中检查空格?在Python中引发异常到另一个异常Python字符串中的范围复制Python程序计算包含列表的列表中列表的数量修改给定Python列表中的重复值Python - 检查元素是否在指定范围内出现从Python的元组列表中删除所有字符串如何使用Pygame添加颜色呼吸效果?如何在Bokeh中添加颜色条如何在Bokeh中添加颜色选择器?使用Python程序显示带有星边框的数字半菱形图案Python使用ipaddress模块确定给定的IPv4地址是否为保留地址使用ipaddress模块的Python程序来确定给定的IP地址是公网还是私网Python程序通过平方和连接给定数字的奇数位数来创建一个OTPPython程序创建以零为中心的列表Python程序计算字符串中的字符数Python程序将米转换为码,反之亦然Python程序:统计文本文件中的元音、行数和字符数Python程序计算文本文件中的单词数量Python程序,用于计算文本文件中空格的数量将字典的值转换为字符串的Python程序Python程序将浮点数转换为指数Python程序将整数转换为指数Python程序将整数转换为罗马数字将整数列表转换为字符串列表的Python程序Python程序将XML转换为字典Python程序:通过重复键对应的值次数将字典转换为列表将Dict of list转换为CSV的Python程序使用正则表达式统计Python程序中大写字母、小写字母、特殊字符和数字值的个数Python元组的并集Python - 嵌套和混合列表中的类型转换Python - 将列表转换为单值列表的元组如何在Python中打印上标和下标?如何在Python中打印多个参数?如何在Plotly-Python中将图例定位在图表内部?如何使用Pandas绘制时序图表?如何使用SciPy在Python中绘制Ricker曲线?如何在Python列表中删除True值?如何使用Python将字典的值转换为绝对值?如何使用Python将字典转换为K个大小的字典?如何使用Python将浮点数舍入到2位小数?如何在Python中将Excel转换为CSV如何在Python中对元组进行索引和切片?如何在Python中判断一个对象是否有属性?在Python中创建实例对象如何使用Python获取城市的经纬度?如何在Python中获取整数输入?如何交换给定 NumPy 数组的列?如何使用NumPy抑制对小数的科学计数法使用?如何使用Python将XML数据存储到MySQL数据库中?如何在Pandas DataFrame中减去两列?如何在Pandas DataFrame中标准化数据?如何堆叠多个Pandas DataFrames?如何使用scikit-learn的train_test_split()函数拆分数据集如何在Python中分割数据以进行训练和测试,而不使用Sklearn在Python set中找到最大值和最小值Python程序:找到长方体的体积、表面积和空间对角线如何在Python程序中获取字符串的K个可能切片如何使用Altair在Python中制作密度图?生成一次性密码(OTP)的Python程序Python程序:找出数组中可被给定数整除的元素的XOR寻找巨大最大公约数(Jumbo GCD)子数组的Python程序如何在OpenCV Python中查找图像轮廓的边界矩形?如何在Python脚本所在的目录中打开文件?如何在Anaconda中安装Python包?如何在OpenCV Python中旋转图像?如何给定完整路径导入Python模块?如何在Python中从另一个函数调用变量?使用Python的Matplotlib在X轴上绘制日期如何在Python中不使用math模块进行平方根运算?如何在Python Tkinter中给Frame添加边框?如何从Python函数返回一个字典?Python程序获取元组中的第一个和最后一个元素如何求一个Python字典的值的总和?Python Pandas - 查找列的最大值并返回其对应的行值机器人流程自动化 - 简介机器学习中的逻辑回归损失函数如何从Python日期中减去一天?将物联网和机器学习相结合,使我们的未来更智能机器学习中的Boosting | Boosting和AdaBoost如何在Python中将时间戳字符串转换为datetime对象?如何在Python中将变量名转换为字符串?什么是Python中的.pyc文件?Python - 检查列表中的所有元素是否相同如何在Python Plotly中设置Y轴的范围?如何将Python日期转换为Unix时间戳?Python中的Turtle绘图编程如何在Python中的给定位置插入一个对象到列表中?如何在Python中进行日期验证?如何使用Python将两个图并排显示?在Python中的方法和函数之间的区别Python中的PYTHONPATH环境变量是什么?如何对Python日期字符串列表进行排序?在Python的Pandas中向现有的DataFrame中添加新列如何将Python元组转换为字典?Python - 使用Pandas读取没有标题的csv文件?如何使用OpenCV Python在图像中检测矩形和正方形?如何使用OpenCV在Python中改变图像的对比度和亮度?如何在Python中将日期时间转换为UTC时间戳?如何列出Python模块中的所有函数?Python程序查找字符串中的所有重复字符使用Python进行文件搜索如何在Python Tkinter中更改按钮大小?如何在Python shell中了解/更改当前目录?如何在Python中检查一个字符是否为大写字母?如何在OpenCV Python中对图像进行归一化?在Python中更新列表如何在Python中生成不重复的随机数?Python中元素的频率列表在Python中for循环和while循环的区别如何在Python的Plotly中绘制多条线在同一Y轴上?如何从Python列表中删除一个对象?如何在Python中使用Matplotlib和Pandas绘制CSV数据?如何在Python中安装OpenCV?Python3程序,用于找到具有相同左右旋转的数字的最长子序列如何在Python字符串中检查空格?Python - 替代前后和Python - 检查浮点字符串Python3程序——在二进制字符串的任意旋转中找到连续放置在开头和结尾的0的最大数量Python中的Blackman窗Python3程序,用于在恒定时间内查询给定字符串的旋转和第K个字符如何在Python列表中添加后缀/前缀?Python – 按元组键聚合值Python - 检查降序排序的列表如何在Python中多次附加K个字符