使用乳腺癌数据集的人工神经网络人工神经网络
* i! {5 A) v0 k+ K! \9 x顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
* E+ J: F$ k' u3 ~6 B. G: n1 R8 P2 t# i/ H6 l V9 V! `/ a2 @# h' g+ _% S( ]6 o
大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
2 i5 `: X0 }& E7 v( z- B7 q( h/ `& b( l) n( @3 T* C( M5 y
它由三层组成,分别是:
! w3 Q! ]8 u, e8 ^. d0 f" D0 Q: a; W
输入层
h" ~0 h! k) D4 P- k j {2 O0 s& j9 k& d% ]/ M
隐藏层
0 H4 l" c4 l2 `9 U9 @' P0 U; O# |# |7 U: h
输出层; b7 a4 `, Y& T* V& p
1 W2 s6 t( ~8 k- c- i9 L
6 [$ I+ S" ?: D- I3 o1 H使用乳腺癌数据集创建ANN
: ^# C t) s7 k4 U2 e现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。" p/ ]' j. L1 Y: q$ T
6 @6 S2 D; J' H4 l% n3 K( t- q首先,我们采用乳腺癌的数据集,然后继续前进。
$ i8 [2 T* [& g1 l# p3 X. P3 t, Y3 f' p7 {; q; e
乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data' F. k% q/ m* Z7 c6 Q6 d
! r' u& x, X* O& ?1 G4 a- r4 D& d
下载数据集后,我们将导入所需的重要库。; `& z8 _# t0 O9 u+ _; ~+ l. j
: ~( Q* e* @& p5 f) x: A' F
导入库9 X, F! A/ n. N, g+ [( H% f
#import pandas
; x! h4 x5 _2 \6 d# u9 Fimport pandas as pd% w& ^7 P+ w2 x$ R' _$ t
#import numpy& r, _# ] X9 w: E; B
import numpy as np
% C5 H1 f6 I. \1 j7 D7 o# b. i/ Oimport matplotlib.pyplot as plt5 p( [9 u, p# R
import seaborn as sb; W5 p( _2 K3 S+ [% l& W% d4 t
这里我们导入了 pandas、NumPy 和一些可视化库。
* H7 }: u% V9 ]3 T/ C+ \现在我们使用pandas加载我们的数据集:
V" |8 S9 C- j$ Z2 hdf = pd.read_csv('Breast_cancer.csv')
' H. F4 e( G+ jdf
; b5 ]; [% O. _0 T z: `$ ] ![]()
4 c3 r6 c0 R/ Q* v' C/ S R+ P2 F- K& |. i0 ^" ~
在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
# Z/ z+ Y3 T6 G' h1 C1 W5 x) S. k$ G) S
# counting values of variables in 'diagnosis'
/ g* d Z+ n( A! \4 ]df['diagnosis'].value_counts(). D3 |7 S% ~) ?4 N" P
![]()
# l( ^- P( G6 B: J( X1 `7 ~ J: k( L$ @' I% r& c2 J2 _3 A% ~# R- l9 h
现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数& W, O" J9 Y# \. n1 o6 K9 Z5 ?1 U- x
plt.figure(figsize=[17,9]) [) C* b" }% n2 m, a- f
sb.countplot(df['diagnosis'].value_counts())8 v* v* z3 w6 `" R
plt.show()0 m, [0 @ M- C" q, g7 w' A
+ r5 x2 Y. ?2 V- R0 `. ]3 y
$ ?# ^1 S7 I( S6 ~4 e
空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值:
' i% v6 f7 J+ h7 W! M- @; P7 ddf.isnull().sum()
* ]6 ~4 o3 L" V" F+ x/ O 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。+ \ L+ Y& w! f6 X9 p F% F
: P f9 I8 e! n#droping feature+ a3 Z" l, Z9 g) N
df.drop(['Unnamed: 32','id'],axis=1,inplace=True)* t5 L+ `. u" L2 o, V: ~
0 P) J j1 n1 B8 f自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。
d1 w1 `/ c+ w `9 U# independent variables
- L U/ [) m ~# Z0 C! @3 B% T7 mx = df.drop('diagnosis',axis=1)! O* u& ~2 _8 M/ L
#dependent variables5 J1 a* h. R; z C# D% H& z+ z* h) B
y = df.diagnosis6 [; }' ^* r0 S' V1 _ X% b
处理分类值* D, y5 {% p: [ V
当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
. C; N. H* t- j y9 Y4 ^6 y! y) D1 u1 k v3 j( [) h5 o- y
from sklearn.preprocessing import LabelEncoder; n& X( i$ W! o# S8 A4 H: O5 t; }
#creating the object
3 T: K, ~: Y# U* G" }6 klb = LabelEncoder()* n6 r2 n+ D# R4 I% e- l1 a
y = lb.fit_transform(y)7 d7 `2 y7 ~9 Y4 S
" `5 p, K& \ V7 Z; r拆分数据7 n i+ @( M1 V4 k; g* \$ \7 Y/ e
现在是时候将数据拆分为训练和测试部分了:
! E) h" q- F) o5 W
3 B1 H" O9 T& ~/ M3 [0 pfrom sklearn.model_selection import train_test_split8 w5 M3 o; C5 ~
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)* \0 L' [4 |6 s, c. q+ F/ b. {% P0 [9 \
4 B/ {7 j: l( q% Y3 F( V缩放数据
0 y( f. E9 z8 _+ v/ t当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
+ N4 A% i0 ^, {- a
2 c2 {7 p3 J K8 ^/ V5 l) F" A对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
9 e# ~4 ?* ~' i* i; E# {
& Y' b1 H8 `* n* p#importing StandardScaler; c3 K& u! J/ Y$ B0 B4 I% N
from sklearn.preprocessing import StandardScaler
# O4 M) i( z% z#creating object* A6 H1 M6 n9 `0 M) c! Z
sc = StandardScaler()
+ l0 l2 v a( w' k; L4 U+ y5 wxtrain = sc.fit_transform(xtrain); I3 x0 t; ]5 f
xtest = sc.transform(xtest)" e* G8 f4 H" _4 q
1 G- H, w- M( T
从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:6 y c' W7 m8 v. u; b' r
" l4 M/ c6 b6 r' N' B2 B2 ?, ~
#importing keras
$ f L) d8 A+ _/ K) w( n' Oimport keras
6 w* `, l6 L/ L& e& G2 A#importing sequential module
- i4 Y* z, M: a5 [5 efrom keras.models import Sequential- H' ?8 l% C7 I3 f4 o# X5 k
# import dense module for hidden layers( r1 R6 h0 O7 ]; _; ~! h
from keras.layers import Dense
. s1 {: I4 U: T% V8 G#importing activation functions
/ ~& a0 f$ N- F# R) @from keras.layers import LeakyReLU,PReLU,ELU
6 f7 v ?/ r% ]: _0 [' y7 D: F2 jfrom keras.layers import Dropout. |; y2 n* E( l' [! M
' N3 E/ j. `0 u% F F创建层9 U, w+ L' o6 W$ C: T9 a
导入这些库后,我们创建了三种类型的层:
|+ |: f) N, Y5 c. `' R
" @) G7 {, y8 L- Z7 z- r输入层) u( R# _+ j h/ Q) L! i, a
5 J) x" `0 V9 F. C, |) _$ B隐藏层' ?8 z1 W8 s) K' |- B
2 r! ^+ n7 G' ~- v) E6 E+ m
输出层 J# R6 b& Y0 M& y* _& ]3 |
5 Z0 f% s) N2 {8 k: H% O; B2 B首先,我们创建模型:2 I u* u. l8 t( ?4 o* U9 V. J
0 V5 e- I1 w5 _$ z#creating model
+ {+ s( h% n5 G1 p# @3 H' O+ K- _classifier = Sequential()
a* e# B' O; `5 k& F/ a
2 h8 m$ E+ [- N9 f Q9 vSequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
) d# ?; O' H c
. j: U0 j1 [. H现在我们创建神经网络的层:
! @$ ]4 m3 c1 O( h$ l' c
! E$ L5 V: H$ D0 t0 W#first hidden layer8 R0 X& X/ ]( C) q1 B, l
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))
a4 ^: ]9 t& D9 O#second hidden layer' }) Q8 T; q* t7 S! a0 A
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))0 y1 g2 b3 R( w! C2 E5 c4 |
# last layer or output layer
# Z4 X( @/ {2 }" }, x, [classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
& |1 s' G2 h. [7 m8 q% a4 b/ {1 a% S$ X4 w
在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
) o4 x3 t/ j- l" y9 H& V$ j
# R4 G+ G: {6 A2 z, {* w第一个参数是输出节点
8 v3 @$ K3 t/ w) j/ o- i: ]
8 B, M% o9 D! S4 d z3 Z" ~第二个是内核权重矩阵的初始化器" B$ B4 C& \$ V7 ` h5 l6 r, R
4 ?9 l6 ^; G) R; }6 s3 t第三个是激活函数: M5 R5 q* v$ S9 u: z
& J A9 a8 B6 t3 H: i8 w& T2 H
最后一个参数是输入节点或独立特征的数量。
; w3 P3 V9 K$ T2 C w
5 F. O) ?$ k1 \4 J7 Y V执行此代码后,我们使用以下方法对其进行总结:" b2 Y* P3 v# |2 X
#taking summary of layers5 W, U: K0 h* \, @: a! b
classifier.summary()
1 u; C9 i, i9 K. x 9 C( s# k0 V9 s+ P: Y# E9 w
$ ?% l) R# A; S& y; j! W% h' b! u! A
编译人工神经网络
, S) @* P. b! |% M2 @5 h现在我们用优化器编译我们的模型:) z+ I) T9 s2 G$ |$ ]
2 T. R% Z+ H. k: A6 `" k#compiling the ANN
+ }2 R1 | s+ Zclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])' D! i4 ]: {3 y* J0 @! v6 n" h" C X
* c/ X2 m6 @" q) _" L
将 ANN 拟合到训练数据中) h6 q# @ ^' y) Z* q" M
编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:7 |" H' B. P* ^% s
$ [. f, C* P; }
#fitting the ANN to the training set
# e" f( d2 n* `' g7 u, o" n* {. N5 Kmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
o* z7 V* _+ ` 9 l. G& E. U. y m
$ E1 p1 K0 v7 n4 C
it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
; R. B' H+ m/ S- G+ W# \. U u0 O I8 t, I6 E t( p
在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:/ `2 o% c: s3 o
! d/ y1 p2 z4 W7 }+ m#now testing for Test data/ q) j! K7 a @# d3 s# P, l
y_pred = classifier.predict(test)
3 _! G2 N! B5 S e& o
# _' d4 S9 C2 Q5 q; W/ u在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
z! y* E7 k4 l: V: `1 e1 ^" h0 p) j1 e) T' e- l4 z4 @
#converting values$ N) F& \! x# O9 j" }
y_pred = (y_pred>0.5)+ i# h; ~: X; I( _) c
print(y_pred)
, J& X0 @9 y( n: N. T. V+ F4 f2 C7 r8 p8 ~
/ }( }* g9 t3 y; ? Q7 {, n) J' [& v) L+ ~4 B7 o3 h2 v
分数和混淆矩阵
* f# g) B: G+ _! U* ]6 F4 { v现在我们检查混淆矩阵和预测值的分数。
$ V( {; |$ I5 n/ r0 O" i- b( D+ m1 K' B F$ o
from sklearn.metrics import confusion_matrix. u: x) T$ b. m; I+ ?
from sklearn.metrics import accuracy_score
* f/ u! l8 U/ W2 S- ^, K; t! p acm = confusion_matrix(ytest,y_pred)
3 {3 F9 U* i8 E$ M! Zscore = accuracy_score(ytest,y_pred)
+ j: @) P3 a- d# qprint(cm)
" x3 \3 S3 E0 u3 a4 u. c: g. }print('score is:',score)
6 B. }4 D; k& B% ~7 P5 r8 y
, q) o) T1 s# Q输出:
- l; a8 L6 l( ]; p- T2 ~2 t7 j8 @( n6 L5 [$ Z5 x+ m
9 ]7 |. j: ]7 n
- [7 }2 \: h- [2 O4 x' o# b可视化混淆矩阵
7 |* k; R3 t& W# l& i在这里,我们可视化预测值的混淆矩阵
" E. K# _4 b$ K2 R. [4 W! B+ ~& d Q6 S. r+ x
# creating heatmap of comfussion matrix9 Z( r% @# m6 f, y J
plt.figure(figsize=[14,7])
# b+ Z w8 v; c6 [9 D& y8 M( Isb.heatmap(cm,annot=True): X, { I! K5 A) ^+ o; S% G6 I
plt.show()( `( u; u* |/ T1 R; `
2 q1 E8 d% V0 J' q% b7 x- C% ]! f
![]()
3 s1 Q2 f* Q* n
3 W3 N) w1 Z4 H1 s7 j r可视化数据历史
) T# D) }+ d" b% G: v* Y+ `+ E! \现在我们可视化每个时期的损失和准确性。
5 C6 {* G# @* R2 E0 F8 V& b9 a* }
# list all data in history2 D1 h9 u& v# w& I+ E. q, y
print(model.history.keys())0 ~, Z9 p6 I* }" E2 q7 i% r: N
# summarize history for accuracy
. b3 K, \# U* Cplt.plot(model.history['accuracy'])
3 q# i# W% L& D! l( [plt.title('model accuracy')' I% E" z# m* k- K
plt.ylabel('accuracy')3 F% \1 N5 h T% l. ^9 L; p
plt.xlabel('epoch')
8 Q8 R8 J+ |4 j, o5 b# U7 ^4 p0 @* F" Aplt.legend(['train', 'test'], loc='upper left')
: S4 D6 d; @- F% U. Q; @plt.show()
% }0 i% N3 f6 T4 Y$ J% X+ Q5 k
) F/ w R7 e0 o![]()
7 R- ]; E' W3 D% V
3 `5 E6 t1 s3 I) o1 f
9 [+ M: _. A+ J/ X, G* x& V5 j# summarize history for loss; E2 r/ j9 ~. @% M& @- S
plt.plot(model.history['loss'])
1 M2 W) D# [3 d$ y: ?plt.title('model loss')1 E) Q; k( X% s
plt.ylabel('loss')% J9 h) d- @) U/ n; s
plt.xlabel('epoch')
' ^% k$ a; _) T! Z0 v( k& `- b6 tplt.legend(['train', 'test'], loc='upper left')2 f5 Q8 @- f d. ]4 B
plt.show()/ o* n% U D* ]3 _
2 \9 U2 R" x6 o0 k: ]2 c& l 1 P- r' X/ y% w f6 i; p
2 c9 k/ B% ?; q. u4 U
保存模型最后,我们保存我们的模型 - # i& `* [$ I& c9 G) M- d
& _, L, `; x9 H k8 k {
#saving the model
0 X, R: l/ E4 y$ Q' E
% l: R' ^% E- g z" Q! I
( L6 f6 Y3 H/ i9 P9 v$ q9 G5 K- a9 o( x) u$ o; H
classifier.save('File_name.h5')
* C# e- E5 O* h* |$ Y$ i" z$ I1 t* B% h& q ?5 H
- $ N7 A. N4 J# |. V* U
& u3 S1 V; O5 O& y! Q& V+ _8 S
6 n) L' \$ z& Y. q
0 j) e: A: @4 g, y6 p7 r% E* `- X0 y \0 h3 }. c( v
|