使用乳腺癌数据集的人工神经网络人工神经网络3 U. S1 F0 E9 k; t8 K" d4 C6 x$ o
顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。( R$ H% z0 T- s% Q7 ~
9 `2 I9 V& C5 g! P3 Z9 V
大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。 A2 E7 ]) W X* P- i
$ F" w: {0 O0 R6 d; R( r; m: m它由三层组成,分别是:$ p' ]5 Z, f+ r
! p* d" {7 M! V+ a5 M! e& ^/ Y输入层
: E* f8 z+ u- }+ g' S5 g1 d9 H0 k* y1 b' U, U1 M
隐藏层5 L% ~; ^2 I$ H+ k8 C
0 x6 ?8 @/ s! B7 A! C& Z输出层, g5 b' I+ L. ^( d% ~
& y7 q" g" t' t3 T; P: q
$ d. j% q2 r& N+ \5 \使用乳腺癌数据集创建ANN$ U+ F. v5 G7 q
现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。6 T7 X8 @# a( ]! R
( p! t+ F: E/ ] y9 j1 B
首先,我们采用乳腺癌的数据集,然后继续前进。" O6 q4 z1 O8 [6 o4 m& @/ K& w' I
: A8 w/ c K1 O) K乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
2 j3 }& |1 M5 M" s0 l+ v4 i+ p1 o
% S4 q' p8 o, D! K, r2 h下载数据集后,我们将导入所需的重要库。+ d$ z. P) [8 _4 K
8 B, v8 D( K: d; ^& t' p
导入库* K6 `' K, ^; |0 i7 i0 X
#import pandas
6 d1 W9 o. H! L8 l6 cimport pandas as pd. T1 ~$ r+ L# {( N. L
#import numpy/ `. ] Q0 y% j
import numpy as np5 O' a6 N- E. A7 W: `; X9 d
import matplotlib.pyplot as plt
5 s8 D4 q- P% k) D) a" Qimport seaborn as sb e4 z6 z& A2 h( T
这里我们导入了 pandas、NumPy 和一些可视化库。 q, E' ~' N) r9 `4 ~: Q. J9 g+ T
现在我们使用pandas加载我们的数据集: $ Y) U- |$ ]) ~9 h n
df = pd.read_csv('Breast_cancer.csv')
- @ H. n9 c( D( O; ~4 p' C7 [df M3 W: i& K9 ^; F9 l; C
![]()
0 i7 g0 B" m+ |/ G& ]9 a/ ^7 A6 f9 [0 N; f$ L; P: x
在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
& W w# D9 |. {$ u' G' Y. R( D8 A% h- `& N0 |( ~$ f. t
# counting values of variables in 'diagnosis'
5 T& k9 e6 C: a, f" G/ c6 D$ Jdf['diagnosis'].value_counts()
5 k2 W1 j8 W9 l0 z3 ? & M( k& s2 g6 h8 \ Z
( Z. y. l& w# Z2 u# V- T6 l现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数
; k" C* f& G; _; ]; ~$ W, Lplt.figure(figsize=[17,9])( h# f; G% g9 ]+ [
sb.countplot(df['diagnosis'].value_counts())7 m8 |/ j2 E' X
plt.show()
5 H9 d9 V. a4 T& E* O1 D ![]()
& Q2 q% n9 }4 T: |
0 e7 B3 q3 u3 a/ i, w空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值: / F& M5 M8 H8 @. G6 ~
df.isnull().sum()
5 X8 p- D7 H3 m& U8 v; n8 @ 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。( y- [* V0 f' w/ T" y# z
/ v0 d1 ^% n9 b2 Y) V" L1 J1 z! w. G. p
#droping feature
) ^- a1 x/ V6 l8 i& {' k+ y% |df.drop(['Unnamed: 32','id'],axis=1,inplace=True)
4 D, k5 U i& J9 ^" ~
# I- R4 l0 i( L# r自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。 0 N3 ]9 @6 g9 {8 F
# independent variables
* y: }/ N2 T! P5 @' V0 n3 Hx = df.drop('diagnosis',axis=1)6 n3 N! F7 b3 J
#dependent variables* X, |; ]3 c9 K2 U
y = df.diagnosis
7 [5 Z% k, Q+ B4 [% v* s7 ` 处理分类值2 S0 M2 T* s* v( P! X v8 [: ]
当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
. |& W, B: C8 y# n) i0 P9 x. E% ?7 w2 a+ ^7 b9 S- G* x% c
from sklearn.preprocessing import LabelEncoder
1 y z2 y3 M- R+ n8 ]& K4 N5 F#creating the object. D4 G0 D/ E$ p0 c. h g+ `7 M2 n
lb = LabelEncoder()4 Z! ~, k% s5 Y% ?' _
y = lb.fit_transform(y)4 D& P0 w4 B2 }
# ~6 z: J9 q% L8 f* | n拆分数据
% M% S5 p- ?. H. E* k6 p1 [! d& t现在是时候将数据拆分为训练和测试部分了:. g; a* Y3 ?% D4 g/ [
) ~: ]$ U4 G7 N5 W" P2 q$ D p+ afrom sklearn.model_selection import train_test_split
- V! [( \, m% |7 b3 {xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
: s+ q& W6 Y9 X0 I5 s5 u/ J) E2 m9 M6 j# M2 [
缩放数据: R- n5 A7 Y( u' K* S
当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。# N# i; d0 a4 R" R( O4 U4 X
% A7 D% \6 W* w. G* N' h
对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
2 F( T% e/ S2 n
) Y( x9 K; E+ C#importing StandardScaler
& ~/ n3 W* q# Ffrom sklearn.preprocessing import StandardScaler
: c0 g( c0 n: \4 c8 Z1 [9 c% k$ u#creating object. Z6 Q* R. `7 {; [2 n# x
sc = StandardScaler(): n4 T) C* d; H0 x9 z
xtrain = sc.fit_transform(xtrain)
9 N* m9 y( R) D, z5 q+ W8 Gxtest = sc.transform(xtest)
) [7 j9 q9 w5 m1 X, C4 X/ T$ e d! J0 O C3 i! r4 S
从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
! r7 i/ P7 k# e, A9 h( z) X
9 X( l9 f0 k [* J: g0 o#importing keras+ [9 a9 Q8 e! Z/ f6 M2 v& K0 w/ b5 G7 c
import keras5 K) T: C1 ~6 s. C. b* }
#importing sequential module- `( c. N9 G* C% }( Z9 v
from keras.models import Sequential: K2 N7 f# @0 O& T* P. R
# import dense module for hidden layers+ T7 R! \* D4 C0 F
from keras.layers import Dense
2 k4 l9 j5 s% }" P' H6 g) `#importing activation functions- G6 n5 M' `) |$ q' ~( W* {9 N
from keras.layers import LeakyReLU,PReLU,ELU+ x* R+ I- C. T/ ~. p! _
from keras.layers import Dropout! E% g- c- f. N1 `+ N3 L, m5 w
, w0 W* r- r. ?6 y! c% ]1 t) u创建层
; T" Q9 B4 F1 O, h- G: D导入这些库后,我们创建了三种类型的层:
4 _. u- t$ ^( I% E6 a# F
4 c) G; j% k" ?输入层
: o4 p) g* J) _3 r( r5 U" C: ~
0 j9 C7 E) v1 T0 T6 t4 n0 z隐藏层6 ~) Z( j( I5 @% D
( w& y K9 R7 |% ~# k; L
输出层$ ~( M, O0 [& N7 ]; i
0 r3 ]7 ~+ _! u# @0 _8 ^; n首先,我们创建模型:* Z# B/ `+ x! x3 \
7 U/ S! D8 ~: m% y
#creating model
1 g2 Z H! `$ Fclassifier = Sequential()
- t4 K' q* |& d
) f# d0 J# U/ ?Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
* D( o2 G( a# z6 l2 I
6 p0 W# @& I- D* j h- D现在我们创建神经网络的层:- c+ |8 x1 t" {+ k% l/ B, ~
$ L5 ~- T6 F1 I# Z#first hidden layer
. K8 O4 T. @ Y `2 F: tclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30)), @7 w) i* R& ~9 B. h
#second hidden layer
, d' P: \: `# i, @classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
% D @7 o' e( E, V: }# last layer or output layer
; n& t, }4 Y! m8 F$ f& |classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))2 V2 g+ M* c# M8 N' x
2 F; D6 }7 H8 o$ [6 t在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。! e# P! D" K. Q; A% a a
. l0 l E; p/ r; J8 h! J7 b0 j! y第一个参数是输出节点5 g [4 H0 Q9 w! p
, @% W9 e$ K; D! n, }
第二个是内核权重矩阵的初始化器$ {- R$ s( Z2 i3 w. p* f+ N, F
- _ d( `0 u- ]: @1 ]第三个是激活函数8 {. W4 O& i+ T$ E& l( f# f
w+ F/ `6 a% K' K! S
最后一个参数是输入节点或独立特征的数量。0 r; j! l# f+ ?0 R
% K( g4 Y% A+ B6 q/ _# ?( F/ O8 `
执行此代码后,我们使用以下方法对其进行总结:: j4 r" c6 G1 u4 w' l2 n% N+ i. _
#taking summary of layers% L, y4 T; W. M) F
classifier.summary(). G; E9 p! | u# Z# o1 w
![]()
1 |! p- f' `- L! r, Z/ ?+ B% \7 b' Q# s
编译人工神经网络
; ]/ }: Y9 f, ~3 c1 S现在我们用优化器编译我们的模型:9 c( e/ @, J u
; |) }# v* N$ f: m- q: |#compiling the ANN
& c% ?8 ~. F( D, sclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy']): \: B: m: w% @' j
3 }' m+ }0 w6 ]0 n! s% O% J( Z将 ANN 拟合到训练数据中7 k$ ?+ v; }: z3 |+ Y! n
编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:) q) R# J& v: c7 O
. J( { I: B0 J' G% _$ p$ \ #fitting the ANN to the training set
+ s: C, ?! j- m* e% o' X: emodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)' y, q8 g6 ?" |! a
( k7 y7 }: S& b/ ^! t$ o9 w
+ M E! a- C$ h4 Wit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
# b: O: F- U9 {2 s: h% x. v7 H( Y! @9 I9 J! m* V- [! ~9 V4 I1 ^& r
在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
( X0 q1 a( H6 w0 B- \' j$ Z$ U9 q6 Q% [8 L( x. S
#now testing for Test data
2 |% Z( r( ] K1 l. ly_pred = classifier.predict(test). B3 T, n: U$ {) v" ~# f: N
1 ^9 F8 R' @2 t6 d& G
在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
8 t9 @, ~- Q; @9 v
6 w+ }* y0 c# e+ c#converting values% e* O: K* }. x/ t/ f5 R; _" N: W7 K
y_pred = (y_pred>0.5)! ~' q$ Y; g. ^3 g0 {- @
print(y_pred)
6 M! g d) K9 p8 a9 q3 N! a8 w7 O( m/ R3 {6 R$ t, T( R) i; g( N
: B) c9 S2 y: S1 D2 u+ B
, t: Z' r- d/ u9 n! w$ [# P分数和混淆矩阵; q- ]& ~) H1 \* ]- B9 e/ \
现在我们检查混淆矩阵和预测值的分数。
! J1 g- r) ?, b/ b% R ^* Q
1 D' ?' e8 N2 ^+ Q5 W* Q7 T' ufrom sklearn.metrics import confusion_matrix, W& i1 S# \8 U2 c) o0 ]! c$ K
from sklearn.metrics import accuracy_score/ E4 h1 }! T$ n' R- m# I' X
cm = confusion_matrix(ytest,y_pred)
) j2 h" S3 d2 `" t0 j& \ Hscore = accuracy_score(ytest,y_pred)& N. F0 k3 ~4 f8 X7 q
print(cm)
3 ~/ Z0 I1 |7 n u' w+ l- \print('score is:',score)! C6 {' g1 e, w! W9 v; G% O
& p. d- l; C( W; l' ? O4 D; ?输出:% {+ Y; E! F+ {6 }% F/ I# B$ z
" F5 |9 z! c% r+ A& Z
( x" g: e$ g* B$ G; C5 K+ N. x. @% S6 K! v- U% A
可视化混淆矩阵
) a, }$ K. g# f% X+ Z5 O在这里,我们可视化预测值的混淆矩阵0 p. }6 t, n1 t
) p; ^! V/ B& V' ]
# creating heatmap of comfussion matrix: f( y- }9 o( t. i7 @0 r* C
plt.figure(figsize=[14,7])& G% ^ _5 e2 ~% `) k8 Z% ]) r
sb.heatmap(cm,annot=True). F& `. u ^* |8 Q& m4 B% A! a1 S9 M
plt.show()
6 e: x' Z' N3 ]" m$ H% E+ m' e/ b. _# e/ T* j* l
![]()
5 Q' t2 L' x- e' k- D0 S
. Q' B" D1 B7 Z. l( s! k* ^9 r/ y可视化数据历史7 D' @- P% i: y# g7 j( h+ r
现在我们可视化每个时期的损失和准确性。
8 i$ |; A' Z( V7 ~6 e& a. I2 q6 }8 x; M* d4 G) U3 R: y
# list all data in history
) w9 C1 }/ B! Y& Rprint(model.history.keys())% e7 j% a& E% E [
# summarize history for accuracy9 K, u5 Z" V& u* J
plt.plot(model.history['accuracy'])
, u; y3 Z& H/ P' _8 D, vplt.title('model accuracy')8 z# S# G* {! k5 M
plt.ylabel('accuracy')
; W8 L7 ~- u, K6 k2 L; |7 B" h) Dplt.xlabel('epoch')
0 k4 G! y( U6 B! M; a1 P7 |+ R! @plt.legend(['train', 'test'], loc='upper left')
?9 A2 j9 t, r8 ~& [plt.show()
, Z( \. D, Y; ?; m6 N9 T
( R' S7 V C$ L 2 h v p. Y) U" ?# D
( e9 s4 S# w- j0 ?, b- A
5 |5 f, x7 t* n3 P* W
# summarize history for loss: `5 U0 S+ ], V# A7 s
plt.plot(model.history['loss'])
: o9 L0 ?6 P* t0 E$ e# B: Tplt.title('model loss')6 g% P# P( O$ O1 |6 y3 e! V
plt.ylabel('loss')* D |2 u! c; J) v1 h
plt.xlabel('epoch')
5 Y+ {3 x$ k |" z1 p- g2 ~8 Oplt.legend(['train', 'test'], loc='upper left')
% z6 ?+ @/ P- b; Nplt.show()
% {- r+ ?" b. W4 r" d5 d/ I5 @0 r% A1 H; A
) B. j. n* p) T2 g, F" x 2 p# \) N5 z: O% B
: I- w u# q+ \
保存模型最后,我们保存我们的模型 - ( I. J1 \* {- S3 a0 k' @
' q" G8 W n( i
#saving the model
- U+ g1 A3 r. G# V% K: [& A
; p a) Q7 t* Z8 }2 D, t/ E% M% F
2 Q" _. A9 u, k; q, o
2 g& I7 s5 [, G2 jclassifier.save('File_name.h5')
P3 o- Q7 \2 X6 Q& S. L' o. r2 {2 x1 z- P0 i) S, C
( ^& g6 ]( j+ \4 {2 e% \' C5 h4 b8 m( B9 L
+ N6 y S! O% B, S. W+ i' F
9 v1 F4 {! F" ^% v
5 V6 M# Q. C' ]% H1 v& _! b |