使用乳腺癌数据集的人工神经网络人工神经网络% Z3 L8 H0 r. F
顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。2 B F5 P0 b5 C
3 Q% b4 J3 {: l6 C7 b/ a
大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
4 W! y3 c6 q% o4 d" q! S* ?3 ]0 b! W* N1 }
它由三层组成,分别是:
; D! m- z/ `7 `, X, h: ^; @) s8 I% C% N
输入层0 I, N4 x+ a/ Q( @% g
* C2 W% \$ G0 y' l4 T& q隐藏层
) i& m* T9 C3 G* A6 q- T0 z) p) K) [% s$ Y
输出层. @4 B- l; C) `+ S# {
![]()
! t6 Z" U4 S7 q7 u% A* J6 t9 r# N/ l/ D
使用乳腺癌数据集创建ANN
/ g0 H Z: \5 L$ Q9 Q+ M" l, X现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。3 z; ?6 s/ `7 D& n; D0 U
' i) l" ]' A4 u; m" e7 [
首先,我们采用乳腺癌的数据集,然后继续前进。3 p7 r. p0 i, L4 d$ l! D
: [8 }% u- C8 p, [' v
乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
* Y3 X+ ^+ \7 y
0 g' O4 a& X! y6 s下载数据集后,我们将导入所需的重要库。
: X7 M( ^; j, t; H" o) ]; K; ]. f6 A$ g
导入库
, `' t/ L+ W5 M3 T# l2 q% d#import pandas/ d9 w# l/ x# N2 V! O
import pandas as pd
S0 r% S/ r# h5 J#import numpy( w& p. Y. H( z
import numpy as np4 [% q. Z3 G3 B1 W( ^' i: {
import matplotlib.pyplot as plt
g- }% ]9 ~) N- E1 oimport seaborn as sb" S+ x% Q3 T) J! I& d" n
这里我们导入了 pandas、NumPy 和一些可视化库。, O) d a% t E- B' k
现在我们使用pandas加载我们的数据集: 3 P8 c: H7 ]' I# k
df = pd.read_csv('Breast_cancer.csv')$ i$ `1 Z9 C5 x3 b" d! q
df' ]3 q j; J" C
, f, [" w0 |2 t8 P7 P0 j$ C
" W. K- k/ A% A( n2 X; w) [在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:! s* o. {6 k8 U
+ i* r2 ?/ b# j. L) q( F
# counting values of variables in 'diagnosis'
6 S( g& @9 {2 N! Z6 c* k2 M4 ~df['diagnosis'].value_counts()& P' f" w; X/ g+ l* }2 J- r8 l! H a$ C; `
3 ~4 e5 j8 A, L. W
% O$ `2 U% n0 s) @% x1 k现在为了更好地理解,我们可视化“diagnosis列”的值计数。 可视化值计数# f* o, }% i m# t
plt.figure(figsize=[17,9])) [: f1 b* ~+ } m$ n7 I8 O
sb.countplot(df['diagnosis'].value_counts())+ v4 G# M W: _% b8 U# S1 N
plt.show()
/ p4 j5 ~0 k5 J1 Q( g O 9 \+ y) |3 e& _$ c9 o% k: F; Z% _
7 w n5 E+ |7 I- y. ^+ m4 v' }' I空值在数据集中,我们必须检查我们使用pandas的变量中是否存在空值: 3 { X. K# u6 \" E5 n5 h
df.isnull().sum()
& o8 F4 c9 r: z: r: p4 ]1 U$ L3 T; | 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。" I, H$ [% |! G' w a3 p, ?
: G8 D4 r0 C0 p2 w4 m* Y) w, U* q#droping feature# d8 p/ N' C) A& F5 Q3 Q
df.drop(['Unnamed: 32','id'],axis=1,inplace=True)8 V$ ]! j/ ?( Y/ {# ?9 I
! h, `( R; i2 K9 N# n
自变量和因变量现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。 4 g: M" l1 c5 M- b
# independent variables; ~ I" Y q7 `
x = df.drop('diagnosis',axis=1). H0 s0 W8 V7 V- q, N5 {& O
#dependent variables
6 x C5 N. W: N l, k. N0 S& [y = df.diagnosis7 {+ A4 L, {/ d$ Z0 _5 E
处理分类值
# H c. y b! J, w1 l" W; N当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
6 u# h6 V0 j. g& Q1 d& I
$ \, _% ^, h1 G, e+ R5 Y6 Ifrom sklearn.preprocessing import LabelEncoder9 l' D3 h: ]) j0 I5 i3 |5 O
#creating the object
9 V( C" k8 M6 M9 A/ H' clb = LabelEncoder()- i5 N2 j3 j- M
y = lb.fit_transform(y)
; Y/ d- Y" B) \2 K1 ~6 p2 W G0 a$ T8 O
拆分数据
- p& W8 h3 Y+ q* z% D现在是时候将数据拆分为训练和测试部分了:3 K# _1 _' z- L
" M- O" q. \/ Z1 h9 C4 E; t
from sklearn.model_selection import train_test_split! f/ v: B! Z: g3 c
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
: ?) F0 W" z7 _1 c" L! o9 c8 _" P6 |4 w* p* t3 x" C3 P& f1 G# h
缩放数据
7 o+ h4 x4 p- g* ~" \' ^当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。* |7 X. |* d5 l! s& e" C. i' H Y
3 I3 V) v6 l; s& o对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
1 w! ? `8 [$ i% H' K
, _1 ?1 \$ X% x7 O+ e# s#importing StandardScaler
+ y. Y& b+ e* J* j+ Nfrom sklearn.preprocessing import StandardScaler, i' ?# q+ X2 M' C7 N
#creating object6 |. O# i3 K8 m
sc = StandardScaler(). ?9 z) e9 I* h6 a
xtrain = sc.fit_transform(xtrain)2 h0 }+ D) z' n8 T) P8 }% T
xtest = sc.transform(xtest)! k4 N! L: I4 _8 |7 t' K" A
. S3 }/ [% M" T8 W) _4 i0 J从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:* X- A+ [/ ^9 Z) n( _1 O2 \1 `
! ?: ~ S/ ^$ i- N, M4 V
#importing keras
! m( S. }& }# K& d4 ?! |8 V( B. R2 Timport keras J$ S+ |6 I2 D$ z1 R
#importing sequential module; o. u/ O% ^& E* u
from keras.models import Sequential" v% F7 p( e i: c# w
# import dense module for hidden layers
6 V6 _( R9 T& S/ T) W$ w8 Qfrom keras.layers import Dense
4 E9 {5 G1 E6 `4 P$ {5 l4 ~; P#importing activation functions! R' o) Y! B% P+ s% r# U8 ]
from keras.layers import LeakyReLU,PReLU,ELU3 `" A5 B& J- |* g3 Q- ?
from keras.layers import Dropout' N4 d: ~5 f4 w" f6 F
3 n& c2 L) H$ `创建层0 M, s, c/ L. h1 ~
导入这些库后,我们创建了三种类型的层:
2 k) O; z/ ?$ X- x9 u7 B3 ~7 q/ n
5 U& r2 M; T' c- `& s; b* d; h输入层% @4 w! x5 s0 @( @3 i
) _2 v- F* R4 ~' x1 s, S, g3 @隐藏层
) v5 p% w8 L5 U( x
+ Z. i; [; s0 `' {输出层
* u) [( a3 ?8 k# U/ u/ Z% h3 w3 g& a! M( V. W/ y. W* e
首先,我们创建模型:
5 j. u2 h" Q l3 N: B% W
* ^- `2 [# ?7 q1 s/ W0 M, [#creating model; }9 T) w% ^+ D; Z6 x% |
classifier = Sequential()
( X5 r8 d( f3 V! h* w3 f& H
9 G* c! c$ t1 Y; l9 ySequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
: }! O4 ?' i1 N2 C4 R4 f3 o# j8 c5 C2 `) Z/ Y& L& o3 U; @
现在我们创建神经网络的层: m7 T9 T0 i: o; l* }! e
; t) K' n6 a+ c$ h& b: r* N#first hidden layer
s6 B. w4 [3 ]2 z; Rclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30)); U+ R1 P' m/ S% r/ j
#second hidden layer
) T Y- I H, {) o, j! Kclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
: T. l9 B, @3 f3 D# U# last layer or output layer" x# n7 j' e5 e* q4 N( ~
classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))* ~" h/ {4 p# o" m5 j' j: p
% v u$ g4 C Z+ c! L5 l在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
* O' s/ F- {/ Q( H2 j/ N* Q
) M2 p) K+ Z) d8 u5 P4 L第一个参数是输出节点4 f( W+ l4 i5 f9 {" F0 t8 y
8 H( t4 | t% n: D" I7 m第二个是内核权重矩阵的初始化器
6 ]+ o, b) A# \" s' [" j2 Z! n- _( c) d
第三个是激活函数
+ R# m# b7 p( S2 w( F: W
c' L6 H; i$ h9 O6 `& T) p* C最后一个参数是输入节点或独立特征的数量。' s; l* v6 m; S, ?0 S% g* T
/ h, R% c" K5 M7 c- I [5 x' R
执行此代码后,我们使用以下方法对其进行总结:2 M8 c" N1 Z( _
#taking summary of layers
/ ~: U/ C8 L- v& Eclassifier.summary()8 y$ n4 D4 c+ ?8 p- L
; v2 Y- y4 L2 S- d$ S9 [" {0 W
, n- J7 d) H5 Z+ E3 r. D, _编译人工神经网络
- T0 E' }7 A) O6 j现在我们用优化器编译我们的模型:' G) ^. K: d0 T r
* A* V# u) t4 O7 A#compiling the ANN
3 W6 m% [5 Z( ]! J( q* M- P- n; pclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])' y% P0 H4 ? H$ {9 o# J* q
! l" I' @# o I, e4 u' `
将 ANN 拟合到训练数据中
5 a2 L% i* {# L* r! z$ L0 m& X- u编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
3 A( |( [2 N" n) ?+ i! N; F" [- E0 c
#fitting the ANN to the training set' g9 q. ^ O q. b
model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
8 V# s% H5 Q# \0 q9 b . m( y! i6 ?8 F2 D8 r
' @+ \. ^* r0 V: Q2 nit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
: s) R6 K7 d3 z- B w. L6 m3 I# c/ A2 w" p
在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
& v: O7 Z3 W% W* X0 S: B
! W/ _3 D6 E* Y0 a; b3 h% p, U. B) i#now testing for Test data
5 V; \+ F# A1 y5 d n: d! ky_pred = classifier.predict(test)
9 n. y5 Z+ O: Z2 x z/ J6 ?( }( f. X- p. }
在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。3 I# n7 F( H6 p9 a
2 O; L+ @# B4 [3 Y8 Q- m# ^#converting values
& H, i# v8 l! i2 ?y_pred = (y_pred>0.5)( ?" Q# A9 p6 Y9 x
print(y_pred)! `( q* ?8 Q/ ^' ]* A, D0 q( A
0 p- T/ @8 \* I' N$ n/ i F, |' A
& m+ O) z3 [* J+ ^
) Z* s/ e. I. E! c0 D& p- x分数和混淆矩阵
5 v7 j; D3 r6 f现在我们检查混淆矩阵和预测值的分数。* E' O; x& \0 i% Z- [8 n
* X% `4 c* X8 [" ?2 Y8 r
from sklearn.metrics import confusion_matrix
( o9 Q. I1 }$ g! d( ffrom sklearn.metrics import accuracy_score" T) [& @$ ~; N, h
cm = confusion_matrix(ytest,y_pred)/ P; G0 h( J3 R, v+ E
score = accuracy_score(ytest,y_pred)
' L3 b; @7 L7 Bprint(cm)
* P5 v. ^+ c) W* W8 ^print('score is:',score)
4 S- V2 B3 y& i/ ^! K* K, O
8 z) q- N, B0 _0 j" e% F' \输出:
: A) _: l' W! `7 f1 Y R4 J2 {! |! ?1 W$ _. l1 J1 W
3 |2 H3 v1 y; V" z" e* R
. h: E, J9 f( w+ G/ q. ]6 l可视化混淆矩阵
0 i8 b3 \ }0 \7 h8 w: z在这里,我们可视化预测值的混淆矩阵
7 O% J0 o: M! q6 G, t) Y" D- w/ y6 c6 ~' n
+ k: j9 w- x. u+ v7 U( z' r# creating heatmap of comfussion matrix' @" m' M' ~8 t
plt.figure(figsize=[14,7])0 V4 e8 o2 A& ^' w3 ]( r$ {
sb.heatmap(cm,annot=True)
4 T6 B& F3 p+ _. d; ]' c" X: [7 Cplt.show()
; T1 @8 w/ B* x) ]$ ]+ p: E! S7 h/ W& E: [0 R* U6 j3 {6 L
![]()
$ G1 S. }! I/ ]9 g: f I& m
9 t+ L# @! Y' c# [, |可视化数据历史
( ~( A% U( w3 s$ s! ` \现在我们可视化每个时期的损失和准确性。
' m# W; A9 K! w, {
% Z- S- L5 D) o/ o6 R# _2 L, E$ _# list all data in history
2 k6 W1 U+ g! c% f4 cprint(model.history.keys())6 a$ Y+ c/ y; |6 h
# summarize history for accuracy2 {" j! M2 A+ Z5 v
plt.plot(model.history['accuracy']), ^ H8 L/ N" j3 U$ h6 U
plt.title('model accuracy')
! K7 F% [* l* V7 R# z8 T9 ^: cplt.ylabel('accuracy')3 }6 D; x) R. _" A4 z: M
plt.xlabel('epoch'). K3 @4 ~8 ^2 a. ^ G% b& V
plt.legend(['train', 'test'], loc='upper left')
" O! P7 ?, ?$ e% d- C6 M9 iplt.show()- y2 e, L( L: I
Y( \) g1 m" R- H
, o2 R7 G. X/ V$ r( i _
& ]) l6 T2 s' L
( s' w- k0 A4 ^1 d2 v# summarize history for loss
4 L& q# r6 N; q0 _7 Jplt.plot(model.history['loss'])
v! w, ^8 c9 Y9 V! dplt.title('model loss'); Z& L) A% v9 `
plt.ylabel('loss')
9 ]; V. v; C: yplt.xlabel('epoch')3 K$ p. h2 K3 ~ {
plt.legend(['train', 'test'], loc='upper left')
& C4 r) w) t7 g+ M# b+ a3 k U9 Splt.show()
% f' j2 v6 Y' H" I# G
. x k% w' A2 P$ y- u' S( g6 k![]()
$ |! E# H. k, U0 \+ z; ?
7 m8 @- U' t7 h, ]$ a7 L" x$ a保存模型最后,我们保存我们的模型
& b$ Z/ r7 h$ C5 E. c3 m5 Q5 S8 p( `- i& n0 X' F
#saving the model' U% A0 ?$ u& O1 l: U8 B v
& J. `4 |) J( x$ s
7 x( w6 k# i2 l, s9 M! |" o: y2 `" P. t! b/ [# r
classifier.save('File_name.h5')8 n- K, `% L5 t& b& y
$ d$ @4 i* \4 L) y
8 t! I1 } r5 e4 O4 P8 D, v6 w8 d5 m9 h' O
4 ^7 M4 N8 Y9 f3 S" K
, d1 r3 B6 h5 ~1 X
, P# ^) T3 \; R0 G! S, I2 \ |