使用乳腺癌数据集的人工神经网络人工神经网络% A, z6 n! h! K& E
顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
" M; Y- \7 s0 m1 ~- Z' w, z7 q6 S' w0 ]! [4 n8 m* T
大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
; K% |2 j: p$ C8 X7 T9 g
" t% A+ r6 l4 R' A它由三层组成,分别是:
6 u, f5 ?5 Z6 ?) l* \+ u- p ~6 [6 u( P8 P1 F- q- P2 a, j" n
输入层" c% o, Z8 U4 H
0 x9 o. v" z7 @& o/ |' b! I/ M* u
隐藏层
- i& w9 Q+ V6 Q6 C O) G8 a" e4 v& c9 z1 L! s: c
输出层% _# D' k/ M3 C9 _$ q, {
![]()
4 n) e. v- y) ^0 z6 L1 p
. j0 E3 h- e& I- i. k" }6 h使用乳腺癌数据集创建ANN6 R( z+ T, d9 s: } a" d
现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。) i- l$ t5 L! O+ U1 E- n& K
( O0 E: q. _2 L' U4 M- S
首先,我们采用乳腺癌的数据集,然后继续前进。
& r" T7 e( a' v0 X8 ?2 c' y% d' ]( {& p
乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data- E+ b# h3 d+ a* Y8 j( F& t
3 n$ b7 Z& l# i" R, A0 _' C
下载数据集后,我们将导入所需的重要库。
7 b' Y; ?' |) @. ]* O- y$ \2 L0 P) p* \
导入库
8 s& h/ @- I* B8 l! C* u- c) A#import pandas
2 ?2 d4 U+ l) k9 \import pandas as pd
3 ?+ q& n+ A" J2 `1 u, ~#import numpy0 d, V1 h* B' Q7 x: |8 P( `
import numpy as np% z j0 p) e; T0 v3 F
import matplotlib.pyplot as plt
4 u" {0 s5 I2 Cimport seaborn as sb, P+ j' H6 X; b9 w. n8 V5 O( q2 s
这里我们导入了 pandas、NumPy 和一些可视化库。. I! n1 m1 N D4 c. {8 x
现在我们使用pandas加载我们的数据集:
8 e/ B u, N$ F( c( L5 H$ @df = pd.read_csv('Breast_cancer.csv')* O- |) c9 X9 N0 h- Y- u
df
0 G9 w$ ~" j; W0 f. b1 f6 h' b8 ~ % i" U4 H; d! O" j/ l8 M" t
) {/ _5 O8 Y- a2 T! D" n: A
在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
; t* ]# w; _1 L% |% D
/ s: e3 E1 N- g& Y3 @# counting values of variables in 'diagnosis'
+ }2 K8 D8 x6 L9 I/ {; c! w, |df['diagnosis'].value_counts()
/ C$ ~! e2 d8 H, N5 L3 l ![]()
0 f1 d3 h' V4 t$ y3 h, i V* W1 `8 L# V
$ q! C* K# {' d+ r! n( V现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数
% D. c7 A/ ~6 F9 T* P7 _0 bplt.figure(figsize=[17,9])
* |" N+ t T2 H7 G9 Psb.countplot(df['diagnosis'].value_counts())- |$ q# D% l) U1 ^+ x- A/ i2 j$ `
plt.show()7 e+ O0 k" s. b
) n9 Y9 \0 B) C, [& G4 z
9 g1 D8 ?. A" |1 x; k6 H/ i空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值: % B8 d" @7 K6 G" r7 V8 B
df.isnull().sum()
9 e/ x3 U& b& G' N# a3 E 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。) j% u8 x- v0 ?
$ r5 {4 ~. c$ ]# `. ~4 F3 z
#droping feature7 s3 L! s8 X4 O( s5 C! ?8 n! |
df.drop(['Unnamed: 32','id'],axis=1,inplace=True)( k* E: `* ~2 d- j! d
9 g: V9 r Z/ c- V5 B5 r/ Q自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。
6 `4 V3 r& I S. Y# independent variables8 @, }' a* a2 _3 R
x = df.drop('diagnosis',axis=1)5 S f5 H9 a) {9 ?" ~
#dependent variables
* ~+ d/ @3 \# v& Py = df.diagnosis: ~1 t, o$ p& T* ?$ U4 X, |2 P6 M
处理分类值
8 r* E3 Q4 z P8 x. u' _; B当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
3 {% e' y4 P2 L {
/ p$ [. F m9 M" E# ufrom sklearn.preprocessing import LabelEncoder9 Z* Y' U$ P o
#creating the object$ u# B: u. B @! V; V) ], H
lb = LabelEncoder()
7 i" r& h$ w0 _# s/ ~& c5 V. \y = lb.fit_transform(y)
5 ]" m1 p }' L4 ~: }$ C+ @9 D0 N8 \
拆分数据
7 R& T3 C. U+ c, j. V现在是时候将数据拆分为训练和测试部分了:2 D$ \. v$ v$ M# B7 ^$ h
) j$ @9 E+ A/ Zfrom sklearn.model_selection import train_test_split9 K7 H' \3 F- B/ Z: h( Z! b G% E
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)6 ?; R1 e' w3 r. E, \; k& l, g9 P
- o e' q% S: @ `缩放数据9 B0 B. f7 Y0 K* A% p( x0 O
当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
: Z& g- } u; {1 `! U2 a8 Y! Q8 a# b* }* s4 w. e
对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
$ i, p) E2 A) c5 u; _4 P, Y3 I7 e) y" M6 ^- I7 |6 Z! U) e. F
#importing StandardScaler3 a- m0 h2 w% [9 y4 {
from sklearn.preprocessing import StandardScaler
( F @6 {! R+ B) I( h#creating object
, v l' V* M2 lsc = StandardScaler()% R+ \2 I4 D- k- U M' K
xtrain = sc.fit_transform(xtrain)1 ^7 ~1 d; E9 w3 |! x' O& I6 H
xtest = sc.transform(xtest)5 t6 L5 m& j/ n3 W+ @8 P; d* V
7 ^ C! |3 g" E b( j+ Z6 R7 p从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:& c7 I" K# f" ^
6 v, _6 S U8 k7 {9 a, F' P# E
#importing keras
3 J9 y7 q0 E- gimport keras/ _' h) m5 w4 q8 C/ C0 e+ f u; w
#importing sequential module
1 C! T5 N6 ]+ z3 n kfrom keras.models import Sequential6 C5 E2 ~4 @. L ?+ [# B; r+ j
# import dense module for hidden layers
5 ]9 l- t- v' \/ Z1 {% y: ]9 jfrom keras.layers import Dense, N, A' O: [7 I. `- R' ?
#importing activation functions
: E& i( l0 @: x- e4 B9 Z; c nfrom keras.layers import LeakyReLU,PReLU,ELU4 [9 o9 H/ r! k; h" k, g6 H
from keras.layers import Dropout; k- s' ]. Q' x# D4 t5 N& N' E
. b3 _$ c% | n' E创建层5 Q+ Q: V) w$ P0 j: f, `6 \0 [
导入这些库后,我们创建了三种类型的层:* p8 f" G( r! J5 @$ o6 R
: U) g$ l6 C5 F, D7 J9 e; z; l& Y输入层+ l. l- O' {" U* Z0 f& f( k7 ` ~
% E$ n6 O+ S( a) ]% N隐藏层+ L+ ^1 |. ~( t1 E
8 o1 C1 ~$ P k3 \$ \
输出层9 `, d7 K& U' p! d8 H7 e( _
2 z4 s/ `, x5 u5 @( Z
首先,我们创建模型:( f: m; x+ Q' A" ?1 w/ ?7 k
' F C: j" C" @, ~7 s4 l#creating model
8 Q# V6 a$ c+ q' a) V3 P' k ^+ mclassifier = Sequential()
; {# r: m; T4 R! ~3 E, @6 O3 e4 o& s: e0 ^4 b. N
Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。8 I9 B; x/ s( h
! F+ L$ h2 @' S) |0 N7 {9 T6 ^
现在我们创建神经网络的层:
& K) t1 S0 @7 d. \; T" ~3 ]+ B, C/ u) |' e9 g. p7 T5 M
#first hidden layer
' i3 k8 b5 W; ]# D% j% ?6 N! o( gclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30)), ]9 t. l, c& Y
#second hidden layer
. ~% ~0 G' l- `+ o' T7 S0 E# xclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
9 l4 Y3 z( W: h) M# last layer or output layer" Z, N4 q, |6 s; z. I. |4 D, \
classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))5 e' z# N1 d+ n7 ~5 V
1 c/ M* L4 Q1 }. V' l$ B4 c3 E
在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。7 t& ]9 X8 x: T7 H! [% l- E
Y# S! ]/ @* O F/ U3 o. |- p第一个参数是输出节点
" ?1 x1 i* p, E
* m& b. i0 b9 L. J第二个是内核权重矩阵的初始化器9 |: L2 F \/ {" X: N: H
- C) z" z, h0 A5 M第三个是激活函数+ o+ K9 ]" ^2 U
, g8 n2 W, S$ B2 ?9 g6 G最后一个参数是输入节点或独立特征的数量。' U3 |1 n* U& R1 I% x" I
$ v1 [3 R$ I. g+ f$ l
执行此代码后,我们使用以下方法对其进行总结:7 d' j! A; }1 W- c
#taking summary of layers
6 I' [# U2 i) w+ iclassifier.summary() S9 U# Q Z( u0 h/ E K
![]()
9 a+ r( B# U8 h3 @
: e! m% Q% ^, g3 I$ n编译人工神经网络
+ s: r7 [# V) o. [7 \0 A现在我们用优化器编译我们的模型:- x* y& k2 L; D
5 R* v5 A r6 ~: b. }#compiling the ANN4 J& L' w( m! l
classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
0 _- c9 C: b/ K6 o+ \/ l7 Y( r* d' \) `* _6 m5 U
将 ANN 拟合到训练数据中" P) v: P/ S) ]% R2 F2 @3 u5 j
编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
" s3 f- k! o! p2 j: H9 e- ?5 P4 S; R. p' q
#fitting the ANN to the training set
_- d& J1 I! vmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
# b" ]* Y3 y% L( g4 T: w6 v 7 B9 }1 I: ?: O' d9 [* z
% T' E/ n: E. ?" j& ^& I! g% O2 `/ v
it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
; k6 ^9 Q6 ?" t5 I% Y2 h- v& z5 Z) K3 O$ C/ t
在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
. t# y& V- a, ~ _; @6 @9 M/ F0 r; O- Y+ |
#now testing for Test data7 e9 J" S7 H* l1 r
y_pred = classifier.predict(test)
; B7 c1 H j7 y, p, p1 V
: o* d# s. j8 n" ?在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
: @! H$ w' g, b2 T7 h" ~9 F3 m6 u2 d, q: A- K+ m3 U5 d
#converting values
6 n- P1 t) |3 my_pred = (y_pred>0.5)6 e+ Q9 ~% ]/ t2 [1 s2 m
print(y_pred)2 |8 I. H2 n. o8 N; l
# y+ X# _' J c" K
8 |' W$ l# I0 C4 ?. @: m
1 b3 | e- Z8 U0 O- \( [分数和混淆矩阵) Z( W' t7 _- Q% O' M5 P8 z
现在我们检查混淆矩阵和预测值的分数。
9 k/ Y) D1 K+ z: b) F. g* V
' H% T+ D! C7 o! B! y3 @0 Lfrom sklearn.metrics import confusion_matrix# M( U3 i4 ?- C' R+ u
from sklearn.metrics import accuracy_score
5 F/ z) _, V- t- z! C6 Jcm = confusion_matrix(ytest,y_pred)
/ r! B1 a7 U) [, Z; Yscore = accuracy_score(ytest,y_pred)$ v0 z2 j A; ~4 _7 W- H
print(cm)
% l7 P/ Q( _) d. [) { g Kprint('score is:',score)5 q& K: _, x U$ W; |+ i% C
+ N$ A0 D6 G3 J2 L4 Y& [( ^输出:: d- [$ f& A% R6 l: B: W3 a+ w
7 G' h/ `* u% |" J7 m+ E; q
+ U+ n3 R+ r3 ?; v. n5 D1 f; _6 M
$ O$ u% \$ ]6 V% J: `可视化混淆矩阵0 {) a8 K# d4 _, S% d
在这里,我们可视化预测值的混淆矩阵
1 K! i1 r" N0 ~- r0 g, K' u; i2 L+ b4 z
# creating heatmap of comfussion matrix
) A M2 ~# s2 z; D5 tplt.figure(figsize=[14,7]) ^; a. _" @! N9 X: U+ @
sb.heatmap(cm,annot=True)
! Z! m. w3 Y0 X& H+ gplt.show()
* v7 [& N$ f5 E1 a! n, b, L3 j7 L0 K2 | B$ h
2 k, B. i/ g* F: T" M$ F0 v
6 q0 N# l2 T5 q% g1 l6 F
可视化数据历史
* g! `5 Y1 A% v/ s: R9 P% D5 K+ N; J现在我们可视化每个时期的损失和准确性。
/ v8 z8 ~1 a1 e+ k3 q/ X- u
+ ^" M, t) E. Q# list all data in history
) f4 ?; D( b, H9 h8 Cprint(model.history.keys())
/ {, T0 L, h4 l8 N# summarize history for accuracy4 y/ L7 R! H0 O; r, _4 d
plt.plot(model.history['accuracy'])- s( d) V5 r; L# F3 M2 Q
plt.title('model accuracy')
8 c3 c# m$ z3 [% X4 `plt.ylabel('accuracy')
! D4 t" o; D' \; oplt.xlabel('epoch')
8 A2 H/ S7 I* }, ?; W' Wplt.legend(['train', 'test'], loc='upper left'): y1 |* ]( Z5 ]: Z
plt.show()
( R3 }7 G' F9 Y* |! B
8 W' E' U4 ?& d7 [% { ! }2 e8 I+ l9 z! h# F
3 S& N4 d( I/ z$ \% U! U& y- X
( S( {3 q/ o$ i( Q, `
# summarize history for loss
" J# p! Y. X1 J1 `1 Bplt.plot(model.history['loss'])% w" q* B! T8 ^
plt.title('model loss')
3 l7 J& p1 Q4 U4 Uplt.ylabel('loss')! p* `/ i; o2 ]* F
plt.xlabel('epoch')
% m3 r" T7 B/ Yplt.legend(['train', 'test'], loc='upper left')# _+ l0 A7 R+ a# `
plt.show()
5 w/ v$ a3 I8 r2 H9 G
: @+ \/ V5 u( k4 K5 i( i7 Z$ U![]()
3 o% E) x3 R; |& b
* g4 c6 M: ^; U: \1 O1 g6 b保存模型最后,我们保存我们的模型
2 e7 t) z# O% [& h+ T& T: ~; V/ R, Y' Y! Q
#saving the model; y6 i! B/ G4 b9 N& K5 z
6 @: i% d+ {, X- Q
' g' R( ^/ b8 B: } q3 `3 [5 i0 {: U* ~6 l! Z! ]" }) U: H: D
classifier.save('File_name.h5')
/ p+ Q6 ^: c |& O: y X7 O6 x9 [+ x6 d( N: s2 T( c" }
- , l8 L3 `5 v$ R
# t7 v( Y/ t9 F/ F$ P% O
" z" A2 L9 r/ l& W
8 Y1 n; j3 a% k3 k, C! g2 X" m( Y3 S, V4 |& ?/ T& e/ H' d
|