使用乳腺癌数据集的人工神经网络人工神经网络
0 Q* n" y5 @+ r& P8 y# _5 Q顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
* W) H2 |! [1 X1 g- b7 ?( L
+ b4 @# ~ \9 ^大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
0 H1 h! u8 D1 i8 }( [8 ~" R
; q+ Q2 A9 G2 d# V$ T* P; |它由三层组成,分别是:" V* \" p+ J/ ` |7 r' V" X
- X {; ]7 a- C4 A1 p: ~' g输入层
: o: e9 {& _- Z3 H% ]/ f
) \4 K: w3 h' q0 I7 G隐藏层& P% b& g& Z' `
4 [) l/ D2 J% y: S: E: z6 L) c输出层
9 J9 v! O. W* k0 W [+ E0 V [( F0 h' @
- l* I0 Q1 ^3 _使用乳腺癌数据集创建ANN3 ^- J' R+ W' h% L$ p+ e- V- R
现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。
. ^% r1 \6 R% o. D; R# y; J4 ]0 Q9 i
首先,我们采用乳腺癌的数据集,然后继续前进。" t* @1 d$ R# _6 P% q+ x5 u& r
" d( M! i' j; u+ E- Z( l% T- N# A
乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data( y6 U1 f7 c# N0 i5 U
3 ]) X- P5 ]; }1 R3 R下载数据集后,我们将导入所需的重要库。
& Q" Z: {! N6 W: D# I) h' W) K2 K0 Y
导入库
/ A8 f2 O+ f6 v# L6 T0 r+ x4 U#import pandas
. W, l* P* ?6 h% a1 V( A* fimport pandas as pd
9 x- z5 {3 j, U+ ]( H5 i#import numpy
5 G& X8 }! g" E: o0 Pimport numpy as np+ G2 V6 u3 ]8 i6 `
import matplotlib.pyplot as plt
0 G6 X8 v. C' K( F& [; z7 qimport seaborn as sb
* K( N5 B. E7 I4 j1 w7 f/ ? 这里我们导入了 pandas、NumPy 和一些可视化库。
) r2 q# H8 {6 N# C& r现在我们使用pandas加载我们的数据集:
5 r2 K: j7 C* W$ V0 Bdf = pd.read_csv('Breast_cancer.csv')
2 ]6 k: A+ Y6 q7 |, idf
; }, E6 p" J1 u3 l @ ![]()
6 ^- I) X4 j6 f; f% W7 g! D- z2 ]( h2 g( x6 V) E# ~
在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
c) G7 |2 C1 u8 _% U1 B& v
/ d' Z* u/ u+ l5 J/ P: f6 I0 p# counting values of variables in 'diagnosis'
/ o5 f# T$ H9 Z) b) pdf['diagnosis'].value_counts()2 i. f0 D. g2 D
; I9 `- F4 z2 [5 @4 p$ W
) R. w+ X) d8 k4 x1 W! G8 y现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数, j5 M% d4 I. e; A; A$ Q3 s2 W/ V( }/ {
plt.figure(figsize=[17,9])
0 L; M& F) M$ p5 O3 u6 O7 Gsb.countplot(df['diagnosis'].value_counts()). `7 o3 P% A1 Q! I
plt.show()
) v4 O6 B! W1 e ![]()
/ w9 k; P& Y* Y* x3 I
, D( M6 k; d: Z/ H4 U空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值: ( d6 a! {' }5 h% E& O N
df.isnull().sum(). \8 R& S. W9 B5 O( n7 R) S
执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。 ^- z8 t" Q( L) q, }
7 T- Z K- c$ L$ H8 \- {#droping feature' j0 U( n* W( ?
df.drop(['Unnamed: 32','id'],axis=1,inplace=True)9 A2 m3 |: u; w8 i% @
& D; K+ `, p% I% b8 K; a. O
自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。
$ n- l8 Y. g; \( I |# independent variables
# ]: J; w/ Y4 S& v( V D/ hx = df.drop('diagnosis',axis=1)# W) A) P& q" Y' I$ z+ Q8 ~
#dependent variables
2 M$ J2 S a5 yy = df.diagnosis
: m2 h, s- q+ c! t; k0 H6 W& \! ^ 处理分类值6 i3 A- j& j, R. U ?
当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。- a8 Y$ v# W: s" Y3 V- K
4 s8 G* G2 I) t; Dfrom sklearn.preprocessing import LabelEncoder# }5 _# n, i9 X9 a& @% z( h
#creating the object
7 I* Y P Y3 u8 Q! L6 ^2 r1 c/ U+ u; D( jlb = LabelEncoder()0 b |/ k6 V9 a( d
y = lb.fit_transform(y)
# i2 U _% Y k* K2 k* z( w% f G( J% t& J3 K
拆分数据
3 B3 x. I3 q6 o- G# H' d现在是时候将数据拆分为训练和测试部分了:2 h, k" I% _) Z' c* n# Q f
0 q, y4 K0 I, Z2 }9 @' w
from sklearn.model_selection import train_test_split
! N3 | ~2 Y2 o, ^% r. ~xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
8 f7 q c9 `# |% V) x( S' `5 `2 X' j. M3 k9 v6 U
缩放数据
. a/ g- o( V1 Q* w) T9 z8 j/ M9 v! B8 C当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
( d6 u% t6 f4 l8 |
7 Z5 h" N' ]$ h0 m" h% ]. i3 P5 p对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
: d `/ U2 L! j4 D
. o9 W* A0 S9 i4 E6 W#importing StandardScaler
% q7 `+ Z; L4 s) o8 Rfrom sklearn.preprocessing import StandardScaler: N6 E# X* E4 P3 D |! e
#creating object0 z* I- _+ `" _& _3 b
sc = StandardScaler() f3 a3 f1 ]1 e
xtrain = sc.fit_transform(xtrain)
! N/ W8 d) d& F% n1 T9 n# l# ]xtest = sc.transform(xtest)
+ N* G$ w9 u5 P/ m6 m6 b$ d7 w" [! t( p; S: \& ]
从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
P) ^1 f3 W/ w
' `% s$ B3 i1 q! G#importing keras
7 `+ w8 }4 k7 H3 i2 ^+ Iimport keras
% g7 m1 o+ o& j o% A#importing sequential module
( Y# O8 w. _8 t9 K; | G& Mfrom keras.models import Sequential7 m5 A9 _6 [( E) u! m- \7 T
# import dense module for hidden layers
. L: }3 C: ` | M. Ifrom keras.layers import Dense
, t4 ]0 H" I/ Z7 p* t#importing activation functions# M. }: B0 U/ d9 Z. B6 g/ z
from keras.layers import LeakyReLU,PReLU,ELU
( H/ |7 I4 E- Gfrom keras.layers import Dropout
3 m$ T5 d* {4 l" z' t( O( i4 N5 s' t1 z8 U1 N8 e+ o2 g3 Y- p% `
创建层 I# n1 v2 E4 J% C/ ]
导入这些库后,我们创建了三种类型的层:
3 ~( I; r3 d5 ]+ f4 q! u# ?- p$ f! R0 i$ P
输入层
! D F( h. s: {% ^6 Z: F
/ R! P) R2 b& V4 G% B! v: E3 G隐藏层, S' a, j! u/ u% ]% ~3 f+ s
4 v: ^# V- f2 E% K
输出层
1 F! Z* O. }) N5 R7 A0 I( ]$ u, X9 e1 {9 [/ f9 Q7 G. Y I
首先,我们创建模型:; g: D# m" }, F$ d' H; A3 G
1 K0 X, J1 g7 i6 R$ ?2 j8 m#creating model
- x+ |2 O) ], O9 e1 M( X8 \1 zclassifier = Sequential()
' H4 @- r$ R% D( a) V: x8 }, g J; l( {* }- E" q
Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
/ h( U+ I3 ^/ c: L: j% K
1 o @' `) [$ V现在我们创建神经网络的层:
. x/ d8 D/ ^1 x3 x: N0 J* @8 g; o
0 L7 M$ ?" s- _( [#first hidden layer0 A- i/ D4 f: h5 e
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))! W& w1 ^, g' ?5 s
#second hidden layer& x4 Y" h ?: z
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
* I* b. i1 C" p" e4 P# last layer or output layer
6 |$ w. j6 v6 }0 _, C, F; j3 \classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))) ^9 I, O6 J: B' K2 U9 q6 w/ `4 U
! f/ ^3 ^0 M* U4 Q& V6 B在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
9 @& y; @2 `0 S/ t1 S9 F9 {7 A2 b6 y9 U) Q+ X
第一个参数是输出节点& I1 N) I, m- Z2 ?
. k- V+ m, v4 d. y' W
第二个是内核权重矩阵的初始化器6 ?; Y' L( ?( ?+ l. J" N, ?( j
3 }$ c& ^8 L) i8 n; [, L
第三个是激活函数
- p& z" P7 ~ M/ t8 ?4 C4 s) e N/ z' r3 y2 O# j& A
最后一个参数是输入节点或独立特征的数量。4 Y6 U) b" M8 {9 H. g+ {) O G6 ^
3 o$ ~( l* X4 i
执行此代码后,我们使用以下方法对其进行总结:+ G l, k; K% D
#taking summary of layers# @. k, k$ Y9 C2 l& a4 i
classifier.summary()
% C% [7 c. m# y; R & o e C6 c N* g4 p
2 S) S+ l4 ]( D' v* m- d
编译人工神经网络" t& X3 _) A/ L# e6 t' G2 j" l
现在我们用优化器编译我们的模型:
# ?8 t$ e' V# \, I7 Y8 g& \6 N: l4 b! Z8 [" R4 \: D
#compiling the ANN, l8 U( k' U; O& G4 ~% U
classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy']). x% d1 E) C! j" p, p# _0 C
: \0 \7 m3 C; {/ ]& J$ F/ a( M. @1 [
将 ANN 拟合到训练数据中
+ i- ^- ?! X' t) H- M编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:6 R8 ^2 |& }8 C
5 p% _ h! Q/ L) M #fitting the ANN to the training set
8 U5 r# W& j Nmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)- {- s0 d0 U, T& o4 E
![]()
5 F4 Y4 X) W! a3 z
' _! }9 z/ c, O# i$ xit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。- V9 N6 O. I ^2 l$ @
+ x" y' W0 E. k! n在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
! `$ d) I" ~. b V a j3 j) S. a$ ?
$ K F7 o( q* R. Y" z+ {, h#now testing for Test data6 Z9 ^" h ]5 F! q
y_pred = classifier.predict(test), v; t5 g, g4 E. x/ y
: H5 K6 Y# t1 P9 X/ b7 v- B
在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
( q) H: f+ Y4 X% s- j# [7 k5 T: F
: j7 X, q( s7 U, e4 \- d8 c. x- T#converting values
) p$ |/ i: h3 F% _$ ]$ j( Ry_pred = (y_pred>0.5)& N( D3 M+ ~5 Q" n. J" W" g" |
print(y_pred)+ f# A4 e# |# B
3 `, G# c4 n. _; u. R9 r2 L6 J
l: i" k- \3 \; E
" X; e" U( m5 p6 R2 S" V8 c% Y分数和混淆矩阵
6 Y! W$ z& m" j3 ]' o. S现在我们检查混淆矩阵和预测值的分数。! `9 ]. C8 W( f3 T$ A' B+ p
! |" }' W- U( G- u( I" R$ x. n
from sklearn.metrics import confusion_matrix6 H$ u, |9 q' O ^/ @
from sklearn.metrics import accuracy_score
3 ~' H& }: w: F6 R% ]) e( U& @cm = confusion_matrix(ytest,y_pred)
( n' S, |2 p Q3 B9 y2 u0 G# A" Bscore = accuracy_score(ytest,y_pred)$ o6 b' S! t2 ]/ I8 X
print(cm)& H% i3 C, ^$ ~. n) [
print('score is:',score)
% [& P$ b4 w x( Q; r: G3 @
" a/ h( P* S' w% ^& A! J1 y输出:
6 @4 _0 F' k& u' C9 F" j" U% E. g; U: c5 z4 T% ]
+ ?8 _' M! u; z& |/ X
) Q0 ]/ F$ F1 Z& q# o5 d可视化混淆矩阵' A) B5 l% ~1 J7 u% y: ?( z
在这里,我们可视化预测值的混淆矩阵
0 z% B, P7 L- P; w& y u6 o
( L; E1 i3 N1 s( H: u) s' R ?# creating heatmap of comfussion matrix
0 Q* n1 w* x/ I4 X8 Tplt.figure(figsize=[14,7])! ~3 P! |6 G0 j2 m
sb.heatmap(cm,annot=True)2 u# e! D. f- k6 ]
plt.show()
3 I0 E7 T$ g4 ^: ^; Y. O% t9 u8 y& t1 t a
/ ?( Z$ T7 u' v; u6 E
* \2 X m+ a& N% C1 S% R, h) M9 c
可视化数据历史
1 O" i- K n" E1 y& I现在我们可视化每个时期的损失和准确性。0 E; U+ r7 }# ~
. n( L6 y$ B% X3 b! O4 w! G# list all data in history
4 Y# Y9 U( R' sprint(model.history.keys())
& |4 x- a6 S& s5 ]" B# summarize history for accuracy
' a2 J3 L) Y3 dplt.plot(model.history['accuracy'])
* L! \3 C. B, S+ A" Qplt.title('model accuracy'). \4 g/ `5 d9 x. `1 t6 n5 o
plt.ylabel('accuracy')( ^% z7 E. Y4 M7 U% G; K
plt.xlabel('epoch')/ ]! `4 ]" E3 x0 A
plt.legend(['train', 'test'], loc='upper left')! X9 u! z8 b7 v% q S
plt.show()
4 a& Y4 J' x; k; Z) m0 J, x& F; b; y$ y4 |! ]1 d: {- X1 F
![]()
/ l5 r8 \3 j7 `0 M) w
4 R8 z6 k& @- ]* I3 b
X7 ]; c) E6 Y H. O) n0 @: @# summarize history for loss, q) L9 t! r5 w6 F8 [
plt.plot(model.history['loss'])& ^, ]6 X" j- Q( {/ m: i9 L/ w, J( H! r: k
plt.title('model loss')
: \; P4 I1 A3 fplt.ylabel('loss')% g3 l) F' i" J% c- n& l5 k
plt.xlabel('epoch')# h, _2 u& w7 B) x& D1 v
plt.legend(['train', 'test'], loc='upper left'), C- W& Y2 J0 {8 n! v4 n: f$ e
plt.show()# J- H- S( F/ K5 ~1 X& l! N1 d
, R& i/ f Y3 u9 h
6 R* T3 z& u( c6 _
/ K$ J' a3 f4 Y9 Q1 L, ^* T保存模型最后,我们保存我们的模型
) t2 o6 Z5 J; ^$ X/ t G3 I8 C% [" W5 o. @0 x6 U
#saving the model
2 R0 ^1 |' H8 \" Y+ C5 H8 s
( ]3 t q, C; @: T! q' ^# N% U
& |3 Z1 @- s# b f( ~7 N( w# ^& i1 z& G# R5 ?0 H
classifier.save('File_name.h5')
7 H! F% U# r' y4 i& b, m( N$ J% m, o* i1 z
- 0 Z4 ]2 ]* ~! R9 ` i$ k6 j- n
# c: n0 h# O. }% b) c . E0 A: Q$ x% q3 z8 i' |. \7 \
" E/ |. X `* C! r2 W6 m
+ G7 g: r1 l8 @" s! { |