【SVM】不同数据划分方式导致结果不同...

此帖是一个自我纠查帖,感觉基本不会有其他人踩相同的坑。

背景:在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)

传统机器学习中,可以不划分验证集么。数据量少的时候,不用验证集是不是效果更好?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值