使用乳腺癌数据集的人工神经网络人工神经网络/ r. P0 M( I, Z6 [
顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。+ @4 a" |3 u1 b: @) o
+ s* |% \/ @' e4 o8 a E
大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
0 T3 A) d% g1 J% w
8 s, d* m/ I. L! o它由三层组成,分别是:
, }" ?- Z1 b, G. |
3 u3 k/ Y! ^ _# d输入层6 L3 Y+ w& _; `
6 L4 v4 J: a% m, F% c
隐藏层
% b( W4 s% C! L+ b5 l4 K
& p4 ?. i+ X, x' ] w输出层
8 M0 W5 q! Z- @- q5 f) T. }![]()
" k* B" Q1 r5 C& i! Q2 u% ^3 w6 Q( e8 A4 U
使用乳腺癌数据集创建ANN7 I8 i& Q6 o- B. R( C$ k, T
现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。
" r# e: q# c. ?- I4 V) o7 G1 }0 x
9 v: @5 o$ T, r) L! G首先,我们采用乳腺癌的数据集,然后继续前进。% [$ m8 q. e Q! R; J' L
; y* v! g* B' H) T6 N+ ]
乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
; @0 `! R* r' e
4 y/ M; y4 F& s# l7 q下载数据集后,我们将导入所需的重要库。8 {5 N: c( V) X4 I: h D2 N" a- L
4 d2 `3 f l! ?: Z
导入库
( i k4 p5 ]2 u4 H# m9 x#import pandas
8 F& K; s2 B7 D% limport pandas as pd
4 X. a/ Z n, ^, K2 P#import numpy
7 t1 r7 { v, x6 g0 S% Gimport numpy as np
T/ F0 j$ ]) ~- ^* x& d) yimport matplotlib.pyplot as plt6 l8 {" O6 v" ~* E# q
import seaborn as sb7 E& g1 U4 M- m* P2 Z; R r
这里我们导入了 pandas、NumPy 和一些可视化库。8 X' i( @& e4 ^. z1 l% C" `
现在我们使用pandas加载我们的数据集: ( H4 }# C2 E* s! z k
df = pd.read_csv('Breast_cancer.csv')+ _+ n/ }9 t% b. u4 O: ?
df! Q- @* ^( \3 ?
![]()
6 Q# ]8 W4 t3 z [% v p+ ~( h5 f3 y" @/ j5 c7 W
在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:$ _! L' A7 ` p0 W
$ s3 C" V) I( P9 w" }# counting values of variables in 'diagnosis'! g5 q J+ |4 @& [/ I* Y# P
df['diagnosis'].value_counts()1 `7 k h P( x
![]()
% N N3 L1 U: J" O( w1 Z$ S+ J: ^% h& A0 Z' D( l
现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数( n2 L* d4 a' S9 G& u
plt.figure(figsize=[17,9])9 N }# G% b& Z% P3 u
sb.countplot(df['diagnosis'].value_counts())
) |/ N3 C' }& Xplt.show() z+ y1 V9 ^4 ]7 q4 z3 o7 @+ p$ L1 o% G
![]()
* ~: o- @6 Z: K" w% p( f7 u" \8 w5 [5 T* j
空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值: ' l, ^0 h/ s i8 y# j- y
df.isnull().sum(), ]! j( q8 u7 k9 ?9 R
执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。$ i- l3 Q9 f8 v u% m8 R1 R, C
/ T7 }; @5 s" v( j#droping feature
% R' v) d' i# z: q6 [6 T- ]& }df.drop(['Unnamed: 32','id'],axis=1,inplace=True)1 W0 ?1 O3 e2 q& G4 t
0 [7 ?/ g A! Q. c自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。 0 g, g6 y* f! E* h
# independent variables
% h# |: X% b! q8 x9 s) Z ox = df.drop('diagnosis',axis=1)8 w' G+ t) a8 U- N3 _: `! R; B O1 m
#dependent variables) D3 c5 @* W- \/ |. u1 ^# e0 Z% ?* D
y = df.diagnosis
6 n1 W8 N6 W* f n: Q% O# C 处理分类值
g; W7 K- H D* T) b当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
( _8 h2 x, O6 N7 D& r
S# G7 u- k" |from sklearn.preprocessing import LabelEncoder
! M& L% o/ Y! }+ N#creating the object
0 C2 N3 H) W8 n+ `lb = LabelEncoder()) L/ `% J2 k: w) [
y = lb.fit_transform(y)' b" ]4 c4 t, H$ L5 d. r d" J
6 ^; o3 N3 R8 w
拆分数据5 |+ f5 \& s: Q% N, q+ S
现在是时候将数据拆分为训练和测试部分了:
/ G9 E" v6 K6 h
$ I3 C- I& i' g2 B c" d6 |4 Rfrom sklearn.model_selection import train_test_split
: W% W. j/ L% l0 Z9 \xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
8 P& \" D& g$ N% L
; M0 E' `0 F0 H缩放数据6 U" [' V/ I* G J
当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
8 y& k2 Z2 Q) I% Q& d9 D2 F- I; h! K, h/ F
对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:. w: P5 j- `. v" R/ r" z3 k4 Q
. ^! f* K0 f8 Z8 o0 H, C V# |4 s; B! D; q
#importing StandardScaler
# h9 T( i3 Z. Y* c: ~- y3 Wfrom sklearn.preprocessing import StandardScaler
, `; w+ c' ]9 F o: q) H" A% k; Q#creating object
2 F" u o/ B0 s1 D, }9 F! jsc = StandardScaler()' j! @8 V6 a4 |) [+ B
xtrain = sc.fit_transform(xtrain)
- u9 x0 S# M) X9 \4 ?! ~% ^xtest = sc.transform(xtest)
1 |. ^+ X* I2 [; v) x, q7 a2 T: p2 Y, ]( |
从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
, U8 r) ]# E9 G4 r n3 g
5 X; r5 \: T2 [# R/ p- u#importing keras5 n2 c. D& D$ O4 D2 J
import keras
/ Z5 F; x. {- j* |& P#importing sequential module4 n4 X& o$ T$ t v0 i% m% O7 r
from keras.models import Sequential
8 S3 y/ v2 o. H& R2 U8 o% T' G% l# import dense module for hidden layers
- f/ [( V+ U9 u( e/ afrom keras.layers import Dense
& x, ^& m6 z0 y* ~4 N#importing activation functions+ C# E1 m& F( z4 E
from keras.layers import LeakyReLU,PReLU,ELU' G' o) p( ?: \1 }. m
from keras.layers import Dropout% D1 s6 z1 E4 V0 T
2 y/ }- b/ e& f
创建层
& {! c7 m& e$ g: o: R导入这些库后,我们创建了三种类型的层:
4 _6 v. L' z. @+ w" L9 W' g# h4 q8 M$ V3 `
输入层
$ @/ W4 R4 c# m; H: _4 N; I& ]! i+ x
隐藏层3 p J7 |. ?5 I: ~) e/ W$ J
t9 R' p H0 a2 {& b
输出层3 ]8 _0 h' v, E8 U
' Y3 Q2 F7 N+ N8 F
首先,我们创建模型:& i ?0 f$ y$ S1 J1 U
4 X7 e- V) W w' j; J4 K. ?$ N#creating model
) W" H' b- K/ ?! k y0 @, @7 p3 Qclassifier = Sequential(), F2 }4 r: |3 d+ v& W! a8 q5 m7 T
$ g# A3 o6 j }! `$ X0 d& a, b
Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
0 K( t9 F+ q% U: Y% J2 ]
7 i. l2 b/ L) O5 y j* x现在我们创建神经网络的层:* b( m3 u! _$ ^, b& [ w( Q
" V$ |2 C" H s
#first hidden layer
! a( i/ L4 h5 I! v3 gclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))
+ b5 d& a( h' ~' X X1 n#second hidden layer
( e0 r* c. O7 L6 b7 A6 aclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
$ r- B6 |- U' i4 c( F2 A U4 P# last layer or output layer
3 _: D, E8 M% C8 K% lclassifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
6 y. {& `. ?2 e) F0 B9 S5 a E/ p& w+ X1 Z
在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。" a) F; x2 ?/ F! ?# M8 |
4 b c5 i9 |1 a. ]2 l* E4 z第一个参数是输出节点
- o1 L: R* t( L+ ? s |& m
" l- q# ?' [. r1 p+ Q第二个是内核权重矩阵的初始化器+ @) q- a5 C+ A/ L6 e
* M! ^0 i6 \7 }- |# B+ c- m
第三个是激活函数
0 r( R- ]5 A1 C* v" p {/ B( {% T; H' ^) C$ v
最后一个参数是输入节点或独立特征的数量。
* o2 [& s" M' t9 j9 f) _& S! q' i% a4 W: [& Q/ j, [
执行此代码后,我们使用以下方法对其进行总结:3 [1 x, q' [- s: n0 o3 @
#taking summary of layers
+ Y$ I/ ?$ G8 e; h$ Zclassifier.summary()' |4 Y7 R1 H; h/ ?" U, O! v, W
![]()
. b3 J l+ e& b0 Y; R- n
}" Z: [4 X9 c编译人工神经网络. r$ ^) v6 Q- i" f, ~% [' }
现在我们用优化器编译我们的模型:
. |6 ]' n. c+ w; l; F- \
C# p# Y$ ~1 a#compiling the ANN
! \; z# {7 t+ t' x0 K: ^classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
, f* l* G6 S; a
6 H' T! |. ~1 E- T( I将 ANN 拟合到训练数据中/ Y F4 p9 P2 R' K* P* U
编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
7 Q) [8 A7 o( C, j4 M5 |
8 u) I0 Z; O2 g0 d; b6 O #fitting the ANN to the training set. U5 \0 f6 c" j# a2 ]0 ]3 N. V
model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
5 A0 k- L2 B, x- p' R ![]()
; Z1 m; k/ P$ p A$ f% E
9 K |; a; k, G4 z G' \it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
- S g7 \) @ P/ d W6 ?
+ f4 M9 D- @5 z9 n在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
3 d0 c$ [+ @, u/ Q9 k( O3 M2 Q3 M; L B- X j5 v
#now testing for Test data
# e2 Y5 _. Z+ j$ @& ay_pred = classifier.predict(test)
* U$ x- D7 M3 J" Y: M+ L! G0 h1 G( D7 t4 W2 {
在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。; L& K. A5 a! X, h* j9 a+ O0 G ^1 \
2 ~- ~; i$ ~& g: B% j" u
#converting values
" p( Q" V( B7 z, o% b7 `y_pred = (y_pred>0.5)
! r$ r* C; O5 }7 Jprint(y_pred)
9 m$ ]3 a" H4 ~2 H, T( Q, b4 \- o0 e# Z
' ]3 Z: V% k9 ], ]8 L
g' o; i8 B7 G0 j8 o/ v分数和混淆矩阵
* Z `) _& ?' v; E3 d# M" j现在我们检查混淆矩阵和预测值的分数。5 Y1 X5 C0 L! Y/ `1 o- Z0 a
' @0 l& R% \( a& W/ Z
from sklearn.metrics import confusion_matrix
, l2 j0 k. V8 q( n+ D5 u6 a# dfrom sklearn.metrics import accuracy_score: d( q- n* k' @$ `2 M6 G4 @- L
cm = confusion_matrix(ytest,y_pred)
/ l5 @/ ^4 q9 J" y7 W% Z) Jscore = accuracy_score(ytest,y_pred)
1 W; ?7 q6 m' \: M2 b+ m" Uprint(cm)
$ \% I* D$ h) i9 V9 I; p" Hprint('score is:',score)
6 M. q5 y; N- h8 b7 ]: i2 W# Z0 m- l$ Y* t
输出:
! G2 p1 ?2 O5 \* D+ I: u, H* e" S! `0 c: @( L4 u( a
: q. ?6 |/ @' d$ k1 ~0 j
/ Z1 z6 X* W4 e. L. B$ _
可视化混淆矩阵. C' y" P: ]2 B
在这里,我们可视化预测值的混淆矩阵 w/ x4 X& l0 g8 a, C
2 U! y# M. J) \
# creating heatmap of comfussion matrix# N* E9 m _" L) m6 C
plt.figure(figsize=[14,7])7 J8 M) r; E% s# j# K4 m, p0 }
sb.heatmap(cm,annot=True)$ D0 N2 e ^! ^- n% P, B) G
plt.show()1 `. [5 E# s, B" ^& _& y
. B8 g3 ]7 W1 Z8 g
![]()
9 q- G8 R/ S3 Z, r4 r
1 H7 m. g3 n2 ]" Y2 D6 ]8 w可视化数据历史8 R" v6 [0 d3 U; q1 N& e
现在我们可视化每个时期的损失和准确性。3 H5 D7 P6 R* Q3 H+ D; x
8 m9 `% l# W, @: f& l, O4 q& x
# list all data in history+ H7 B# v. r, |( E
print(model.history.keys())
, }/ K9 s2 c* j6 ?5 X9 U+ m6 V8 ^# summarize history for accuracy
) a( B( G. g" `9 J8 ?plt.plot(model.history['accuracy'])8 F5 A& O8 {! w8 ]: l4 c
plt.title('model accuracy')& x: N6 W- G$ E- y: y5 {
plt.ylabel('accuracy')
3 T, Z+ ~7 v) J( Wplt.xlabel('epoch')8 T* f$ g1 F4 R" T- b& n
plt.legend(['train', 'test'], loc='upper left')1 V1 J" a( C- h1 J* P3 f: s) m
plt.show()
! y( d6 Z x" L$ `
8 p- Y* n$ O8 g" L8 v 7 p3 d& _% ?7 I7 u. @; [
- z5 R T) D/ |" e1 Q( d4 r
" \3 R3 U9 t+ ^) C6 k+ Q8 [# summarize history for loss0 |) w e4 ]- [( z8 e
plt.plot(model.history['loss'])' @: f; k" i) z7 l6 E" a
plt.title('model loss')
! w4 y2 n& K& ^ V" Y5 x8 Aplt.ylabel('loss')# y" K$ q- ^- v
plt.xlabel('epoch')
/ y% n3 z: T5 k! N! F/ eplt.legend(['train', 'test'], loc='upper left')2 Q4 |% x3 m* V' T) d4 g" z
plt.show()
/ [8 [8 A: d* S$ W
# T# P9 O- x+ m0 R' k ^ ) T/ v- X {* z4 [ I
& d' d" {; L2 {/ B% h" l0 z& d" X4 D
保存模型最后,我们保存我们的模型
0 v0 T* B: ]# C- c( r8 ~0 m! i C( K6 b- j8 ~, o3 z$ K
#saving the model l2 F! I, D! s v+ M. r# u$ Q
& W j0 o% C+ m r
/ V8 ^+ J" s, f$ ]0 {: h# u8 z
( G% f6 L( n5 g$ ]( ^+ zclassifier.save('File_name.h5')
; E0 q( Y$ }1 A5 K- l' L
! `0 A$ r+ w* s* C$ D$ q
: m* Q# g7 I4 L5 n6 g
8 D1 ~# ^* I' @( e U8 m4 ]- q / Q% g, h3 r" c" x8 |& K8 ? H. X& P
/ H: b4 k/ ~( g! v- l; _7 E
( T5 _$ q$ a9 }# ?/ E |