我想将我的数据集拆分为训练集和测试集。然而,我不希望使用常规的百分比拆分方式,而是希望例如将“subject01.dat”设为测试数据,而将其他对象设为训练数据。我该如何实现这一点?
如果这有关系的话,数据集是一个时间序列的3D数据。但在我的预处理之后,它变成了一个2D的numpy数组。
我考虑使用sklearn.test_train_split
,但我要设置哪些选项才能确保“subject01.dat”保持为测试数据集呢?
import pandas as pdimport tensorflow as tfimport numpy as npfrom sklearn.model_selection import train_test_splitdir = '/home/hanna/Documents/_DDA_Lab/Exercise6/PAMAP2_Dataset/Protocol/'filelist = ['subject101.dat','subject102.dat','subject103.dat','subject104.dat','subject105.dat','subject106.dat','subject107.dat']# 所需的列columns = [1,2,4,5,6,7,8,9,10,11,12,13,14,15,20,21,22,23,24,25,26,27,28,29,30,31,32,37,38,39,40,41,42,43,44,45,46,47,48,49]# 所需的行ID_rows = [3,4,12,13]for file in filelist: input = dir + file df = pd.read_csv(input, header=None, delim_whitespace=True) print('已完成读取数据文件 ', input) df = df[columns] # 只保留所需的列并删除其余列 df = df[df[1].isin(ID_rows)] # 只保留所需的行并删除其余行 df=df.fillna(0) # 用零替换NaN df = (df - df.mean()) / df.std() # 归一化数据 data.append(df)df = pd.concat(data) # 合并为一个数据框print(df.shape)# 将数据框转换为张量x_data = df.drop(1, axis=1).valuesy_data = df[[1]].values# 训练/测试拆分xTrain, xTest, yTrain, yTest = train_test_split(x_data, y_data, test_size=0.15, random_state=0)
回答:
我不确定我是否完全理解了你的意思,但我认为你可以为你希望包含在训练集中的每个文件创建一个单独的数据框,并为你的测试集文件创建一个单独的数据框。
例如,假设subject101.dat将成为你的测试集:
filelist_test = ['subject101.dat']filelist_train = ['subject102.dat','subject103.dat','subject104.dat','subject105.dat','subject106.dat','subject107.dat']for train_file in filelist_train: # 执行相同的操作train_df = pd.concat(data)for test_file in filelist_test: # 执行相同的操作test_df = pd.concat(data)
之后,你可以删除你想要的标签列,并像之前一样进行操作。希望这对你有帮助。