使用乳腺癌数据集的人工神经网络人工神经网络3 Y% R: x7 j1 N
顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。; F) \' m7 @/ ?# h1 U6 h5 l
; f& I- @0 o- w2 Z
大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。6 i$ b" \% x9 H& h, R7 }
/ U5 C2 ^: T' k$ v% ]/ i它由三层组成,分别是:) I" W& z" K8 V( H' Q: M0 F+ \$ {
+ ^. h- P) ~) s U) A' V Y/ E
输入层
, Q3 `* Y; y! O; ~4 O6 c; n+ n$ D H; o4 y) a S0 }
隐藏层1 Q/ o' t, Z& U* x" d& o3 k
- [, Z6 u8 t2 V O输出层: i3 G t" j& _# O( x: X# F
![]()
% L# }$ A1 E6 g% d, m& N% u/ K
使用乳腺癌数据集创建ANN
A f; L, p% M0 r2 X现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。8 R. T. i5 w8 c+ h
0 o4 N4 v# Y C首先,我们采用乳腺癌的数据集,然后继续前进。
6 @% d2 K; W0 E: P1 I) L: g H( h
乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
. X9 Z% S3 q4 m( X7 A# }5 x' ]" m
5 x& I7 `( N+ P, j4 i; k Y下载数据集后,我们将导入所需的重要库。
: [/ R$ Z% P: q# i$ K' y8 L" k1 F5 L8 J' A; s- e
导入库
" f" A+ n6 N7 k+ T6 _9 i#import pandas
; U9 w6 p |6 rimport pandas as pd0 G7 S H2 U2 s. I
#import numpy
) y) }' n( G6 l* ^+ wimport numpy as np
) I. {$ W# x* Gimport matplotlib.pyplot as plt
5 Q8 b+ j# u0 m- ^import seaborn as sb
5 p5 w i) b H6 W 这里我们导入了 pandas、NumPy 和一些可视化库。
4 F. d* J* F, X现在我们使用pandas加载我们的数据集:
. z1 s+ J$ H8 w# R8 W) Odf = pd.read_csv('Breast_cancer.csv')
/ r, D% {3 }' K. }df
9 Q/ j+ V9 n; E7 y& b& z ![]()
4 p, M' S7 J: Q* t' s0 T1 \ g( B8 _* `6 ], G/ z
在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:7 h- H4 R1 U6 B6 k9 M' ~, b8 ^* b
H4 Y, e- z) n! h0 W# counting values of variables in 'diagnosis'
7 [$ E) C9 c5 H. Y1 Bdf['diagnosis'].value_counts()7 M# [3 w; t& q+ Z5 G' |' X
![]()
4 f) [4 z' |' C. H' _) o4 G @# ]6 B
. d+ y. u* f& z7 o2 T现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数 C G2 q3 d, ], d8 r4 Z
plt.figure(figsize=[17,9])
8 h; @, h" L" }sb.countplot(df['diagnosis'].value_counts())0 b% w) p! a' n- I
plt.show(); d1 @! [+ c1 h+ w: m8 p
![]()
; u$ n7 m' P x" K$ u; X& W. N" I5 @
空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值: 9 S) v, y' h; m( P _ w
df.isnull().sum()
" `. F" Q- a, f7 r+ Z0 D1 h* f 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。
9 h2 A* [! D* v$ A: x# q
1 y3 s" m: S/ P#droping feature
9 L' S/ F/ s! u5 }) ~* Ndf.drop(['Unnamed: 32','id'],axis=1,inplace=True)+ \' o) ~& W# H9 S; U' Q
6 S, c: @) c' R
自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。
) N( ~3 q5 ~( O5 l4 H% Q( [' p# independent variables
, ]" c4 W9 d, n# ]) ]; N- nx = df.drop('diagnosis',axis=1)7 T, k6 l$ l! Q
#dependent variables
1 ^# @: u/ Q* ]* Hy = df.diagnosis
! k: \; a5 J' b1 v& c 处理分类值
1 C0 R$ S9 V$ ^5 @6 g当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。: j1 m7 ~+ y+ V
4 r% Y0 d1 x# w, h" s* C$ r
from sklearn.preprocessing import LabelEncoder
6 k j) I1 @) s. d3 @, k0 ^#creating the object5 A. o: v! \2 q; s N1 w
lb = LabelEncoder()
, n6 }4 Q$ j* M1 V- ]: ~6 Zy = lb.fit_transform(y)
7 t0 O1 a4 J/ Y9 A% O, h, N, V$ A2 E) H
拆分数据/ v D Y3 t4 K4 L/ ]" @7 H
现在是时候将数据拆分为训练和测试部分了:( S. n3 }# H+ O$ `3 E: `
* A$ z! p2 Q" U* U
from sklearn.model_selection import train_test_split
# J# P7 Z' R( ^! b' _2 C1 E4 Nxtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
" S* Z" T, _5 R. u6 K
' [. e; V6 Q# V. ~/ ]6 S缩放数据8 O$ N7 K5 J' G( C& p$ l
当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
4 j9 I6 v9 P1 |4 f' u" u6 @/ C' G8 ]: ?5 R, `" V7 _
对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
N4 Z' E; @; E( c$ B# [, I- D& c2 n8 i9 G8 R R) {/ X- t: ?
#importing StandardScaler
' z: L' E$ b0 N1 s; kfrom sklearn.preprocessing import StandardScaler f- W4 R' z! |- [, T( f/ _; r
#creating object6 i6 \# P! R& J, p/ f
sc = StandardScaler()9 Q. ?/ I; {5 Z
xtrain = sc.fit_transform(xtrain)
7 M. S8 |/ x& ~3 q+ W; nxtest = sc.transform(xtest)' k' A5 _8 ~; M# B+ Q. |! Q: @
, [3 @8 c3 R, {' j: ?$ d; m, X
从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
% _( f: n* d4 L N4 }$ t% a6 n* {5 E
#importing keras5 ~2 v. H& W& t- R6 J8 n9 M3 Q' f: _
import keras: U: H7 e7 Z8 u: ^( z7 W
#importing sequential module
; g: s3 Z- d# D4 xfrom keras.models import Sequential
! d) X6 |/ d/ H1 }# import dense module for hidden layers
9 \5 M6 N/ q5 e4 K& F0 k5 s- }from keras.layers import Dense! ]/ \% @8 H8 G, E0 k$ `
#importing activation functions( K; |6 b8 W, n2 ^2 O
from keras.layers import LeakyReLU,PReLU,ELU
+ o; D' v1 M$ Z; W Qfrom keras.layers import Dropout [: {6 E2 T( d% }4 A& R
! y# [2 g6 D: V; h' r" v创建层) o4 N) g' w$ x
导入这些库后,我们创建了三种类型的层:
{& n; J! v( y! t" N7 U" l, W( r
输入层5 M4 B: t$ ]4 k( v3 M3 e' [
' Z% H# J' v; x( K; f0 w/ \% f隐藏层
7 y4 W3 v" x: o7 l# [: w" w$ U/ h% d
& K7 Q" J* e. p/ j/ j# k输出层
8 G$ Z, Y8 P# t+ {+ P" F: L
7 x1 |# J' f' @$ @首先,我们创建模型:
8 P0 P. [7 q; x6 g5 d1 c5 E' B
) ^, [$ B, S, v- C#creating model- U8 t; Q9 r6 b2 w7 w* a2 ]: ^
classifier = Sequential()
8 Q# \) M8 @! g7 M9 X
! d/ t* T- h, w) I USequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
. T7 K1 i( j( H) ~. |2 w) N" M
& _* _9 Z: A! _, P+ ]/ Y' U) Q3 N( `9 J现在我们创建神经网络的层:
& M; f: a V) E J" I* k; f4 e$ l. a& q4 @
#first hidden layer0 p6 V, J2 r/ ?( R3 C: j1 j
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))
& l! q. ~( e6 h$ F* ]#second hidden layer0 I P) R7 d5 P' ]. A
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
. k- N% v/ G: G8 Y+ ]3 j7 o# last layer or output layer
- S' D- w2 K, V5 dclassifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
- L$ f) k; [2 X: K: U
2 x7 a7 s( b* P- A% ?. g' N在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
+ c, U* O# }/ s' f6 u- |( ~5 |- N# d1 T3 V+ b# `8 |$ u: n" H
第一个参数是输出节点
# b% U7 L* o8 C& K
$ H2 A( ~- a" p' s9 ~第二个是内核权重矩阵的初始化器
" z& C$ E O5 q+ Q* `3 n6 \- D$ Z( x$ S, E6 M2 L5 N+ |! H
第三个是激活函数
2 J" s j/ S, a. s
+ u- [$ d: s) S" k& r% Z最后一个参数是输入节点或独立特征的数量。/ @# `$ m U/ V1 k
/ |" w" C; [/ {* p6 w! f执行此代码后,我们使用以下方法对其进行总结:
: z4 _9 o6 t' B g#taking summary of layers
# v% |: M* Y4 v& w: xclassifier.summary()# B$ x% ]: a$ J; H
* L; w j h& j& e8 A. q
* b# E% f6 R: V' _& h: V编译人工神经网络
g2 x5 T+ J4 h: ?现在我们用优化器编译我们的模型:: t2 g) ]3 A, R7 P: ?- A
1 k' \( t* E0 V' r+ g#compiling the ANN
4 u3 F( {$ N# d* }& [0 x* aclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])8 M" c+ b: s" x" |8 s
+ ^% L o: L: Y; y1 G" d/ |" {6 ?将 ANN 拟合到训练数据中
0 W4 U$ \+ z, b `. c m编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
; k6 _, u1 h& ?; `' G* P6 p
% c; H. d' B( Y: K8 o #fitting the ANN to the training set
7 w& p0 Y- s8 K$ W# o/ B6 lmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)! P6 ~! H# ~0 \; T! L- {
8 D: R$ |) R( z$ _! W' t
' X6 U/ @2 Y s2 t* B. Z* t" sit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。0 ]7 {4 \% o8 X- k9 E
. ?; f' w( e. C! A- D+ `
在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
7 L- u9 J. m5 H/ k8 P/ p* r( G3 u. s
#now testing for Test data; L2 M ]# p, s1 f
y_pred = classifier.predict(test)
, p! s& v* k# c4 B8 w' H9 {0 b4 L I' ]- o8 @2 w' w4 P
在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。) Q3 i, a1 ~$ j: v8 {
7 d% y5 M) [+ Q+ u, v#converting values: ~* _. f9 ]& y0 e! z
y_pred = (y_pred>0.5)/ s; w. ~( E$ w7 }- g/ ?( N
print(y_pred)
8 ^/ _# M7 L9 B- L0 I# }
, H$ c. U7 K6 U4 t1 G! q1 W
+ Z7 Z7 H! q1 |% C
% v& b# M% r& E/ O) o分数和混淆矩阵
. B$ ^8 _( X3 L现在我们检查混淆矩阵和预测值的分数。+ t0 i, r$ A# H" W$ K
2 l- h) |) R: K& C# K s$ P% Gfrom sklearn.metrics import confusion_matrix& f5 A% r/ X- [
from sklearn.metrics import accuracy_score
) Q' p: h, n2 m& ?/ |, Fcm = confusion_matrix(ytest,y_pred); h' D% E6 H, i- i
score = accuracy_score(ytest,y_pred)
4 k h$ r. b4 Dprint(cm)& q( G0 A8 y: l3 b! g w4 P- N8 `
print('score is:',score)
4 C* ?2 o t, K" w. j9 k
: Q2 b! z3 c F C0 r/ W输出:, g* b; b$ _! |! ]' ]- m' |
+ k. b3 R3 ]. p8 v! @0 \2 ~' A7 ~- [; {) \' R' D- D; S
; z) Z. _; M$ A, u- ?
可视化混淆矩阵
( H0 ]6 [1 k& @- P+ {- E1 x" P在这里,我们可视化预测值的混淆矩阵8 J" h! f& e( Z/ {) I; h
( {! n' Y3 q n: R4 p9 g/ t. D3 m2 U
# creating heatmap of comfussion matrix3 _! z& q. i. V6 d
plt.figure(figsize=[14,7])8 |+ j% j, R0 x8 `
sb.heatmap(cm,annot=True)
8 S6 D! E; R3 K2 E; Splt.show()
' a2 O4 c8 L! p2 q) C/ a5 ]% Z4 g* r K, H' t5 r3 N
* i% s# Y4 f( n0 ?
# G/ l. W1 x0 @. p可视化数据历史% F9 y4 m$ ~8 I: t- d% T- p. ^7 L
现在我们可视化每个时期的损失和准确性。1 Q. v# I2 o- G6 E' \
1 _& { W7 K$ m: s2 o# list all data in history* i1 @+ d! w% ~; T
print(model.history.keys())) G! o, |+ y& T& Z$ W: l) Z9 v& s+ q
# summarize history for accuracy) p" F& [0 A5 c @# O
plt.plot(model.history['accuracy'])* \( n& O" R" D: e1 `4 k4 v
plt.title('model accuracy')' P" E! i1 T/ p+ Y
plt.ylabel('accuracy')1 ~9 P5 H" \# W+ G/ l4 n
plt.xlabel('epoch')
5 C b- V7 h8 s! L2 M# w8 Xplt.legend(['train', 'test'], loc='upper left')
' x. g) j/ I; U0 `7 O. h" oplt.show()9 a( D+ x0 }6 V$ e% ~0 Z% y9 U
/ U B4 ^6 e! U. @% i
![]()
7 M* x, I d9 h, V2 F1 n# G1 W9 g u2 I
- t$ D% I5 N9 i% |. n3 H4 X# summarize history for loss& w6 Z4 }' O" i$ r
plt.plot(model.history['loss'])
( C1 \# x. ^" a5 L% `. f3 _8 Iplt.title('model loss')
, k0 b( j: u) tplt.ylabel('loss')
. ]. Z0 ~$ S& G7 V3 x1 Cplt.xlabel('epoch'); y( v% J3 ~, X$ D& s/ {/ R4 h
plt.legend(['train', 'test'], loc='upper left')( O9 ?' d$ e; K2 S9 H. d
plt.show()0 _/ E E& o& o) r" \ G( O
1 J$ O2 j" | \
![]()
/ t, v6 M; _! `) f4 ^! B Q; J
9 B3 b& ]2 J3 |* n5 v* N' p3 I/ E保存模型最后,我们保存我们的模型
. R3 j) b8 @% G+ N& \( B, j% G; r5 y7 f; h7 K, I# \% I7 T; p4 i# |2 Z
#saving the model
+ z9 r. A* Z& m) X: b6 A9 s& L" `$ l' g* u" u
* L1 G8 ]% x( |7 h% N, v+ A
1 I9 q r2 r* x' M/ {classifier.save('File_name.h5')
/ Y. o. j& J2 h
/ D6 i$ l6 Q# I9 r! v: \
% u! h, k8 T4 \5 T7 Y3 M" |
: n$ y9 z# L0 k0 W6 R
2 C1 {, z1 r* {$ e" J2 h5 S9 ]0 A
) F1 Z8 E7 F* T. t2 E5 P" t: u& F- o |