使用乳腺癌数据集的人工神经网络人工神经网络
6 o( k/ _+ d* ^ h" d6 h2 ~4 P顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。4 K) N! e7 T" v
1 Y/ L! o2 Y/ R
大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。" N4 {" V+ \! c# `2 F
; n( L' s- _" D6 L6 m9 J它由三层组成,分别是:( {: V! M- ?1 O, ~6 z1 A
2 D4 I+ j& V" b: \! _% M9 E8 ]输入层
& c8 S8 Z3 n; z, w9 F8 A& T7 l) Y1 T9 M5 W4 e- Q6 m, H
隐藏层
6 B+ M3 B/ q% a b1 q3 ]. e9 i, n8 I, V+ n x
输出层5 |) Z4 S/ _# j7 k; M
+ E0 A$ M7 y3 x
O: ^. j% X) s1 I- g( n& W/ ^
使用乳腺癌数据集创建ANN
" R/ l, B( W& X1 Y; l p现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。3 I O' \9 b. b' ]9 E
: m0 ^& v) X$ u$ z, k
首先,我们采用乳腺癌的数据集,然后继续前进。& n# l& o* S }0 ^+ G1 L) \! H
/ M% r+ z; x2 n" X
乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data( n" e3 D6 G" z. {# L7 F
2 y5 f2 a) l, u. {" F
下载数据集后,我们将导入所需的重要库。
5 D( N9 k0 G, m$ K7 s% x2 m. y3 K J. H/ w- o; `7 s/ O
导入库1 @8 s( z% ^9 ]4 m/ m' t% {7 V: f
#import pandas! F. s# s5 ]% r) s
import pandas as pd9 W: n$ S" _: Q8 M
#import numpy7 n S# I- K, ]
import numpy as np8 G# b [0 c; j$ @
import matplotlib.pyplot as plt$ L) A( j J3 L/ a+ Z. e) ~
import seaborn as sb
9 ]$ k* p% R2 l3 x7 ]2 N 这里我们导入了 pandas、NumPy 和一些可视化库。; r: t8 I5 o' g
现在我们使用pandas加载我们的数据集: ! o; A4 f' d& m5 s+ C
df = pd.read_csv('Breast_cancer.csv')
) c0 x! j+ f( s4 h: m+ Qdf, I& f/ [* T6 ~. C/ c
![]()
+ E8 M2 _- Z. x4 n" V6 A& y! q, q5 d" I9 [
在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:; A: b9 O0 r5 r* _
6 x3 l& G% q0 g7 `1 l# counting values of variables in 'diagnosis'
! V9 k/ l" V8 ^) w9 J: X: l0 jdf['diagnosis'].value_counts()
$ H& K- S; O6 x3 p: ?. X i 6 B* @) O2 y" j" X" u
+ K* f. a) k8 d$ l7 j
现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数
% Z# K0 I! P1 o" `# cplt.figure(figsize=[17,9])
( ^" G6 o1 a" |1 ]& D& S4 v T4 {sb.countplot(df['diagnosis'].value_counts())
3 M& E4 j( i, B- x% ]5 _plt.show(): h$ F: a* d8 W; |' A
![]()
0 S6 [) o# w) a5 W' H. n/ I, v+ }7 a2 } J
空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值:
5 C5 J, G, T8 k5 ~( Odf.isnull().sum()8 D, u5 m1 i0 }/ n$ E9 L* k
执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。
' t$ O0 E! S# ^2 b) o
! F! `8 |) [3 _% f) F5 i#droping feature `. P0 p2 ?: o+ b0 P' [5 P5 {
df.drop(['Unnamed: 32','id'],axis=1,inplace=True)1 O& n* S% n4 a6 L$ c' ` ^
9 T% Z C' d, Y) @
自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。
, o; r/ u+ b3 ?( J2 P# independent variables: h- Z/ p: T J. u6 x# O8 z
x = df.drop('diagnosis',axis=1)" |2 v$ y% |2 E! w
#dependent variables
( D4 N9 u/ L9 ey = df.diagnosis& R2 X+ _9 M% V8 W; b
处理分类值7 W* \6 X Z8 W# o5 [) a' ?
当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
0 q( J. b. [% E) t) t) ^" j! W! w3 r0 f" |$ Z
from sklearn.preprocessing import LabelEncoder
- a; s: T0 P. h9 _) w#creating the object
. N& M( s- L! {6 Y+ Olb = LabelEncoder()1 @, @# k; q& z8 y7 U
y = lb.fit_transform(y)
/ X" x: g2 C7 P+ K# ~. h9 F8 U
! W6 q. C z2 z T0 p, r拆分数据
- j& n+ a# `; e现在是时候将数据拆分为训练和测试部分了:
. P! a2 H2 D% X# Q
& b5 [ a2 C" e I' j6 {from sklearn.model_selection import train_test_split- O4 h! ?$ B9 A5 h; w4 f" h: f- p
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40): _3 c m( h% C2 c! `
0 l* ?' R) ^$ y
缩放数据
e1 N9 F" X, ]' K' j( d7 x当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
6 ~- n3 e7 \: [9 B U0 ^
$ @! G! c: W5 a( J对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
1 W$ b* H4 g4 m j, R
8 v8 f# X7 f: @2 R* Q# q6 u#importing StandardScaler! W# O5 ?' t$ U" L
from sklearn.preprocessing import StandardScaler m+ o m, ]/ i8 k6 g) P( s5 p
#creating object/ j4 y$ t& \' K v+ h% `0 A
sc = StandardScaler()6 D7 L, C6 I% w5 Y
xtrain = sc.fit_transform(xtrain)
/ {' c4 J# ]# N \6 _9 Uxtest = sc.transform(xtest)
* t- h- ]1 ]2 k
- z2 P) H' C& U9 H* X% e# H从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
0 w% t, B5 }" P+ ]
! P* i. i% y5 }! d9 |" m#importing keras0 m/ L6 U4 [/ X) ^
import keras! H7 j) T% F8 V: @9 }
#importing sequential module' C, q% `" g- S5 s
from keras.models import Sequential
5 @5 T# s- A( k* J" q# import dense module for hidden layers9 j2 n' @3 Z) ]+ ^8 i
from keras.layers import Dense# {* u, N7 V2 e7 R0 W2 O# V
#importing activation functions
3 {( V" v2 j( ~9 o- {( p) Qfrom keras.layers import LeakyReLU,PReLU,ELU
0 ?; f, _/ w+ D+ T. M! Hfrom keras.layers import Dropout5 e/ `' I8 b: o" ?* O( R& R# Y0 W
+ e& u, j, F1 m/ G0 g' V
创建层
$ o+ ~# f# ~; q* i9 z# |导入这些库后,我们创建了三种类型的层:
% g5 ?, V. \/ S% m7 N9 e3 v8 ]5 P, |8 U
输入层% G1 q! ]' u/ v* K, Y/ |' I
5 Z6 Q7 m5 B8 t0 f
隐藏层! o9 T8 z' g) `# X" r" E
: ]7 W1 Q. @: O6 z. o
输出层. q% f- e+ M4 V( Q0 u8 r1 X
; R1 D( d/ m& v4 b; W
首先,我们创建模型:2 n+ u W3 J& y
+ t J, N9 n8 t# G. |6 t" \7 c
#creating model
2 d# F8 t+ C( G1 A5 `classifier = Sequential()
x8 z7 m0 g& T, a8 K g9 p
0 @9 g! W0 @- O8 r# l3 DSequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。8 A( w4 f5 r4 L
; f$ ~) v: }) C4 f2 `( b& D3 _现在我们创建神经网络的层:( K' t* l8 }9 q- ^: m- `- z' j4 k
7 C' D! i5 f. g+ n3 k7 _& ^#first hidden layer b" C' c! E! L a
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))
! n+ {1 \8 g% \6 |3 F#second hidden layer
5 p/ D1 f/ w7 K2 l$ I( Tclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
4 o+ @! _# n& G* f ?# last layer or output layer
! j4 g- Q( h8 e0 X' I" u( lclassifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
. L n: l U1 ]4 c7 H- w+ n& p5 Y) C
在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
) P5 B6 T" m1 d4 H
! j7 D* t) f _! t第一个参数是输出节点
' c9 q( u( ]" g/ ^9 u( w) q2 V* y6 _, v) N; N
第二个是内核权重矩阵的初始化器# q0 f2 M3 n* _- Z
( k. Z& D; G* {
第三个是激活函数% V3 C. D0 u4 _# V
3 h# I" t- z) Z9 J
最后一个参数是输入节点或独立特征的数量。1 u- e& a4 C: @6 F
! m7 g" V Q% j* `. }, H1 M
执行此代码后,我们使用以下方法对其进行总结:
3 W, p( e6 u- i5 @#taking summary of layers4 T6 S# E7 W4 I k
classifier.summary()3 J" w) M7 a! q
; A! `) E% G# p6 W% q& h R0 @
6 b% V& M- _* _ Y$ d& `2 l编译人工神经网络+ Y( m# {" a* r: V! N: L+ b
现在我们用优化器编译我们的模型:: j* l( @" s. ~+ L3 m# G
4 N0 B1 e) Z7 a#compiling the ANN7 G! H1 ~6 m# K* s! ]" J6 q6 w
classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
2 |7 }0 B4 _( u/ X( c8 I1 F/ |1 S- |: b% M
将 ANN 拟合到训练数据中
6 E/ M8 ], H% I5 ^, g" h. x编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
$ r# h D7 f$ ^
# b* s. Q# R7 j$ V% M$ I #fitting the ANN to the training set4 |1 k" ?4 O! e! H
model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
) s/ p s! ~2 C' e- Y4 P ![]()
- y. K* A7 h8 a3 j/ z6 ~
O6 c" W- |1 T% xit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。! O, q0 X' _& s, u" u# `- p! G; T
4 f- R; C0 ^3 F" S' V
在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
% P/ x0 Q9 u& G8 W0 g0 G
" M! f6 O# |5 M. U#now testing for Test data
- G! X/ x5 \. m2 c, Gy_pred = classifier.predict(test)
7 Q& i3 j0 P8 K: q6 g% ~ l
( P6 \! n+ o+ ~7 |7 Y( U在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。% j0 F# ?" u: ]6 O% @: q0 @
& I) r5 E; l+ J6 N
#converting values
9 i$ J6 m; O/ x$ j* Fy_pred = (y_pred>0.5)' M# [; X" b; f1 h
print(y_pred)
# q V$ }1 U) J+ T: }0 O3 M
4 F) {/ Y* X* W" d
- P' I. J9 H! ]1 T: n& U/ w4 F! {! W
分数和混淆矩阵
* P. c& h5 B1 U( e$ U% r V现在我们检查混淆矩阵和预测值的分数。0 q; `7 x' [& d. `% _
% R4 I* P# |" e& s0 e; e. W
from sklearn.metrics import confusion_matrix
; I R4 f7 {3 g' C4 Vfrom sklearn.metrics import accuracy_score( v$ e# V- [( j8 p y
cm = confusion_matrix(ytest,y_pred)
?8 g7 Q# K9 F3 `score = accuracy_score(ytest,y_pred)
# A+ ]" |# {* ^ Xprint(cm)
: j. a" s" O" T" `$ {( Vprint('score is:',score)
2 L6 {9 A5 F7 h6 z7 A& g; z9 Z7 y$ A% U* u5 ^
输出:" D6 o6 {/ }9 z* P- @" [
1 o& p9 K( c. ^' F4 s0 h
& c+ W# f" \: Y0 h3 m: c- d- y
4 L7 j4 A& i. j
可视化混淆矩阵7 ]' O# T$ `( U6 b" o
在这里,我们可视化预测值的混淆矩阵
3 {: \: b t2 Y8 t2 y/ O& Z0 \; i4 f4 y8 X5 Y/ y# |" A6 A$ d7 v
# creating heatmap of comfussion matrix# g* D9 ~1 X5 A" G! [0 e# a9 f
plt.figure(figsize=[14,7])% f$ e" s |* O5 V
sb.heatmap(cm,annot=True)" p* i6 x. g8 x$ d K
plt.show()
- o' J0 g1 q0 r. q$ P0 x
5 z& d4 j" W% P G, e6 V" E![]()
: H' v9 A/ \- c/ A1 p! ~0 r& \
& A5 b% B6 i/ O) c4 h5 L可视化数据历史
$ ] R7 F! O: W, s- \现在我们可视化每个时期的损失和准确性。
) f# j: M3 Y6 ~7 T/ b" N6 E7 c7 D" P& b, a$ \9 _ O
# list all data in history1 V" L: t! ]5 P }( @3 V& c3 Y( W+ s
print(model.history.keys())
6 a- f( j4 ]+ K/ [: d4 c# summarize history for accuracy+ |4 Y) l+ Z, E$ b5 b6 v3 ^- H
plt.plot(model.history['accuracy'])# {( y) B- e- O! n! F# B
plt.title('model accuracy')
. f/ T* ~& S' w" Kplt.ylabel('accuracy')( n- u8 a1 F* T; \$ E& H/ ?
plt.xlabel('epoch')
' v j; N1 L+ w+ g. n- z4 bplt.legend(['train', 'test'], loc='upper left')( Z" i8 h" T2 x" w
plt.show()
# k0 h5 s; v- j( a- I, ?: X! G
/ d J# f5 h: h 5 ~9 p5 w. P1 I
( {6 k6 ?7 J d6 N1 f) Z/ Y) i6 u( f
# summarize history for loss
0 W. y, o9 g: U, K `: `plt.plot(model.history['loss'])- M+ f* a7 b$ ]% ]) r
plt.title('model loss')2 ?. u3 B J7 U1 A( j+ A1 s
plt.ylabel('loss'), n- O" d' Z! e5 j7 Y3 R
plt.xlabel('epoch')" C& ^/ v. ^; \5 p: g
plt.legend(['train', 'test'], loc='upper left')
|- i/ Y e: Q1 Q7 H6 H$ Mplt.show()6 ^7 ?1 A) w5 v! P9 s1 B0 J- o# p
7 l% j6 N& |! p+ H8 C
# I, J, G) x: v" p7 Y3 a
0 e6 W3 |3 I% E保存模型最后,我们保存我们的模型 - M: Z; m7 t/ I4 V
4 Y* D! e6 A: U7 m0 ]
#saving the model/ e1 D' T9 l. v2 m7 V' R
$ X1 b9 E$ D. A5 C$ z: _" n& T
* K! C) S/ t, Z9 x3 l+ q1 C# w) ]8 Q" q' N
classifier.save('File_name.h5')3 h4 l; n4 ~0 l
4 K) F# T7 e. \! x) h+ E- ( p' O4 C' Y- m; c& M
" h5 Y2 M& `+ Z+ w+ L7 N8 P
! l! p( z' {1 C' F' \
: m7 V2 u' r9 d+ F/ s7 K+ {1 W2 y( j+ R: b' z% m. H$ _, j. m
|