python基于sklearn的SVM和留⼀法(LOOCV)进⾏⼆分类
基于sklearn的SVM和留⼀法(LOOCV)进⾏⼆分类
需要的导⼊包
import numpy as np
del_selection import LeaveOneOut
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
import scipy.io as scio  # ⽤于读取matlab格式的数据
import copy
数据准备
⾸先导⼊两组数据的特征(每⼀个对象有n个特征可以是⼀维或多维的特征),⽐如正常⼈组(m1个)
和病⼈组(m2个),将两组⼈的特征并到⼀起。之后为两组⼈⽣成label,⽐如正常⼈的label为-1,病⼈组的label为1。数据整理完成后得到的数据集dataset为
(m1+m2)*n的⼀个特征矩阵,得到的dataset_label为(m1 + m2)*1的label向量。
# 将导⼊的数据data1 data2合并为dataset,并产⽣⼀⼀对应的label为datalabels
dataset =(np.hstack((train_data1, train_data2))).T
data1_label =list(-1for i in range(np.size(train_data1,1)))
data2_label =list(1for i in range(np.size(train_data2,1)))
datalabels = data1_label + data2_label
留⼀法交叉验证(LOOCV)
>>>>>###SVM+LOOVC>>>#
loo = LeaveOneOut()
<_n_splits(dataset)
predictlabel_list =[]
reallabel_list =[]
scaler = StandardScaler()
dataset = scaler.fit_transform(dataset)
clf = SVC(C=1, kernel='linear', gamma='auto')
count_right_label =0
count =0# 循环次数
# ⽤留⼀法进⾏验证
for train_index, test_index in loo.split(dataset):
X_train, X_test = dataset[train_index], dataset[test_index]
Y_train, Y_test = np.array(datalabels)[train_index], np.array(datalabels)[test_index]
clf.fit(X_train, Y_train)
predictlabel_list.append(list(clf.predict(X_test)))
reallabel_list.append(list(Y_test))
if Y_test == clf.predict(X_test):
count_right_label +=1
count +=1
print('第{}次循环'.format(count))
accurancy = count_right_label /len(datalabels)
print('******循环结束!************')
print('准确率为:%.2f%%'%(accurancy *100))
print('******运⾏结束!************')
运⾏结束后可以得到 predictlabel_list ,reallabel_list,分别存放真实的label和预测的label,可⽤于后续的指标分析 。
计算F1_SCORE,ACC(准确率),SEN(敏感度),SPE(特异性)
在得到真正的label和预测的label之后调⽤⾃⼰的函数get_TpTN_FpFn得到TP、TN、FP、FN之后计算上述指标,后⾯会给出功能函数的说明
TP_count, TN_count, FP_count, FN_count = get_TpTN_FpFn(reallabel_list, predictlabel_list)
F1_score =(2* TP_count)/(2* TP_count + FP_count + FN_count)
ACC =(TP_count + TN_count)/(TP_count + FN_count + TN_count + FP_count)
SEN = TP_count /(TP_count + FN_count)
SPE = TN_count /(TN_count + FP_count)
ACC:分类准确率
ACC = (TP +TN)/(TP+TN+FP+FN)
敏感性(sensitivity)
SEN = TP/TP+FN
特异度(specificity)
SPE = TN/TP+FP
F1分数
F1 = 2TP/(2TP + FN +FP)
计算TP,TN,FP,FN 辅助函数说明
此函数的输⼊list1为真实的label列表,list2为预测输出的label
# 获取⼀个预测结果的TP TN FP FN
def get_TpTN_FpFn(list1, list2):
# list1 为真实的label list2 为预测的label
reallabel_list =list(flatten(list1))
predictlabel_list =list(flatten(list2))
TP_count =0
TN_count =0
FP_count =0
FN_count =0
for i in range(len(reallabel_list)):
if reallabel_list[i]==1and predictlabel_list[i]==1:
TP_count +=1
if reallabel_list[i]==-1and predictlabel_list[i]==-1:
TN_count +=1
if reallabel_list[i]==-1and predictlabel_list[i]==1:
FP_count +=1
if reallabel_list[i]==1and predictlabel_list[i]==-1:
FN_count +=1
return TP_count, TN_count, FP_count, FN_count
辅助函数2
# 将⼀个任意嵌套的列表整理为⼀个列表
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
在我的另外⼀篇博⽂有说明上⾯函数的作⽤
后续说明
这篇⽂章主要说给⼤家分享⼀下怎么使⽤,⼀篇⼯具性的博⽂,我平时也是主要当作⼯具类,没有很深⼊分析参数的选取,每种计算指标的意义什么的,欢迎⼤家留⾔讨论,有问题指出,欢迎批评指正。
后⾯计划将在此基础上写⼀篇的⽂章,以及对svm进⾏permutation验证求出分类的P值,也就是显著性。
完整代码
import numpy as np
del_selection import LeaveOneOut
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.svm import SVC
import scipy.io as scio
>>>####功能性函数>>>>>>>>>>#
# 将⼀个任意嵌套的列表整理为⼀个列表
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
# 获取⼀个预测结果的TP TN FP FN
def get_TpTN_FpFn(list1, list2):
# list1 为真实的label list2 为预测的label
reallabel_list =list(flatten(list1))
predictlabel_list =list(flatten(list2))
TP_count =0
TN_count =0
FP_count =0
FN_count =0
for i in range(len(reallabel_list)):
if reallabel_list[i]==1and predictlabel_list[i]==1:
TP_count +=1
if reallabel_list[i]==-1and predictlabel_list[i]==-1:
TN_count +=1
if reallabel_list[i]==-1and predictlabel_list[i]==1:
FP_count +=1
if reallabel_list[i]==1and predictlabel_list[i]==-1:
FN_count +=1
return TP_count, TN_count, FP_count, FN_count
if __name__ =='__main__':
# >>>## 数据的读取与整理了>>>>>>>>>
path2 ='C:\\Users\\Administer\\Desktop\\classer\\dataset'
MSN_HC = scio.loadmat(path2 +'\\HC_coupling_str_fun_20201022.mat')
train_data1= MSN_HC['all_coupling'].T
MSN_GTCS = scio.loadmat(path2 +'\\GTCS_coupling_str_fun.mat')
train_data2= MSN_GTCS['all_coupling'].T
python怎么读的# 以上代码按照⾃⼰的数据要求输⼊,可以⾃⼰删除。
dataset =(np.hstack((train_data1, train_data2))).T
data1_label =list(-1for i in range(np.size(train_data1,1)))
data2_label =list(1for i in range(np.size(train_data2,1)))
datalabels = data1_label + data2_label
>>>>>>>##LOOVC>>>>>>>##    loo = LeaveOneOut()
<_n_splits(dataset)
predictlabel_list =[]
reallabel_list =[]
scaler = StandardScaler()
dataset = scaler.fit_transform(dataset)
clf = SVC(C=1, kernel='linear', gamma='auto')
count_right_label =0
count =0# 循环次数
# ⽤留⼀法进⾏验证
for train_index, test_index in loo.split(dataset):
X_train, X_test = dataset[train_index], dataset[test_index]
Y_train, Y_test = np.array(datalabels)[train_index], np.array(datalabels)[test_index]
clf.fit(X_train, Y_train)
clf.fit(X_train, Y_train)
predictlabel_list.append(list(clf.predict(X_test)))
reallabel_list.append(list(Y_test))
if Y_test == clf.predict(X_test):
count_right_label +=1
count +=1
print('第{}次循环'.format(count))
accurancy = count_right_label /len(datalabels)
print('******循环结束!************')
print('准确率为:%.2f%%'%(accurancy *100))
print('******运⾏结束!************')
TP_count, TN_count, FP_count, FN_count = get_TpTN_FpFn(reallabel_list, predictlabel_list)    F1_score =(2* TP_count)/(2* TP_count + FP_count + FN_count)
ACC =(TP_count + TN_count)/(TP_count + FN_count + TN_count + FP_count)
SEN = TP_count /(TP_count + FN_count)
SPE = TN_count /(TN_count + FP_count)
print('F1_SCORE为:%.2f%%'%(F1_score *100))
print('ACC(准确率)为:%.2f%%'%(ACC *100))
print('SEN(敏感度)为:%.2f%%'%(SEN *100))
print('SPE(特异性)为:%.2f%%'%(SPE *100))

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论