使用乳腺癌数据集的人工神经网络人工神经网络4 A; X. f' r6 e$ Y H) J* N( ?
顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。$ C% r) k; L: @- K+ z
, p- X4 R' `2 v; i% ?大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
2 z% A. K9 G n" M4 R' Z C. ^4 l( n Z
它由三层组成,分别是:4 r; ^, W- Z. h$ o1 f t# v, i5 ?
2 p/ q4 }8 E! | p, G
输入层
3 c) W( s8 e, ~$ J4 M* L2 d7 h' N5 q) ]/ S5 w4 B) y
隐藏层" Y$ _- k9 ?. P- M7 P
( `5 _; P" V- D& F
输出层
. q8 U1 |8 z% s1 |$ x; K![]()
4 k- _, o0 |8 L% q, M; q
6 J" Y0 f' Y& a. q- _0 n- w使用乳腺癌数据集创建ANN6 S! Z; m! Y! n
现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。 }) w* S) G8 ]% w7 }, R' `0 a
$ s5 g0 }: u; s. Y/ z首先,我们采用乳腺癌的数据集,然后继续前进。$ H/ b' |. j9 \
' h4 ]1 P3 x& J. q0 ]乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data. l# y! _% ^1 v) \
* M/ s& [/ @. J ^* J
下载数据集后,我们将导入所需的重要库。
. x* ?5 ]3 I, A
6 w+ J4 g; C+ v# B" s" u- @* {导入库
0 f9 o$ H o4 H' `# I' `/ S#import pandas
6 Z0 T7 z0 S* simport pandas as pd
( {/ ~; }# p4 V" b9 P8 ?" k6 M#import numpy2 W. t% j1 ^; @/ F" c
import numpy as np
7 x* l: i6 a3 {/ yimport matplotlib.pyplot as plt1 q$ N5 A% d! F& {9 L; G/ b& T# g
import seaborn as sb
/ K- F3 R/ {1 P" ]. ` 这里我们导入了 pandas、NumPy 和一些可视化库。
3 r9 H4 F' b% I5 k" X现在我们使用pandas加载我们的数据集:
& T6 J* x5 Q. Edf = pd.read_csv('Breast_cancer.csv')
2 J. U. \' N1 H; ndf
8 m1 S7 I$ U, B+ R* I$ t) l* D ![]()
5 \7 Q& L% X. V# \1 c# O! L. y0 I( x4 v) r$ F: t
在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
" E, j" V- }/ l' [6 }
* u# S3 h; r! u X7 z3 ?1 [# counting values of variables in 'diagnosis'% z$ q: ~( R- b3 j' w9 D
df['diagnosis'].value_counts()
$ C$ u' q, h1 z* ?) m% E 1 z9 Z( h# m% X1 |% h% ?
7 l' O7 [# g9 X# L W" s现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数
( N$ i) C; ~! m/ o5 f+ Bplt.figure(figsize=[17,9]), v# i" R. m% S! r+ {5 n+ d2 s* y! ?5 y
sb.countplot(df['diagnosis'].value_counts())
8 C5 {' t+ y6 w) t) y- [( ?plt.show()! [+ A! h: [+ R8 q, `1 V
5 w6 h- N- j# J* y) l
8 `* \, N7 z& T5 [2 ]% p' w% @空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值: % B4 Q2 d2 _- D: {+ D" W
df.isnull().sum()% u# s1 N# l: g3 W+ W
执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。3 X0 i% c# i# y) h
/ G, Y p) {' h0 g/ m1 ]#droping feature
& p/ o* u1 c% W1 H. @df.drop(['Unnamed: 32','id'],axis=1,inplace=True)
3 j8 v) R! x. Z3 ]# r- M
6 c b0 M5 @$ C: {' @, M自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。
4 Z' |. Q; q( J# independent variables2 t! Z8 D* L& Z5 l
x = df.drop('diagnosis',axis=1)2 b0 N' l5 s0 Y8 x! i5 j
#dependent variables
; @$ x! A) e/ K/ ^0 O& ^y = df.diagnosis
7 ^" y% k- X S 处理分类值7 w+ W- j$ V0 q. d
当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
% D6 e+ }6 A( u( |* A) {6 x+ \
j6 o" j8 K @5 R+ Afrom sklearn.preprocessing import LabelEncoder
, A. l6 A A5 q! I#creating the object
5 b/ u* w3 {/ w2 i- T: F& \! Slb = LabelEncoder()9 L( y* d0 L) Q" p/ F T
y = lb.fit_transform(y)
6 Z' `, P6 i0 v; T. _
+ s5 f: H7 i1 Q% z% \4 l* {6 Y拆分数据
+ W& O# c/ v- O0 K& n; i1 j4 }# k6 @现在是时候将数据拆分为训练和测试部分了:
$ J" U/ y6 ~: Z+ S1 w W! g+ D+ v
- a3 K" ~7 c, o Dfrom sklearn.model_selection import train_test_split
& h5 {7 g* L. w2 n7 hxtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
) ]/ Q d8 i2 a7 o$ T- a7 z
" V4 k: \- _* r) ~$ D7 F, x: F缩放数据9 }% o3 c4 w/ M, Q( t
当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。' ~2 F O/ t% h- C1 e, r
. K( x$ ?( [$ C; X. z# y3 }) s! c对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:/ u5 G9 H, v5 N. V9 Y+ e, B
" C. N- }' Z* `! L3 @5 k, ?. I
#importing StandardScaler4 {1 T( ?( h( T* A
from sklearn.preprocessing import StandardScaler: r: Y) S' \7 F
#creating object
, n8 |) q; q" Xsc = StandardScaler()
' h% B( o3 n7 Y; vxtrain = sc.fit_transform(xtrain)( y J; t- u6 E
xtest = sc.transform(xtest)7 J" m1 p) D$ T0 `# y
]2 D7 R: Y4 K$ R! X从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
- U# N1 Z, z; R/ \9 L1 o5 l- D+ @
' c1 f$ b M8 p/ r; b0 i' q6 F#importing keras
& H' |) D/ z! l& ~; M7 X3 c+ Jimport keras
' Y/ j) o/ L. k( G#importing sequential module
0 k, z& B2 o0 }& R: J9 Q( U% a$ Rfrom keras.models import Sequential7 t) C& J* t# r' K, e
# import dense module for hidden layers
+ K7 ]0 g0 g" r( }$ @) z' l* |! Jfrom keras.layers import Dense
) c4 L4 T" r2 m9 o% F3 \' ?3 }#importing activation functions# L+ v0 @& a+ c; h+ z% G! H
from keras.layers import LeakyReLU,PReLU,ELU$ ^6 X0 V0 m! m# ]" K/ M
from keras.layers import Dropout S7 P1 D- ]% O+ v( s
8 L/ h/ c% r+ E' \- \* a2 G创建层+ ]6 G' R7 T0 Y! `3 I( D$ T
导入这些库后,我们创建了三种类型的层:
( q: H* t, b9 f) L' t! B% W: K2 H$ R" z8 Z' T
输入层- V [$ R( {$ j" Y. l6 L
- P j3 N+ {$ t6 Z
隐藏层2 n d, J) B8 S# i6 H" \$ s
! m" _) x3 n2 B% H
输出层% \, `" T+ `) p% ? H' Y
# ?" Z( V1 l) e5 C" K) P
首先,我们创建模型:
% s( q1 f' T# x1 g5 H: t- S3 x, q/ \8 w8 x9 q7 {! O" I+ e
#creating model
. [* a1 [" V6 Y$ a' p$ _% ^classifier = Sequential()
# A4 F6 w: a$ l$ ]% r* @) _0 z$ W3 L( V7 g0 C5 y) t$ D
Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
c; K4 _3 r% z2 c3 Z
( I: U6 n1 E) l8 a现在我们创建神经网络的层:: G9 t$ |8 b) G+ f; Z8 }2 i
, R# w+ L, m+ L7 x; v; Z* k2 v$ N. \#first hidden layer+ U9 y0 G0 y4 ]) Y
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))
- x! n, d5 f4 i; E6 u$ d#second hidden layer- a, k* I+ C' m
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
& E7 H0 `, F0 { m1 \, L( V' d# last layer or output layer1 Y. b* {1 c4 J+ j' v9 i `
classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))6 i6 X' n7 U) N7 Q7 _0 P% `# U
% P6 y0 H9 Q* w+ m* N
在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
: ]& u% `5 a0 \5 T6 C. O
7 t. p' X. O$ j9 V# V* f- a8 G第一个参数是输出节点
( P; c( m. X9 s. H" l2 E" ?9 X9 Q; T7 l# D6 H, D! u8 E& H7 y
第二个是内核权重矩阵的初始化器
* c: h) `7 W8 m2 X ?9 L1 Y% ~0 ~: F7 l$ C
第三个是激活函数
" a" h" ^# s% B! e- r5 H, w2 |; M2 Z5 y) V
最后一个参数是输入节点或独立特征的数量。
) k+ b+ J, W! Z$ {: R
% }2 n( q3 C8 k执行此代码后,我们使用以下方法对其进行总结:
4 A( F% {) @+ o#taking summary of layers
& s2 F! k1 V' j$ ^classifier.summary()% a5 z+ Y3 k* ?' y* d8 Z
; `( l8 \8 |) m, ]
' C& q8 J* ^ j/ B编译人工神经网络
/ h8 Z6 r5 J( V4 x, T' U8 g& y+ j0 |4 _现在我们用优化器编译我们的模型:
1 f3 W/ X: X( r% |0 X7 Y0 l4 ~' ~8 L
#compiling the ANN5 p* _2 c$ T. s9 G# h
classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
+ X% T; m9 g1 B( D9 ~& N; t+ y: P, h" x
将 ANN 拟合到训练数据中: Z; o& h. d m9 q+ {# l
编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:9 [: M Q5 c& o
r8 d4 m/ D) g* i6 y
#fitting the ANN to the training set& z" ^+ `9 d9 c
model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100), [. N- Y( @/ \; Z
" S2 x* z8 o7 H- k
' f1 g! S7 M! n2 [( @/ Hit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
: o: J1 U! Z" d) h9 R: H
6 h5 w1 p3 j {# a2 F( G- n. Z$ e% T在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:# l% y; v9 q" D K6 J; r
^4 m/ a/ O; U1 t
#now testing for Test data
% M P$ q; R' oy_pred = classifier.predict(test)& W0 d7 E! r @: x
, |+ B# l5 X! @+ U( c在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
" O% ?( h* ~" c" n9 E5 R& e2 J x( ]7 j& Y. x
#converting values
+ ]& A* O' D9 C( @; L" A: X) Ky_pred = (y_pred>0.5)$ h: P2 O- V. N' \1 M; J. c# X8 E
print(y_pred)
1 M+ K" E# N: l6 {$ Y% h; ^- ?: ?, _0 q
3 p. z4 H! V' m8 t7 x8 z8 r1 ~5 N6 P( w
分数和混淆矩阵0 G1 D" M2 G* }7 z! n+ V
现在我们检查混淆矩阵和预测值的分数。* z% N* K) |% }! S* p* P3 w* H
7 k1 \! _ g( a/ O4 a
from sklearn.metrics import confusion_matrix- q G6 I C0 S$ J" ] X# g
from sklearn.metrics import accuracy_score0 ?$ _$ q4 G. `; o' g5 _
cm = confusion_matrix(ytest,y_pred)
$ L! n$ F% e( W" C- H! t2 \: {score = accuracy_score(ytest,y_pred): y& f7 F9 ~% N. k- _- K
print(cm)
# W6 U+ c+ ~, P$ u& a" D( Yprint('score is:',score)! ?1 O) Y7 o; E0 t4 i
7 d/ J* w) h3 w! w: I( X) ^4 @输出:
* j& ~ k3 Z! c9 u
9 z! ]% Y* `0 l1 I% m% {( T6 V+ g! N% p5 H E9 j
+ e1 Y7 V# C" u% f3 s
可视化混淆矩阵
0 i1 z0 a5 w. Q) W0 o! m4 G; U在这里,我们可视化预测值的混淆矩阵
8 S6 i3 d8 L. @5 R
: P( l M, Q7 b6 v" s% c# creating heatmap of comfussion matrix
/ a5 [ G; ]9 o5 Y [6 `% w' gplt.figure(figsize=[14,7]), ~# E1 M" b1 m3 W* y/ U
sb.heatmap(cm,annot=True)6 m" I O$ R& |8 v" ?
plt.show()) {6 C, G( V' k& T! O4 a6 c9 b
3 k8 u9 f1 x- |; F. |. k
4 w3 n$ M6 b/ M* d* N
6 R+ o! V6 p/ y+ n) i4 @5 X可视化数据历史" A. x6 j1 ^& ]* v+ m; H# ^* S
现在我们可视化每个时期的损失和准确性。
& j' N( {* {& H' E! B+ \7 t8 A: w: }7 @7 X
# list all data in history# A3 n9 D$ E s, \3 u* L, b
print(model.history.keys())
/ b/ z% S9 j- U( D9 M# summarize history for accuracy+ b: q! \7 }; A) O; o8 ]+ E
plt.plot(model.history['accuracy'])& I# e2 N( I0 m: u- Z
plt.title('model accuracy'). m# W+ w4 F; `" t% u
plt.ylabel('accuracy')) l Z1 @+ ~$ z; O) A8 d6 \
plt.xlabel('epoch')5 X; q7 U0 S) X; X
plt.legend(['train', 'test'], loc='upper left'): `" H* J$ m8 C& g5 g4 W
plt.show()" O/ z' Z% O8 O9 g& G0 P$ X
& B7 J$ c8 u. O# U![]()
: b5 n% e2 H5 {* P$ z
! n, f# t) R M6 f4 e' a4 o* H
) e- |+ T6 h3 W' d& d8 E# summarize history for loss
8 t$ j, ?/ D$ r; d0 T; C+ ~, [plt.plot(model.history['loss'])
( _& S) S$ C% B- fplt.title('model loss')
7 N w( e- v- mplt.ylabel('loss')
! N* y5 q# w, P e- b3 Bplt.xlabel('epoch')
( n, L1 ` ?; jplt.legend(['train', 'test'], loc='upper left')
& y( s8 Z: N+ O/ G+ K6 _plt.show()5 J6 m1 `: t9 J" `
1 Y5 k, a' r4 K" L 9 q* J6 b x1 ` s$ K) `
5 a9 H8 y# q+ h
保存模型最后,我们保存我们的模型 - 2 ^: B$ k$ l* R2 K3 ]1 b
9 C' I7 `( o4 T8 B! h& P# `#saving the model
: x7 S+ `- P1 [) E H2 l, n! C5 Y
" v% e' d6 P3 S( w+ O! ?
" i: |4 i; M3 \9 o
( G i! e) g( N4 Nclassifier.save('File_name.h5')
2 [$ v% K9 d+ o: z7 Y$ e5 S. q+ U' l% a# K
- 2 O- B' o$ B( ^& x, k+ M! ~
) `: T5 Z8 @; ]$ Z- R* L7 Y
9 D4 R6 l* Z3 h# x
* A! M1 D; q6 {0 [! E4 m( J4 I1 Y; `- |' \& P
|