使用乳腺癌数据集的人工神经网络人工神经网络
9 b% i7 e$ z; o5 M# `. a% ]& H顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。. S# J0 i2 Q/ `) J1 t
- K+ s" _7 m. E9 A4 \* Q9 O! `
大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
p1 ]* q; \' ~4 ~8 S8 h! Y( U, d5 t
它由三层组成,分别是:: y. x0 ]& h, V" k' E1 T. [6 d
! t9 X7 J$ `6 ~, L, m输入层
9 J; N8 r# E- n
5 y& O; t/ Y- q* e* z隐藏层
8 {6 _$ e @% J4 F: c/ l1 T, H7 z: ~& ]
输出层
" y5 E1 U3 Q3 J6 F![]()
L# I, m" P9 R& H% D+ l- `- O5 p( L. z( f" @
使用乳腺癌数据集创建ANN8 d: k. e8 m# E0 p
现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。5 U+ l* E. ~% C V$ v; b( ~6 `0 ?
T9 L8 t" g1 O/ z$ ]" U7 Q W首先,我们采用乳腺癌的数据集,然后继续前进。
9 w& l" J+ N# f! m- v# z! U" B' Z8 R. z( M
乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
: W9 ~- E I/ P6 e; L9 G. D- x1 Z0 K! o: q/ Z0 q- J
下载数据集后,我们将导入所需的重要库。
9 |% X& i) T9 E$ _
5 @- d( Z; Y2 C' O& P3 U5 I( d+ \导入库3 k2 A5 _& x+ [
#import pandas6 G( @$ n- W' g8 n- ?
import pandas as pd, E& S4 O1 J/ }" |5 @5 s
#import numpy1 _& n% Y) k. r9 N
import numpy as np
: B S3 n0 ~) j7 `. @# Gimport matplotlib.pyplot as plt
! o1 h4 h5 M. C' b9 u: T, s, E( Rimport seaborn as sb; ~5 _, a7 U6 l) _
这里我们导入了 pandas、NumPy 和一些可视化库。
( w& ^) k: q- u现在我们使用pandas加载我们的数据集:
; @, G( q }# M/ c Z2 v# h+ ]df = pd.read_csv('Breast_cancer.csv')
& K$ e, `) ^3 y/ X/ U4 P2 kdf
( W5 I1 f+ O" A8 o( r$ Z$ s ![]()
$ u) s" p$ J0 y" ?. W+ ~$ V6 I& h8 v0 l6 ~) A; j% s
在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
. z4 ^ K: G% e* X2 L4 p" N. X* p
) b/ k* S- }: ]3 F; g# counting values of variables in 'diagnosis'2 P7 R3 A7 p4 N$ \/ N2 M! A( j
df['diagnosis'].value_counts()- e" K6 n! G$ N2 g
![]()
. Z7 f9 B2 E; B) i+ b8 T0 H) \( r# {! z6 |, \. `* Q
现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数3 H$ c" @, r% y' i7 g
plt.figure(figsize=[17,9])9 j' A5 _6 h) M1 ^4 F- K; w% V$ N6 t Q
sb.countplot(df['diagnosis'].value_counts())" v+ I" t8 U( M0 z& Q9 f4 L$ V7 |. U
plt.show()
+ G& v4 q$ p# F) Y . U4 e7 M- `! b, f+ q
4 Z) ~ \' U) y' E* Q' I4 W
空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值: # n9 b' ~9 B; Y+ Z4 ?6 u4 b
df.isnull().sum()
! W; j E+ `7 v& ~2 N% v! l 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。- R* d% y) e, Z1 D3 ?9 N8 w$ x
0 Y3 `$ S0 a3 G# `& w! I7 {#droping feature# t6 x1 L: g5 v7 A$ Q
df.drop(['Unnamed: 32','id'],axis=1,inplace=True)
~% f& e( G+ i) [- x
: o( C2 E$ B- e: o& G5 \自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。 4 T# k' E! D( I1 g! h
# independent variables
" l; R$ l8 w. T" m3 kx = df.drop('diagnosis',axis=1)0 l, s' r3 g3 T) ^; p& e8 ]
#dependent variables
- M# U6 N% K7 Ty = df.diagnosis
2 h; P. i( L& N; j$ \ 处理分类值9 r% X' Y3 w+ d8 b2 d9 E1 s4 [) q
当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
( {7 g2 c1 W" r' P5 l) e6 {
1 L2 S7 b# c% f3 O. Nfrom sklearn.preprocessing import LabelEncoder9 d+ V- Q8 j; y0 H/ f3 D9 S6 X
#creating the object
& g2 U) \+ C) f3 Llb = LabelEncoder()$ g/ _$ }0 d. V L, v- x
y = lb.fit_transform(y)
- ~$ u+ q7 }+ {9 I
- v( W/ B4 m5 G+ R+ ~& m+ b拆分数据( w5 G4 G. A+ ~; E5 v6 d' r: @
现在是时候将数据拆分为训练和测试部分了:) u! [) O! ?) q5 \
- a# @& |. V! }* F `: D5 pfrom sklearn.model_selection import train_test_split9 U. |1 {$ j" ]0 ^) `' E# X' L; V
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
3 _. I/ K0 u3 w7 _( B7 R, Y+ _& U& G4 Y9 l$ d7 Z) J
缩放数据
0 a4 z3 | R# c: W& {$ [) G. k4 R3 P当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
1 j! y# ^0 j- b! B( l; m
3 } J6 ^7 R& [$ v' ~* O" u对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
" S4 Q" N7 a4 L9 n1 O, ]; J8 f8 E0 B1 H- x1 J
#importing StandardScaler, S. x3 b7 n. H9 K( Y) i
from sklearn.preprocessing import StandardScaler
/ Z# A' C& {' B$ b: i$ |#creating object6 N) X! H/ |8 E0 I: D. S: Z; E7 M1 k& ?
sc = StandardScaler()
, L! Y! v M1 Uxtrain = sc.fit_transform(xtrain)! r' N" G- p, {# X, m
xtest = sc.transform(xtest)9 @9 }0 U1 c4 ]$ E& F* x& b. u: g1 w
5 G" d- H O5 A. d4 H从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:& U+ X8 v6 Q2 s* g& w% ]
! S6 g& h' X$ N6 X1 T# z. Z
#importing keras5 X- ~+ o9 D) Y9 x( [
import keras
- [9 H& R' J# D1 x s; d4 E#importing sequential module
/ {! A3 f+ K6 E" efrom keras.models import Sequential& K, M7 v5 y4 o! Q9 t/ }4 @3 l
# import dense module for hidden layers7 l! a( M; D, x0 F
from keras.layers import Dense/ ^7 D6 n5 e) p- u2 ~5 @
#importing activation functions
$ E* ]$ ]2 F8 I2 Qfrom keras.layers import LeakyReLU,PReLU,ELU
$ N, X! c1 l/ ~9 m$ dfrom keras.layers import Dropout, Q+ w* D9 k% J
2 F* \3 t; a# D# A! \8 M, [- g创建层5 f/ w2 }% C: L* ~. i
导入这些库后,我们创建了三种类型的层:% @/ t% a7 Z) U1 Y
8 c3 H' O/ S: _
输入层
2 v9 P7 X4 z- ]3 X; ?
9 C4 j! t9 O. b& ~9 R! O$ t" M隐藏层
5 S1 t- i8 F* [9 A: v8 V/ Y, j- D0 m2 k2 S, Z" p8 ], q
输出层
% s( b* U$ \ I5 h0 Y( t
* J$ ]% f$ i* [% N首先,我们创建模型:) c( x; A) X" j3 A# t
. z: E5 L8 g: _
#creating model- l7 Y |( D7 V4 I4 j3 e( w4 m
classifier = Sequential()
4 {' Q- K5 M& D' E( u
8 {2 S! F4 y* f# i* D; ^ E; |Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
4 e8 i' {. e& S
3 g+ ]: o1 V+ \& ?) M8 W% ?, X现在我们创建神经网络的层:/ H3 y, U7 D0 R* k7 j
2 }" s A2 P- h+ @; M3 w#first hidden layer; Q1 m6 D, o! X( m; w# I
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))+ j; q- b+ D9 ^! z( \- [5 o
#second hidden layer
" I9 s0 e- |4 Jclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
) q& H8 s. B) _/ u7 I, q2 [7 [# P# last layer or output layer3 T& C# P3 d- U( m
classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
0 @" r! a% C+ n8 _: O( E5 a. A. `8 a# W
在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
6 k: t5 C( R0 x/ y3 o9 d: C! _! \! u3 r V8 P
第一个参数是输出节点
$ y B- j* l! p4 R+ p# D# ?
/ \' k4 d" |7 Z _; M; @- H第二个是内核权重矩阵的初始化器
/ m4 R$ z- A/ ^" I p! m
/ t/ _( X1 v7 ~( j0 d! `第三个是激活函数
6 Z" X: n) ~" k6 h
0 z$ j. \' t0 T: O! w V最后一个参数是输入节点或独立特征的数量。; Z# u8 W, H# c% b. Y) u) v
4 U& l: S$ S* B! W9 ~& Z" |8 f2 w
执行此代码后,我们使用以下方法对其进行总结:. e% W0 C! @* H
#taking summary of layers
; }% b* }3 A% a& R" `4 q2 P# bclassifier.summary()
: p2 I+ k5 r: e 3 t" T/ E3 E) K, A% G; f
& F, b, W6 P0 t
编译人工神经网络/ V6 D7 E" K: Q- g: ?& q! b+ B
现在我们用优化器编译我们的模型:
' f6 M- c' ?6 I5 K k+ k3 w; ?9 [, }1 v* Z% n: i5 P: b
#compiling the ANN
# i$ H4 C }" W( m mclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])4 U1 X# @# T' C3 [$ Q
1 f v( U; `8 z; P' j/ R
将 ANN 拟合到训练数据中$ z5 q2 ^0 d5 n' s, [- ^/ f
编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:1 ?2 D) y {2 c& M$ [
) F5 h- K! T3 q" _+ ]
#fitting the ANN to the training set
$ d* a& `& t ~+ h% Cmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
# r) q2 ^& Z% ~# Q; I3 j, ^2 t " {" t9 |& E8 v7 v* I
4 W+ w) i! W+ F. h% _' hit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。" G |3 |3 d2 l/ h8 U! a; r- ]
& v4 E7 O% w8 v& p
在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
) ]0 j, v: C/ h5 A' A% b
9 y5 Q& }' w) b3 d8 C7 S4 W#now testing for Test data+ \$ }! E1 u+ J( w, K
y_pred = classifier.predict(test)
, S) n' A s- r) w* k3 Q* _
) _: |0 E" @" V Q0 `在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
4 l4 {; ]$ E+ i( J/ E& C0 Q9 z2 Q/ \( D9 E# C6 o
#converting values4 K8 m* i0 L, E+ l7 l% F F) k+ f
y_pred = (y_pred>0.5)$ S$ ^' V9 n% Q* w' p9 U
print(y_pred)0 O' ^2 k( u/ H) f( o0 ]
3 Q# M8 S) r6 \3 [$ z
; N4 ~9 K8 f( }1 i) c
: ^3 Y6 ^' S3 {' G1 A分数和混淆矩阵 K& y9 e7 H; w6 r- e6 }
现在我们检查混淆矩阵和预测值的分数。
2 m# \4 T7 ]% r1 X( Y. W
: x+ x& [9 ~) @1 T) w0 |1 G6 e% d0 Xfrom sklearn.metrics import confusion_matrix
& v2 [( Q$ s! ]: S( _( n$ s- L7 Y: Kfrom sklearn.metrics import accuracy_score, M* u8 Q7 r4 \' f
cm = confusion_matrix(ytest,y_pred)
2 \) ^. l2 ^5 B4 a7 R( L* wscore = accuracy_score(ytest,y_pred)
3 ^9 ~/ V A' hprint(cm)
/ A" f0 \; a1 o2 C2 [; W" W' a3 ^, i8 m8 Pprint('score is:',score)/ Z7 q" S/ c* K p6 Q. l" H0 H
1 M5 N! W+ T- V- {. f+ w8 C输出:+ C! ~% B9 o; l# X- _
! q. x7 g) P4 ]/ d: x
0 r0 |( s7 e1 ?4 ^. b! ]
4 O7 a L3 a8 F3 |可视化混淆矩阵
% o; p D. I) x1 W O w$ V在这里,我们可视化预测值的混淆矩阵- A/ L; |- T/ b& p
- a& | _" b$ b( H0 B4 o
# creating heatmap of comfussion matrix6 ]- b1 [' `5 K& f0 l) b
plt.figure(figsize=[14,7])
$ [: A8 s' b% t( t7 z/ ]6 }sb.heatmap(cm,annot=True)
9 Y: a/ m7 d2 n/ x! {plt.show()
& Q D/ A) s- X1 ]
& Z9 p5 Y# Z( b' b7 U, u* Q![]()
. W4 _ A2 d& ~$ D, P
+ p: r$ t4 ^7 P; f2 o# r ?, n可视化数据历史; W1 ?0 [9 v- T3 U0 ~1 j2 ]( H# b
现在我们可视化每个时期的损失和准确性。1 p% F: R% L A6 T* e1 |
: L! R" d; `1 ]0 Q. r; C' b# list all data in history' a W2 O7 V% T7 B' }" d
print(model.history.keys())
0 G$ Y j* p9 ?. g2 k. y# summarize history for accuracy, J4 |0 o+ @, t$ V l# ^' D6 F1 O
plt.plot(model.history['accuracy'])
2 m1 j0 N. W9 R# P6 H# Lplt.title('model accuracy')3 P# j3 Y$ U& X B7 o
plt.ylabel('accuracy')
0 e) i/ f* ~7 mplt.xlabel('epoch')
- r! M' ^1 S& k7 G+ V. w* v+ Splt.legend(['train', 'test'], loc='upper left')4 [$ C5 \" I @: I- M' j
plt.show()& E5 a% L& Y# w8 C7 B
' l6 F; M" J& D
; ]0 O i6 p2 Q' C) c% a' V9 l$ p4 ]
8 M9 D) ~8 P8 x) o1 d- m0 x2 Q
0 U! }* c, V% F: o& O; ~9 h- J; l
# summarize history for loss
, x- e1 S3 ]/ x" J; o7 Q, iplt.plot(model.history['loss'])/ T) J, p" U, P5 b
plt.title('model loss'). d4 p2 m, o' e' W
plt.ylabel('loss')! J \4 O0 R, k; E
plt.xlabel('epoch')5 x0 q5 y2 @4 G2 j: q3 ^
plt.legend(['train', 'test'], loc='upper left')
: e5 G4 ?: ?7 S4 z# Splt.show()
8 e( Y- _* q _' G% G9 {- ~
* p% B C" E% _) d . `' p/ G8 q2 t9 @$ t$ D) [
! C4 d, q$ }0 {2 h+ R
保存模型最后,我们保存我们的模型 - , L, `( d) G# }
- p( p4 \4 [% v E. E
#saving the model
" v; I9 a& T U+ G0 \9 S+ V2 q+ P% ~, M: d: s' k6 q9 v
- * c8 ?/ }2 v1 X/ u
- C$ ^$ k0 v- H! w4 q- s1 Vclassifier.save('File_name.h5')
9 u* W# P( A( C' O1 V: {0 |3 C
. R+ O, f& T% b- T! m: z x1 \ - 3 g0 a9 w; r# R- T5 R- U+ V
: k. J0 P) {) R5 o, o9 q3 `+ g
, ~, ^: u9 o0 f% x1 X+ W+ p- a8 u
* l5 X. A! S5 y3 q W; Z5 _/ s
|