此帖是一个自我纠查帖,感觉基本不会有其他人踩相同的坑。
背景:在MI分类中使用FBCSP+SVM,基于这个方法写了两个分类的.py文件实现,在数据划分上大差不差(都是CV5),但是结果却相差很多
方法一:先使用FBCSP进行预处理存成xy文件,再导入xy文件进行cv5网格搜索
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
# 导入预处理好的xy数据
X = np.load('./data_processed/tx_data/fbcsp/3_class/subject_dependent/XS001_fold001.npy')
y = np.load('./data_processed/tx_data/fbcsp/3_class/subject_dependent/yS001_fold001.npy')
# 网格搜索
kernel_list = np.array(['rbf', 'sigmoid', 'linear'])
C_list = np.array([0.001, 0.1, 1, 2.5, 5, 10, 20, 50, 100])
gamma_list = np.array([1e-11, 1e-10, 1e-9, 1e-8, 1e-07, 1e-06, 1e-05, 0.001, 0.01, 0.1, 1])
parameters = {
'kernel': kernel_list,
'gamma': gamma_list,
'C': C_list
}
print("svc__gamma参数取值:"+str(gamma_list))
print("svc__C参数取值:"+str(C_list))
print("网格搜索结果:")
gs = GridSearchCV(estimator=SVC(), param_grid=parameters, cv=5, scoring='accuracy')
gs.fit(X, y)
结果大概是68%
方法二:先划分train set和test set;再从train set中划分出val set;最后将五折train、test、val set全都保存待训练(这里的代码不全,只是表达大概意思)
for s in range(n_subjs):
# 先划分train set和test set
X_train_all, X_test_all, y_train_all, y_test_all = train_test_split(X, y, test_size=0.2, random_state=42)
# Carry out subject-dependent setting with 5-fold cross validation
for person, (X_tr, y_tr, X_te, y_te) in enumerate(zip(X_train, y_train, X_test, y_test)):
skf = StratifiedKFold(n_splits=n_folds, random_state=42, shuffle=True)
# 再从train set中划分出val_set
for fold, (train_index, val_index) in enumerate(skf.split(X_tr, y_tr)):
print('FOLD:', fold + 1, 'TRAIN:', len(train_index), 'VALIDATION:', len(val_index))
X_tr_cv, X_val_cv = X_tr[train_index], X_tr[val_index]
y_tr_cv, y_val_cv = y_tr[train_index], y_tr[val_index]
# 把train、test、val set都保存 训练时直接按fold导入
__save_data_with_valset(save_path, SAVE_NAME, X_tr_fbcsp, y_tr_cv, X_val_fbcsp, y_val_cv, X_te_fbcsp, y_te)
print('The preprocessing of subject {} from fold {} is DONE!!!'.format(person + 1, fold + 1))
结果大概是50%
后记:最开始一直想不通,两种方法都是五折交叉验证,为什么第二种准确率稳定得低于第一种,还一直在想是不是分类时候代码有问题,后来导师让我把第二种保存好的数据直接导入代码一,看下结果,结果当然还是不好。但这也为我最终发现问题所在提供了新的思路,第二种方法训练集数据变少了啊!!!
归结起来就是下面1和2的差别:
参考在机器学习中,验证集和测试集有什么区别? - 知乎 (zhihu.com)
传统机器学习中,可以不划分验证集么。数据量少的时候,不用验证集是不是效果更好?