使用乳腺癌数据集的人工神经网络人工神经网络. o7 M+ C- `" y; t% Y
顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
) }2 t* j6 V1 Y* F
2 e- ] ?1 N( `2 m6 e大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。$ y8 R: ?8 J. T
( a& R: W' _3 C. s7 g, q1 C, h( e它由三层组成,分别是:5 f1 h% \. ]+ j/ o& A
2 r9 m7 |$ D" a7 `输入层1 w) u% k& z1 L2 z* Y! n
, _1 N5 @ |. B隐藏层3 z+ a0 N# o4 `. k
9 ~# F) O* P) y: d# O& g3 V/ E% ?输出层7 ~7 ?' w+ T- F$ {% l
![]()
4 R. F5 n$ v# [" f7 v! Y! r& F( E; |1 u0 `2 ]( h6 }. ~7 s- P% J
使用乳腺癌数据集创建ANN0 a' c) H8 Q2 ]0 e6 v
现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。* D5 U2 ~) A! l% ?( j
3 f& Z' s% X9 m! k6 L, y& [首先,我们采用乳腺癌的数据集,然后继续前进。
1 s' W e0 w' \( f/ F
" H; a" q( O; w乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data0 {' C' C, {( E) u, X, N9 h
" I6 q% L4 [$ K+ ]- t9 D
下载数据集后,我们将导入所需的重要库。
1 M. F; X) k F; W: Z4 j! W& j$ w& H
导入库& W+ {2 H# J0 Y1 V4 {6 t s
#import pandas9 s# @; z5 x2 J! ~* K* S/ \
import pandas as pd
3 D" J. r9 R1 N5 k) ~. C#import numpy
6 e! l1 ?, D; {import numpy as np
8 c& V5 C. ]6 L% v( @import matplotlib.pyplot as plt& u* k* a! Y+ p0 q
import seaborn as sb/ n) S1 v9 X R7 L
这里我们导入了 pandas、NumPy 和一些可视化库。
# |6 t+ Y! ?/ ~; i现在我们使用pandas加载我们的数据集:
" G7 o$ i. R: X+ z" h) Q) m: [df = pd.read_csv('Breast_cancer.csv')
. u% d; L' }/ M z. A' ^! d& Gdf
5 _* X. m2 Y1 N2 t y: W4 u% X3 } ![]()
! t0 h: B y* U d) S5 \' ^9 Y0 P" W; G4 J7 _ E
在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
5 p5 O2 @! D$ _! Q1 w
7 i T+ u* P4 I( u# counting values of variables in 'diagnosis'1 `' z9 C7 ]3 O2 X& m
df['diagnosis'].value_counts()
0 o& x2 }5 a' K- R ![]()
" k; h' A4 h# G$ d5 F
/ s9 R$ @: g$ v- R现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数
; w% o% k& _& Kplt.figure(figsize=[17,9])
0 u+ [, s N. v isb.countplot(df['diagnosis'].value_counts())+ I+ e3 J4 `6 {+ f4 C
plt.show()
! F* ?8 i, M5 v {( E4 z; I/ }9 x3 H
6 G9 V; D3 U* \1 w$ G* X; h# e) B1 N9 B空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值:
. M) i8 U+ I8 l8 a; Q6 r6 P$ Rdf.isnull().sum()
: ]: x# A, A. Z, F- t7 l 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。 b* c" W. G' C' T6 C
# e: G/ N% P* e* R#droping feature$ i/ S. _* ]5 G: B- o
df.drop(['Unnamed: 32','id'],axis=1,inplace=True)/ C1 V% ~) y O' Z
2 R, f# y" i% R; ^; t. W
自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。
2 v0 T# ^" |' }$ t& N/ ]: ~4 z# independent variables, }+ b1 h5 ~. A* m, X
x = df.drop('diagnosis',axis=1)
/ o2 F/ ^: D: b+ r. t" g#dependent variables$ W4 S$ @, z( V [; Q# ]( I. o# E+ U
y = df.diagnosis
1 S0 |' F5 p8 t" e4 c+ r 处理分类值* v0 B- r2 M/ d& j! M, r- E
当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
; T0 p- c4 f7 V' f7 `" r. s4 M6 p$ j5 k+ M2 c- o: p
from sklearn.preprocessing import LabelEncoder& ]- T8 X9 L; J8 a- U
#creating the object
( E( B0 i" B' H- olb = LabelEncoder()
2 j4 f3 u( S3 U+ H' by = lb.fit_transform(y)
6 b N9 c! s; f8 M3 \" f8 ]! }- n6 u( i+ g0 A. T! @6 s
拆分数据
5 l: }$ }& @( b" L# U现在是时候将数据拆分为训练和测试部分了:( _8 X9 O5 W8 U; C7 b- U: z! |
; g7 W' ^7 O( ~/ ]from sklearn.model_selection import train_test_split Z+ V9 ^ r7 N8 h
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)! p8 a0 ]9 i1 Q# y) v5 ^/ m
" O2 w3 |4 R' g# S缩放数据
2 ?; e, l( B: D! _- g当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。7 l/ O5 x! l" h, r: D! [) w! V. [; E
8 A2 \. D; L: W" \# D
对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:5 A( I; n4 ~! E9 s
5 O* k4 a4 ^6 |
#importing StandardScaler
# F( z1 v6 v, c# Cfrom sklearn.preprocessing import StandardScaler" {( H6 O2 E- P# _3 U
#creating object
2 Y5 g$ J i* _. Dsc = StandardScaler(). u- T5 _" `$ n- g! R
xtrain = sc.fit_transform(xtrain)
. [1 U6 e4 o& ~9 e' ] ]6 V/ I! |xtest = sc.transform(xtest)
& x s; ~6 m. J1 W" V/ F3 O- G3 D7 G' e
从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
% \( o3 h6 q% x0 V4 Q$ }0 U' i! o7 d: M S
#importing keras
' r$ X+ F* \, B" ^import keras4 ^( s; b. s \+ R: I: u. I$ t
#importing sequential module
- L7 P+ `% x+ Ofrom keras.models import Sequential
0 ] Y l5 @( k- Y# import dense module for hidden layers$ S6 ~) c6 F: e- ~% z% s
from keras.layers import Dense8 m& r6 E I7 l( M$ j0 F2 n9 l% ~
#importing activation functions
. @0 G- z3 q9 R5 m6 `from keras.layers import LeakyReLU,PReLU,ELU
( M" F* _ b3 q+ x7 a4 U! ifrom keras.layers import Dropout5 F, ]* |: e; W' H+ W
: W) A, I& D b. D) |1 E n
创建层+ L3 j. o. F2 a! {# k9 N- Z
导入这些库后,我们创建了三种类型的层:
0 }+ D, s U. E C/ ] s' p" `* W& h& }$ D1 Z( l/ S+ L
输入层2 d' g$ E+ d3 z# n
1 J3 @+ u+ e- J. r% \$ [! n
隐藏层& P ~( ^( y2 b7 ~: }0 X
% a3 I( V( R3 J2 |& x6 X输出层
% _( Q7 v* k5 }+ ?! j# I
: P* q$ d/ l" L: f# P首先,我们创建模型:
5 ^* k6 d' b0 l
* b3 J# S, o9 V- M5 \#creating model7 {" w) e5 e/ X+ h; p' O
classifier = Sequential()
3 G( w! Q) J! l# P
7 X- N6 ~5 n& u1 I- @Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
& h8 k; z$ B8 R5 a, I' _0 j- u4 W7 `8 V* b% [- a
现在我们创建神经网络的层:- g/ \- _& ^! e3 `, p) r7 ~
6 H- ^( i. V. l/ W$ T8 V( w4 B+ y#first hidden layer" Q' t. y1 {$ Y( D& J) n6 P F9 r
classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))2 {2 t4 `9 d3 I5 C- u( u! Z9 D: V
#second hidden layer
- |; a9 }5 b5 ?9 y$ \4 r$ `, H hclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))7 Q* u, v& k3 `7 D% K
# last layer or output layer
0 a# R$ H6 d9 P5 {& {4 K! iclassifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid')), G; N- W3 d+ x0 e
+ D# v+ |+ Z) A3 k在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
8 ]# R1 D0 W& W% e$ F# x
/ }7 |* l2 Q) s# c% P* n- C第一个参数是输出节点+ i: a" _% }. O$ L9 a" y
) f& G9 y5 f ~ F0 H第二个是内核权重矩阵的初始化器2 e8 g% p+ C; A" E K/ F K
6 I' h3 I/ K9 h
第三个是激活函数+ p( p3 W+ f) M
5 K! g7 R* x; ^% d( k/ h最后一个参数是输入节点或独立特征的数量。
% K8 Y+ d6 G( z6 ~& B K! ^4 \& S+ Q6 s- X @
执行此代码后,我们使用以下方法对其进行总结:
4 j& P- p# {" N+ B, J2 f1 O/ S#taking summary of layers- {/ c2 ~7 R; d
classifier.summary()
+ ?2 y/ b! u' k8 I3 }7 P ![]()
" f5 D4 y5 W/ U/ B x# S: m" a4 e" e/ k* X1 @: ~& k4 ^1 [5 V5 y+ L
编译人工神经网络; Q# x" ?4 Y7 w1 ^$ w8 g6 v
现在我们用优化器编译我们的模型:
- }& `- o/ |( g% \; O3 U: S; t/ Z# }4 v9 w
#compiling the ANN
7 d+ ]6 S. N& C/ ~! V* Hclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
* A ?' S- w3 [2 n
3 W0 O3 b0 R4 C ]2 R$ P将 ANN 拟合到训练数据中
# }, ~% a& {( g8 e编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
5 E5 [/ j: `' Q/ J- c8 d3 d6 L% \$ d2 k# p
#fitting the ANN to the training set# p7 |3 ^# C& {
model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
& O2 p& [0 s2 V 7 N- `$ ?' _+ @# M
, D8 z" n7 `( v' z. i
it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
& J1 u) J5 t& m2 u( p% Q2 A# s- t3 c
在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:+ N. }" \9 F4 ~2 m, K
2 J3 r" F' u7 Z# V7 X
#now testing for Test data7 W: H# ]$ H, b) U& k& Y$ N* y% d
y_pred = classifier.predict(test)
4 I9 p% G7 l+ |$ C: t
7 E9 U, E" @5 p- Q; b4 A在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
2 T' M7 Z7 D1 b- X l: H# Z+ J, s
0 v; h7 J* I. @' J" R#converting values
, X7 z$ z+ W, Z1 V( \ a1 ry_pred = (y_pred>0.5)! e8 L; c5 n$ M5 c1 E1 V9 P1 @
print(y_pred)3 |1 y7 w$ \. {8 y# L4 e
& n- J4 K, d$ E: g/ N3 x
, V, H! J7 T9 ?% h3 ]5 [3 _2 A2 U: U! a4 B) o
分数和混淆矩阵
/ M; `9 N% U6 c8 h5 ^' I. ]现在我们检查混淆矩阵和预测值的分数。
q: }( H+ U7 z7 r; Y! ]+ `* g% P3 }
from sklearn.metrics import confusion_matrix# G$ S! V& l" v: i; C* u
from sklearn.metrics import accuracy_score
( m0 V$ y3 M8 O F4 ]& }- r" scm = confusion_matrix(ytest,y_pred)
% f) X1 `! f0 S x) y! w' d! vscore = accuracy_score(ytest,y_pred)5 b0 D/ e# m8 J3 s8 {
print(cm)
' C( v/ G/ |; \# T5 M% Cprint('score is:',score)
8 V2 T6 I. |! |6 c& e( |9 |% Q' u7 B; P+ Q' t5 h# T
输出:5 B: p' n5 o8 S" c
& P/ O4 |' u; O/ W3 F: d" p! j
. n+ Q. p6 _# z5 X
3 V8 b5 O% a9 @6 Q. R可视化混淆矩阵
, z. k3 i. J; T% `3 z在这里,我们可视化预测值的混淆矩阵, @% O8 d4 v# x( C2 f' o) k- E
: b/ Y' f* ?# c( t2 M1 D# creating heatmap of comfussion matrix) b o9 S) l' `$ u6 ?; e/ T
plt.figure(figsize=[14,7])* R1 y/ k/ q2 ~
sb.heatmap(cm,annot=True)
6 _( T8 M" c: p+ y' b, }plt.show()
' b* e* _) ~% T/ L8 y6 {: y
% y; v P. [5 f* m }4 }; q![]()
6 L8 M- Q& J$ r; W; ^, A
+ Z& E+ ^4 t* b9 k* Y可视化数据历史 H) ~8 \5 N a$ g* A
现在我们可视化每个时期的损失和准确性。
, E' e) h) ^5 h8 \
& f. V- ` b2 `# list all data in history
3 l1 k# t! v# ^$ i3 a; c3 Cprint(model.history.keys()). H; p7 J- ], m+ q0 ^ k
# summarize history for accuracy
: @1 M+ |$ W1 T# Fplt.plot(model.history['accuracy'])" ^$ ^, n# H, @' X2 _" k2 m; X
plt.title('model accuracy')
" I7 A( s$ h! q0 f" [plt.ylabel('accuracy')
+ T2 t1 V% m5 X8 N$ b6 Qplt.xlabel('epoch')6 U& k6 [% y* S# D5 o
plt.legend(['train', 'test'], loc='upper left')* `# u1 q. K6 p/ s9 p/ c
plt.show()" s4 p- ]$ C" J& t: ~) c
/ w C- z8 x w& b0 O8 F1 L8 g, q![]()
1 u2 ^7 d! i7 B4 v, X A' m3 E6 ~# Z3 @" d9 j/ S; g
6 J+ r$ |0 ?" i0 Q
# summarize history for loss& R6 Q2 M: v0 d: u
plt.plot(model.history['loss'])9 S5 T( R1 b8 ^, C% ]
plt.title('model loss')9 V2 g" c" D) C6 R. C+ v$ j
plt.ylabel('loss')
, z! f' @ `% d( i6 yplt.xlabel('epoch')
; t2 V. R7 H) O: C1 O" Yplt.legend(['train', 'test'], loc='upper left')! m- N+ {8 a) Z1 n
plt.show()
5 L6 i) u7 }/ I. C. q' S/ V0 I+ q% g
9 Q4 d. B; ~3 b8 V![]()
$ _5 n- b5 n8 u* D; K b+ z' L# h& U8 e
保存模型最后,我们保存我们的模型 - 8 g3 D. {! p# e2 a) _6 [
& K0 y/ W4 Z% A7 Z p) x5 N( ^" w
#saving the model. a( J/ N( ^* r9 g1 @# [# S
* l4 z7 b- U! n! p
6 D; B; e8 E5 |; ]! U h( M9 j% O- ?2 B5 f
classifier.save('File_name.h5')
" [3 {8 I ^- U0 N, g# N. w) E8 k8 f; b8 ]( B
& L+ J* R* s4 U$ b0 Z) d# E' u/ ^9 s7 U! Y+ u
9 e, L6 P& p: i9 S% _8 W" ^( F
9 |' _" X: a8 g% c% R, ]: [) K
; p1 [+ H( n0 s8 M+ |( G! j |