神经网络模型是一种模拟人类神经系统的数学模型,广泛应用于人工智能、机器学习和深度学习领域。神经网络由大量的简单处理单元(称为神经元)广泛连接而成,反映了人脑的基本功能特征。神经网络具有自学习、自适应和并行处理的能力,特别适合处理复杂和不精确的信息。
神经网络通常由三个主要部分组成:输入层、隐藏层和输出层。每个神经元通过加权连接与其他神经元相连,每个连接都有一个权重,这些权重在训练过程中通过学习算法进行调整。此外,每个神经元还有一个偏置项,用于避免输出为零的情况。
前馈神经网络:信息从输入层向前传播,经过隐藏层,最终到达输出层,没有反馈连接。常见的前馈神经网络包括卷积神经网络(CNN)、全连接神经网络(FCN)和生成对抗网络(GAN)等。
反馈神经网络:神经元不仅可以接收其他神经元的信号,还可以接收自己的反馈信号,具有记忆功能。常见的反馈神经网络包括循环神经网络(RNN)、长短期记忆网络(LSTM)等。
神经网络在多个领域都有广泛应用,包括:
系统辨识:用于识别系统的动态特性。
模式识别:如图像和语音识别。
智能控制:用于自适应控制系统。
组合优化、金融预测与管理、通信、机器人技术和专家系统等领域。
我们仍以Excel示例数据为例,初步展示一下神经网络模型的初步做法,我们先用Rstudio打开示例数据。
R语言中的train函数位于caret包中。caret包是一个用于构建、训练和评估机器学习模型的R包,提供了丰富的功能来帮助用户进行模型训练和参数调优。train函数是caret包的核心功能之一,用于训练模型,支持多种算法和模型类型。我们先用train函数拟合神经网络模型。
set.seed(1234)
nn.model <- train(
结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,data = Train,
method="nnet",
preProcess=c(center", "scale),
trControl=trainControl(method="cv", number=10, classProbs=T),
tuneGrid=expand.grid(size = c(1, 5, 10), decay = c(0, 0.1, 0.01)))
print(nn.model)
plot(nn.model)
neuralnet包
#加载neuralnet包
install.packages("neuralnet") #安装包
# 加载Rattle图形库
install.packages("RGtk2")
install.packages("rattle")
library(neuralnet)
library(rattle)
rattle_gui()
#拟合并可视化神经网络模型
nnfit <- neuralnet(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,data = Train, hidden = 10, threshold = 0.01)
print(nnfit)
plot(nnfit)
summary(nnfit)
#安装并加载nnet包
install.packages("nnet")
library(nnet)
#使用nnet包拟合神经网络模型
nnmodel <- nnet(结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,data = Train,
size = 10, decay = 0.01, maxit = 100)
# 输出模型摘要
summary(nnmodel)
plot(nnmodel)
#使用神经网络模型预测测试数据并绘制ROC曲线
nn.pred.prob <- predict(nn.model, newdata=Test)
par(las=1, cex.axis=.8)
nn.roc <- roc(
y ~ pred,
data=data.frame(y=Test$结局, pred=nn.pred.prob),
plot=T, ci=T, main="ROC Curve of Neural Network",
print.auc=T, print.auc.cex=.8,
print.thres=T, print.thres.cex=.8,
auc.polygon=T, max.auc.polygon=T, grid=T)
#计算brier评分
brier(data=nn.pred.prob, reference=Test$结局)
神经网络模型是一种基于人工神经元的数学模型,用于模拟人脑的神经网络结构和功能。它由大量的简单处理单元(称为神经元)广泛地互相连接而形成的复杂网络系统,反映了人脑功能的许多基本特征,是一个高度复杂的非线性动力学习系统。
神经网络模型的基本原理是模拟人脑神经元的工作方式。人脑由大约860亿个神经元组成,每个神经元通过突触与其他神经元相互连接。神经元接收来自其他神经元的信号,当信号强度超过一定阈值时,神经元会产生输出信号,并通过突触传递给其他神经元。神经网络模型正是基于这种神经元连接和信号传递的机制构建的。
神经网络模型在许多领域都有广泛的应用,包括:
图像识别:如面部识别、物体检测等。
语音识别:如语音转文字、语音命令识别等。
自然语言处理:如机器翻译、情感分析等。
推荐系统:如商品推荐、内容推荐等。
预测分析:如时间序列预测、金融预测等。
总之,神经网络模型通过模拟人脑的神经元连接和信号传递机制,实现了对复杂数据的处理和学习,广泛应用于各个领域。
今天我们仍以二分类因变量的示例数据为例,探讨一下神经网络(Neural Network)模型可视化及预测效果的ROC曲线、混淆矩阵评价的Python实现。
#加载程序包(openpyxl和pandas等)
# 使用pandas读取示例数据xlsx文件
import ann_visualizer
import openpyxl
import numpy as np
import pandas as pd
import simpleNomo
import matplotlib.pyplot as plt
from ann_visualizer.visualize import ann_viz
nndata = pd.read_excel(r'C:\Users\L\Desktop\示例数据.xlsx')
# 查看前几行数据
print(nndata .head())
nndata.columns = ['序号','结局','指标1', '指标2', '指标3','指标4','指标5','指标6','指标7','时间','指标8']
import pandas as pd
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows',None)
# 对导入的实例数据分离特征和目标变量
X = nndata[['指标1', '指标2', '指标3','指标4','指标5','指标6']]
y = nndata[['结局']]
#划分训练集和测试集
from sklearn.model_selection import train_test_split
# Splitting the data into training and testing sets
X_train,X_test,y_train,y_test=train_test_split(
X,y,test_size=0.30, random_state=77, stratify=y)
feature=list(X.columns)
#搭建神经网络模型,并训练数据
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score
nnmodel =MLPClassifier()
nnmodel.fit(X_train, y_train)
y_train= nnmodel.predict(X_train)
print("训练集预测值:\n",y_train)
#预测test新数据
y_pred = nnmodel.predict(X_test)
print("测试集预测值:\n",y_pred)
print("神经网络训练模型评分:\n",
accuracy_score(nnmodel.predict(X_train),y_train))
print("神经网络测试模型评分:\n",
accuracy_score(nnmodel.predict(X_test),y_test))
#数据标准化
from sklearn.preprocessing import StandardScaler
from sklearn.inspection import permutation_importance
scaler = StandardScaler()
scaler.fit(X_train)
X_train_s = scaler.transform(X_train)
X_test_s = scaler.transform(X_test)
print("训练集:\n",X_train_s)
print("测试集:\n",X_test_s)
# 评估模型
from sklearn.metrics import classification_report, accuracy_score
print("Accuracy:",accuracy_score(y_test,y_pred))
print("Classification Report:\n ", classification_report(y_test,y_pred))
#神经网络模型分析特征权重可视化
import matplotlib.pyplot as plt
plt.figure(figsize=(20,3))
plt.imshow(nnmodel.coefs_[0],interpolation='none', cmap='viridis')
plt.yticks(range(6),feature)
plt.xlabel('Columns in weight matrix')
plt.ylabel('Input feature')
plt.colorbar()
plt.show()
#可以通过调整图表大小,选择合适的显示方式
# 使用Matplotlib绘制MLP结构图
fig, ax = plt.subplots() # 创建一个图和坐标系
plt.subplots(nnmodel)
# 显示图形
plt.show()
#混淆矩阵评估模型
#导入第三方模块
from sklearn import metrics
# 混淆矩阵
print("混淆矩阵四格表输出如下:")
print(metrics.confusion_matrix(y_test, y_pred, labels = [0, 1]))
Accuracy = metrics._scorer.accuracy_score(y_test, y_pred)
Sensitivity = metrics._scorer.recall_score(y_test, y_pred)
Specificity = metrics._scorer.recall_score(y_test, y_pred, pos_label=0)
print("神经网络模型混淆矩阵评价结果如下:")
print('模型准确率为%.2f%%' %(Accuracy*100))
print('正例覆盖率为%.2f%%' %(Sensitivity*100))
print('负例覆盖率为%.2f%%' %(Specificity*100))
# 使用Seaborn的heatmap绘制混淆矩阵
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
import seaborn as sns
sns.heatmap(metrics.confusion_matrix(y_test, y_pred), annot=True, fmt='d')
plt.title('Confusion Matrix')
plt.xlabel('Predicted label')
plt.ylabel('True label')
plt.show()
#进行ROC曲线绘制计算准备
# у得分为模型预测正例的概率
y_score =nnmodel.predict_proba(X_test)[:,1]
#计算不同阈值下,fpr和tpr的组合值,其中fpr表示1-Specificity,tpr表示sensitivity
fpr,tpr,threshold =metrics.roc_curve(y_test,y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr,tpr)
print("神经网络模型预测测试集数据ROC曲线的AUC:",roc_auc)
神经网络模型预测测试集数据ROC曲线的AUC: 0.9423111111111111
#绘制ROC曲线
import matplotlib.pyplot as plt
import seaborn as sns
# 绘制面积图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5,edgecolor = 'black')
# 添加边际线
plt.plot(fpr, tpr, color='black',lw = 1)
# 添加对角线
plt.plot([0,1],[0,1],color ='red',linestyle ='--')
# 添加文本信息
plt.text(0.5,0.3,'Roc curve(area =%.2f)'% roc_auc)
# 添加轴标签
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 显示图形
plt.show()
神经网络模型通常由多个层次组成,包括输入层、隐藏层和输出层。输入层接收外部输入信号,隐藏层负责处理和转换输入信号,输出层生成最终的输出结果。每个神经元都有一定的权重和偏置,权重决定了神经元之间的连接强度,偏置则决定了神经元的激活阈值。通过调整这些权重和偏置,神经网络可以学习输入数据的特征和规律。
包括:
前馈神经网络:信号只能从前向后传递,常用于分类和回归问题。
循环神经网络:神经元之间存在反馈连接,常用于处理时间序列数据。
卷积神经网络:具有卷积层和池化层,适用于图像识别和视频分析。
自编码器:用于数据降维、特征提取和去噪。
生成对抗网络:用于生成新的数据样本。
激活函数和反向传播算法
在神经网络中,激活函数用于引入非线性,使得神经网络能够处理复杂的模式。常见的激活函数包括Sigmoid、ReLU等。反向传播算法用于在训练过程中调整权重和偏置,通过计算损失函数的梯度来更新参数,以最小化损失函数。
医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!


