经过特征选择后的特征分类,knn分类器,svm分类器,NB分类器

it2026-10-08  1

代码记录

经过特征选择之后选出的特征,x矩阵是一个二进制矩阵,值为1表示选中该特征,值为0表示未选中。

将选择的特征提取出来之后,通过训练集和测试集对所选特征进行一个评估(所用分类器knn、svm、NB)。

#验证集预测值 def get_Pre(x): # x 为m*n的一个二进制矩阵数据,行为样本,列为特征 d_1 = sum(x == 1) #print("选择特征数:",d_1) # 从特征向量x中提取出相应的特征 Feature = np.zeros(d_1) # 数组Feature用来存 x选择的是哪d个特征 k = 0 for i in range(M): if x[i] == 1: Feature[k] = i # 选中的索引值 k += 1 #训练数据 select_feature_train = np.zeros((train_num, 1)) #train_num为训练集中样本个数 for i in range(d_1): p = Feature[i] p = p.astype(int) q = X_train[:, p] # 取出所有样本的第p列(也就是选出那个特征列) q = q.reshape(train_num, 1) select_feature_train = np.append(select_feature_train, q, axis=1) select_feature_train = np.delete(select_feature_train, 0, axis=1) # 删除第0列,因为定义时全为0 #测试集数据 select_feature = np.zeros((test_num, 1)) #test_num为验证集中样本个数 for i in range(d_1): p = Feature[i] p = p.astype(int) q = X_test[:, p] # 取出所有样本的第p列(也就是选出那个特征列) q = q.reshape(test_num, 1) select_feature = np.append(select_feature, q, axis=1) select_feature = np.delete(select_feature, 0, axis=1) # 删除第0列,因为定义时全为0 # 分类器 knn = KNeighborsClassifier(n_neighbors=7) #svm = SVC(kernel='linear', C=3, gamma=5,probability=True) #nb = GaussianNB() knn.fit(select_feature_train, y_train)#训练,将训练数据传入 y_pred = sclf.predict(select_feature) return y_pred #根据真实值和预测值计算评价指标 def meric(predictArr): #传入参数为上个函数的返回值,也就是经过分类器之后的预测数组 #labelArr[i]真实的类别,predictArr[i]预测的类别 labelArr = y_test #y_test为真实类别数组 TP = 0.; TN = 0.; FP = 0.; FN = 0. for i in range(len(labelArr)): if labelArr[i] == 1 and predictArr[i] == 1: TP += 1. if labelArr[i] == 1 and predictArr[i] == 0: FN += 1. if labelArr[i] == 0 and predictArr[i] == 1: FP += 1. if labelArr[i] == 0 and predictArr[i] == 0: TN += 1. if (TP + FN)==0: SN=0 else: SN = TP/(TP + FN) #Sensitivity = TP/P and P = TP + FN if (FP+TN)==0: SP=0 else: SP = TN/(FP + TN) #Specificity = TN/N and N = TN + FP if (TP+FP)==0: precision=0 else: precision=TP/(TP+FP) if (TP+FN)==0: recall=0 else: recall=TP/(TP+FN) GM=math.sqrt(recall*SP) #G-mean ACC = (TP + TN) / (TP + TN + FP + FN) MCC = (TP * TN - FP * FN) / math.sqrt((TP + FP) * (TP + FN) * (TN + FP) * (TN + FN)) return ACC

 

最新回复(0)