机器学习——KNN数据集划分

一、主要函数

sklearn.datasets.my_train_test_split()

该函数为Scikit-learn 中用于将数据集划分为训练集和测试集的函数,适用于机器学习模型的训练和验证。以下是详细解释:


​1、函数签名

python 复制代码
train_test_split(
    *arrays,                  # 输入的数据集(可以是多个数组,如 X, y)
    test_size=None,           # 测试集的比例或样本数
    train_size=None,          # 训练集的比例或样本数
    random_state=None,        # 随机种子(确保结果可复现)
    shuffle=True,             # 是否打乱数据顺序
    stratify=None             # 是否分层抽样(保持类别比例)
)
复制代码
返回值:
  • 分割后的数据集,例如 X_train, X_test, y_train, y_test(顺序与输入一致)。

​2、参数详解

1. ​***arrays**​(必填)
  • 输入的数据集,可以是多个数组(如特征矩阵 X 和标签 y),支持同时拆分多个数据集。
  • 例如:X_train, X_test, y_train, y_test = train_test_split(X, y)
2. ​**test_size**​(默认 None
  • 浮点数 :表示测试集占总数据的比例(如 test_size=0.2 表示 20% 作为测试集)。
  • 整数 :表示测试集的绝对样本数(如 test_size=100)。
  • 如果 test_sizetrain_size 均为 None,默认 test_size=0.25
3. ​**train_size**​(默认 None
  • 类似 test_size,但指定训练集的比例或样本数。
  • 通常只需指定 test_sizetrain_size 中的一个。
4. ​**random_state**​(默认 None
  • 随机种子,保证每次分割结果一致。
  • 例如:random_state=42 使结果可复现。
5. ​**shuffle**​(默认 True
  • 是否在分割前打乱数据顺序。
  • 时间序列数据 需设置为 shuffle=False,避免破坏时间依赖性。
6. ​**stratify**​(默认 None
  • 指定分层抽样的参考标签,保持训练集和测试集的类别分布与原始数据一致。
  • 适用于分类任务中类别不平衡的数据。
  • 例如:stratify=y 会根据 y 的类别比例分割数据。

二、手动实现数据集划分

1.按比例计算

python 复制代码
import numpy as np
import matplotlib.pyplot as plt #绘图模块
from sklearn.datasets import make_blobs  #聚类划分模块

#300样本,2个标签,3个聚类
x, y = make_blobs(
    n_samples = 300,
    n_features = 2,
    centers = 3,
    cluster_std = 1,
    center_box = (-10, 10),
    random_state = 233,
    return_centers = False
)

#打印显示
plt.scatter(x[:,0], x[:,1], c = y,s = 15)
plt.show()

#设置随机种子,将x打乱,并返回索引值
np.random.seed(233)
shuffle = np.random.permutation(len(x))

#设置划分比例
train_size=0.7  
test_size =0.3

#得到对应比例的数据索引
train_index = shuffle[:int(len(x) * train_size)]
test_index = shuffle[int(len(x) * train_size):]

#得到数据集
x[train_index].shape, y[train_index].shape #结果:((210, 2), (210,))
x[test_index].shape, y[test_index].shape  #结果:((90, 2), (90,))

2、上述过程封装

python 复制代码
import numpy as np
from matplotlib import pyplot as plt

#函数封装
def my_train_test_split(x, y, train_size = 0.7, random_state = None):
    if random_state:
        np.random.seed(random_state)
    shuffle = np.random.permutation(len(x))
    train_index = shuffle[:int(len(x) * train_size)]
    test_index = shuffle[int(len(x) * train_size):]
    return x[train_index], x[test_index], y[train_index], y[test_index]

#调用
x_train, x_test, y_train, y_test = my_train_test_split(x, y, train_size = 0.7, random_state = 233)
x_train.shape, x_test.shape, y_train.shape, y_test.shape #结果:((210, 2), (90, 2), (210,), (90,))

#显示结果(训练集)
plt.scatter(x_train[:, 0], x_train[:, 1], c = y_train, s = 15)
plt.show()
#显示结果(测试集)
plt.scatter(x_test[:, 0], x_test[:, 1], c = y_test, s = 15)
plt.show()

三、KNN方法实现数据集快速划分

python 复制代码
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_blobs

#制作数据集
x, y = make_blobs(
    n_samples = 300,
    n_features = 2,
    centers = 3,
    cluster_std = 1,
    center_box = (-10, 10),
    random_state = 233,
    return_centers = False
)


#调用
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size = 0.7, random_state = 233)

#显示形状
x_train.shape, x_test.shape, y_train.shape, y_test.shape #结果:((210, 2), (90, 2), (210,), (90,))

#统计y_test标签
from collections import Counter
Counter(y_test) #结果:Counter({2: 34, 0: 25, 1: 31}),发现标签并不均匀

#加stratify = y限制,使其划分和标签类型一样
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size = 0.7, random_state = 233, stratify = y) 
print(Counter(y_test))  # 结果:Counter({2: 30, 0: 30, 1: 30})
print(Counter(y_train)) # 结果:Counter({0: 70, 2: 70, 1: 70})
相关推荐
极小狐6 分钟前
如何构建容器镜像并将其推送到极狐GitLab容器镜像库?
开发语言·数据库·机器学习·gitlab·ruby
猎板PCB黄浩9 分钟前
AI优化高频PCB信号完整性:猎板PCB的技术突破与应用实践
人工智能
Icoolkj15 分钟前
可灵 AI:开启 AI 视频创作新时代
人工智能·音视频
RK_Dangerous32 分钟前
【深度学习】计算机视觉(18)——从应用到设计
人工智能·深度学习·计算机视觉
正在走向自律40 分钟前
从0到1:Python机器学习实战全攻略(8/10)
开发语言·python·机器学习
AI大模型顾潇1 小时前
[特殊字符] 本地部署DeepSeek大模型:安全加固与企业级集成方案
数据库·人工智能·安全·大模型·llm·微调·llama
_Itachi__1 小时前
深入理解目标检测中的关键指标及其计算方法
人工智能·目标检测·目标跟踪
Stara05111 小时前
基于注意力机制与iRMB模块的YOLOv11改进模型—高效轻量目标检测新范式
人工智能·python·深度学习·神经网络·目标检测·计算机视觉·yolov11
X Y O1 小时前
神经网络初步学习——感知机
人工智能·神经网络·学习·感知机
知来者逆2 小时前
计算机视觉——MedSAM2医学影像一键实现3D与视频分割的高效解决方案
人工智能·深度学习·计算机视觉·图像分割·智能医疗·万物分割