sklearn.model_selection.ShuffleSplit类用于将样本集合随机“打散”后划分为训练集、测试集(可理解为验证集,下同),类申明如下:
官方文档使用说明
class sklearn.model_selection.ShuffleSplit(n_splits=10, test_size=None, train_size=None, random_state=None)[source]¶
n_splits :产生的随机抽样组数
test_size :测试集比例或样本数量,该值为[0.0, 1.0]内的浮点数时,表示测试集占总样本的比例;该值为整型值时,表示具体的测试集样本数量;train_size不设定具体数值时,该值取默认值0.1,train_size设定具体数值时,test_size取剩余部分
train_size : 训练集比例或样本数量,该值为[0.0, 1.0]内的浮点数时,表示训练集占总样本的比例;该值为整型值时,表示具体的训练集样本数量;该值为None(默认值)时,训练集取总体样本除去测试集的部分
random_state :随机数种子
着重介绍类的成员函数split()的问题
代码如下:
cv = ShuffleSplit(10, test_size=0.2, random_state=42) #生成十折,测试样本为20%的对象
cv_split = cv.split(epochs_data_train) #按照cv的结果生成训练数据和测试数据索引
for train_idx, test_idx in cv_split:
y_train, y_test = labels[train_idx], labels[test_idx]
X_train = csp.fit_transform(epochs_data_train[train_idx], y_train)
# fit classifier
lda.fit(X_train, y_train)
这里使用ShuffleSplit产生了训练样本和测试样本的索引,并用for与split的结合训练了分类器。
神奇的地方出现了
这是for循环之前的cv_split
这是for循环之后的cv_split
经过多次试验发现,只要遍历之后,cv_split就会自动清空,像是内存回收机制。这个问题困扰了我好几个小时,没想到是这个对象的特性导致的bug