如何将similarity变量的字典数据按7:3拆分为训练集与测试集
余弦相似度数据7:3拆分训练集/测试集方案
问题说明
原代码直接将全量similarity数据同时赋值给训练集、测试集,造成训练测试数据完全重叠的数据泄露问题,最终得到虚高的100%准确率。需要按7:3比例无重叠拆分数据,70%作为训练集,30%作为测试集。
方案1:纯Numpy手动拆分(无额外依赖)
拆分前先打乱数据避免原数据排序规律带来的分布偏差,固定随机种子可保证拆分结果可复现:
import numpy as np from numpy.linalg import norm # 原始数据转numpy数组 data_arr = np.array(similarity) # 固定随机种子,数值可自定义,去掉该行则每次拆分结果随机 np.random.seed(42) # 打乱全量数据顺序 np.random.shuffle(data_arr) # 计算70%占比的拆分索引 split_position = int(len(data_arr) * 0.7) # 拆分训练集、测试集 train_r = data_arr[:split_position] test_r = data_arr[split_position:] # 原有计算逻辑保持不变 train_c = train_r[:,10] test_c = test_r[:,10] a = train_c b = test_c cos_sim = (np.dot(a, b)/(norm(a)*norm(b))) * 100 print(cos_sim)
方案2:Scikit-learn内置拆分方法(工业界常用)
如果已经安装scikit-learn(未安装可执行pip install scikit-learn安装),可直接用内置的train_test_split方法,支持分层拆分、多输出对齐等更灵活的配置:
import numpy as np from numpy.linalg import norm from sklearn.model_selection import train_test_split data_arr = np.array(similarity) # 按30%比例拆分测试集,固定随机种子保证可复现 train_r, test_r = train_test_split( data_arr, test_size=0.3, random_state=42, shuffle=True ) # 原有计算逻辑保持不变 train_c = train_r[:,10] test_c = test_r[:,10] a = train_c b = test_c cos_sim = (np.dot(a, b)/(norm(a)*norm(b))) * 100 print(cos_sim)
注意事项
- 若不需要拆分结果可复现,可删除随机种子相关参数,每次运行会得到不同的随机拆分结果
- 所有数据预处理操作(如归一化、标准化)必须在拆分完成后,仅基于训练集数据计算参数,再应用到测试集,避免引入数据泄露
- 转numpy数组前需确认
similarity中所有数据条目维度一致,否则会触发维度不匹配报错
内容的提问来源于stack exchange,提问作者luke
相关产品推荐
相关产品推荐

