实验要求
数据中总共有664条数据,每条数据分别是多个症状对应一个症候,本质上是一个简单的二分类问题,即根据症状分类是否属于瘀血阻络证。
具体要求:
(1)全部数据作为训练集:得出相应的分类指标准确率accuracy,精确率precision,召回率recall,F1-score,并画出最终的ROC曲线,得出AUC值。
(2)把数据集分为训练集、验证集和测试集,再进行分类,并得出准确率等。
(3)运用5-fold Cross-validation方法进行验证,与前两种方法对比。
数据展示
症状(部分):
症候(标黄):
代码
导包
from sklearn import preprocessing
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split, cross_val_score, cross_val_predict, KFold
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score, roc_curve
import pandas as pd
import random
import numpy as np
import math
import time
import matplotlib.pyplot as plt
import warnings
from tqdm import tqdm
import pickle # 保存模型
定义函数
def standardization(np_array):
""" 离差标准化,(Xi-min(X))/(max(X)-min(X)) """
min_max_scaler = preprocessing.MinMaxScaler()
ret = min_max_scaler.fit_transform(np_array)
return ret
def make_matrix(m, n, fill=0.0):
a = []
for i in range(m):
a.append([fill] * n)
return a
def rand(min, max):
"""生成区间[min,max]内的随机数"""
return (max - min) * random.random() + min
def sigmoid(x):
"""激活函数"""
return 1.0 / (1.0 + math.exp(-x))
def derived_sigmoid(x):
"""激活函数的导数"""
return x * (1 - x)
定义BP神经网络框架
class BP:
"""
反向传播类
"""
def __init__(self, input_n, hidden_n, output_n):
self.input_n = input_n # 初始化结点数
self.hidden_n = hidden_n
self.output_n = output_n
self.input_values = [1.0] * self.input_n # 输入层神经元输出
self.hidden_values = [1.0] * self.hidden_n # 中间层神经元输出
self.output_values = [1.0] * self.output_n # 隐藏层神经元输出
self.input_weights = make_matrix(self.input_n, self.hidden_n) # 权重
self.output_weights = make_matrix(self.hidden_n, self.output_n)
self.input_correction = [] # 权重修正
self.output_correction = []
self.input_bias = [] # 偏置
self.output_bias = []
# 权重矩阵赋初值
for i in range(self.input_n):
for j in range(self.hidden_n):
self.