QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4202|回复: 0
打印 上一主题 下一主题

使用乳腺癌数据集的人工神经网络

[复制链接]
字体大小: 正常 放大

1178

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2023-7-31 10:17
  • 签到天数: 198 天

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络3 U. S1 F0 E9 k; t8 K" d4 C6 x$ o
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。( R$ H% z0 T- s% Q7 ~
    9 `2 I9 V& C5 g! P3 Z9 V
    大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。  A2 E7 ]) W  X* P- i

    $ F" w: {0 O0 R6 d; R( r; m: m它由三层组成,分别是:$ p' ]5 Z, f+ r

    ! p* d" {7 M! V+ a5 M! e& ^/ Y输入层
    : E* f8 z+ u- }+ g' S5 g1 d9 H0 k* y1 b' U, U1 M
    隐藏层5 L% ~; ^2 I$ H+ k8 C

    0 x6 ?8 @/ s! B7 A! C& Z输出层, g5 b' I+ L. ^( d% ~
    & y7 q" g" t' t3 T; P: q

    $ d. j% q2 r& N+ \5 \使用乳腺癌数据集创建ANN$ U+ F. v5 G7 q
    现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。6 T7 X8 @# a( ]! R
    ( p! t+ F: E/ ]  y9 j1 B
    首先,我们采用乳腺癌的数据集,然后继续前进。" O6 q4 z1 O8 [6 o4 m& @/ K& w' I

    : A8 w/ c  K1 O) K乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
    2 j3 }& |1 M5 M" s0 l+ v4 i+ p1 o
    % S4 q' p8 o, D! K, r2 h下载数据集后,我们将导入所需的重要库。+ d$ z. P) [8 _4 K
    8 B, v8 D( K: d; ^& t' p
    导入库* K6 `' K, ^; |0 i7 i0 X
    #import pandas
    6 d1 W9 o. H! L8 l6 cimport pandas as pd. T1 ~$ r+ L# {( N. L
    #import numpy/ `. ]  Q0 y% j
    import numpy as np5 O' a6 N- E. A7 W: `; X9 d
    import matplotlib.pyplot as plt
    5 s8 D4 q- P% k) D) a" Qimport seaborn as sb  e4 z6 z& A2 h( T
    这里我们导入了 pandas、NumPy 和一些可视化库。  q, E' ~' N) r9 `4 ~: Q. J9 g+ T

    现在我们使用pandas加载我们的数据集:

    $ Y) U- |$ ]) ~9 h  n
    df = pd.read_csv('Breast_cancer.csv')
    - @  H. n9 c( D( O; ~4 p' C7 [df  M3 W: i& K9 ^; F9 l; C

    0 i7 g0 B" m+ |/ G& ]9 a/ ^7 A6 f9 [0 N; f$ L; P: x
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
    & W  w# D9 |. {$ u' G' Y. R( D8 A% h- `& N0 |( ~$ f. t
    # counting values of variables in 'diagnosis'
    5 T& k9 e6 C: a, f" G/ c6 D$ Jdf['diagnosis'].value_counts()
    5 k2 W1 j8 W9 l0 z3 ? & M( k& s2 g6 h8 \  Z

    ( Z. y. l& w# Z2 u# V- T6 l

    现在为了更好地理解,我们可视化“diagnosis列”的值计数。

    可视化值计数
    ; k" C* f& G; _; ]; ~$ W, Lplt.figure(figsize=[17,9])( h# f; G% g9 ]+ [
    sb.countplot(df['diagnosis'].value_counts())7 m8 |/ j2 E' X
    plt.show()
    5 H9 d9 V. a4 T& E* O1 D
    & Q2 q% n9 }4 T: |
    0 e7 B3 q3 u3 a/ i, w空值

    在数据集中,我们必须检查我们使用pandas的变量中是否存在空值:

    / F& M5 M8 H8 @. G6 ~
    df.isnull().sum()
    5 X8 p- D7 H3 m& U8 v; n8 @ 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。( y- [* V0 f' w/ T" y# z
    / v0 d1 ^% n9 b2 Y) V" L1 J1 z! w. G. p
    #droping feature
    ) ^- a1 x/ V6 l8 i& {' k+ y% |df.drop(['Unnamed: 32','id'],axis=1,inplace=True)
    4 D, k5 U  i& J9 ^" ~
    # I- R4 l0 i( L# r自变量和因变量

    现在是时候将数据集划分为自变量和因变量了,为此我们创建了两个变量,一个代表自变量,另一个代表因变量。

    0 N3 ]9 @6 g9 {8 F
    # independent variables
    * y: }/ N2 T! P5 @' V0 n3 Hx = df.drop('diagnosis',axis=1)6 n3 N! F7 b3 J
    #dependent variables* X, |; ]3 c9 K2 U
    y = df.diagnosis
    7 [5 Z% k, Q+ B4 [% v* s7 ` 处理分类值2 S0 M2 T* s* v( P! X  v8 [: ]
    当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
    . |& W, B: C8 y# n) i0 P9 x. E% ?7 w2 a+ ^7 b9 S- G* x% c
    from sklearn.preprocessing import LabelEncoder
    1 y  z2 y3 M- R+ n8 ]& K4 N5 F#creating the object. D4 G0 D/ E$ p0 c. h  g+ `7 M2 n
    lb = LabelEncoder()4 Z! ~, k% s5 Y% ?' _
    y = lb.fit_transform(y)4 D& P0 w4 B2 }

    # ~6 z: J9 q% L8 f* |  n拆分数据
    % M% S5 p- ?. H. E* k6 p1 [! d& t现在是时候将数据拆分为训练和测试部分了:. g; a* Y3 ?% D4 g/ [

    ) ~: ]$ U4 G7 N5 W" P2 q$ D  p+ afrom sklearn.model_selection import train_test_split
    - V! [( \, m% |7 b3 {xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    : s+ q& W6 Y9 X0 I5 s5 u/ J) E2 m9 M6 j# M2 [
    缩放数据: R- n5 A7 Y( u' K* S
    当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。# N# i; d0 a4 R" R( O4 U4 X
    % A7 D% \6 W* w. G* N' h
    对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
    2 F( T% e/ S2 n
    ) Y( x9 K; E+ C#importing StandardScaler
    & ~/ n3 W* q# Ffrom sklearn.preprocessing import StandardScaler
    : c0 g( c0 n: \4 c8 Z1 [9 c% k$ u#creating object. Z6 Q* R. `7 {; [2 n# x
    sc = StandardScaler(): n4 T) C* d; H0 x9 z
    xtrain = sc.fit_transform(xtrain)
    9 N* m9 y( R) D, z5 q+ W8 Gxtest = sc.transform(xtest)
    ) [7 j9 q9 w5 m1 X, C4 X/ T$ e  d! J0 O  C3 i! r4 S
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
    ! r7 i/ P7 k# e, A9 h( z) X
    9 X( l9 f0 k  [* J: g0 o#importing keras+ [9 a9 Q8 e! Z/ f6 M2 v& K0 w/ b5 G7 c
    import keras5 K) T: C1 ~6 s. C. b* }
    #importing sequential module- `( c. N9 G* C% }( Z9 v
    from keras.models import Sequential: K2 N7 f# @0 O& T* P. R
    # import dense module for hidden layers+ T7 R! \* D4 C0 F
    from keras.layers import Dense
    2 k4 l9 j5 s% }" P' H6 g) `#importing activation functions- G6 n5 M' `) |$ q' ~( W* {9 N
    from keras.layers import LeakyReLU,PReLU,ELU+ x* R+ I- C. T/ ~. p! _
    from keras.layers import Dropout! E% g- c- f. N1 `+ N3 L, m5 w

    , w0 W* r- r. ?6 y! c% ]1 t) u创建层
    ; T" Q9 B4 F1 O, h- G: D导入这些库后,我们创建了三种类型的层:
    4 _. u- t$ ^( I% E6 a# F
    4 c) G; j% k" ?输入层
    : o4 p) g* J) _3 r( r5 U" C: ~
    0 j9 C7 E) v1 T0 T6 t4 n0 z隐藏层6 ~) Z( j( I5 @% D
    ( w& y  K9 R7 |% ~# k; L
    输出层$ ~( M, O0 [& N7 ]; i

    0 r3 ]7 ~+ _! u# @0 _8 ^; n首先,我们创建模型:* Z# B/ `+ x! x3 \
    7 U/ S! D8 ~: m% y
    #creating model
    1 g2 Z  H! `$ Fclassifier = Sequential()
    - t4 K' q* |& d
    ) f# d0 J# U/ ?Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
    * D( o2 G( a# z6 l2 I
    6 p0 W# @& I- D* j  h- D现在我们创建神经网络的层:- c+ |8 x1 t" {+ k% l/ B, ~

    $ L5 ~- T6 F1 I# Z#first hidden layer
    . K8 O4 T. @  Y  `2 F: tclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30)), @7 w) i* R& ~9 B. h
    #second hidden layer
    , d' P: \: `# i, @classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
    % D  @7 o' e( E, V: }# last layer or output layer
    ; n& t, }4 Y! m8 F$ f& |classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))2 V2 g+ M* c# M8 N' x

    2 F; D6 }7 H8 o$ [6 t在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。! e# P! D" K. Q; A% a  a

    . l0 l  E; p/ r; J8 h! J7 b0 j! y第一个参数是输出节点5 g  [4 H0 Q9 w! p
    , @% W9 e$ K; D! n, }
    第二个是内核权重矩阵的初始化器$ {- R$ s( Z2 i3 w. p* f+ N, F

    - _  d( `0 u- ]: @1 ]第三个是激活函数8 {. W4 O& i+ T$ E& l( f# f
      w+ F/ `6 a% K' K! S
    最后一个参数是输入节点或独立特征的数量。0 r; j! l# f+ ?0 R
    % K( g4 Y% A+ B6 q/ _# ?( F/ O8 `
    执行此代码后,我们使用以下方法对其进行总结:: j4 r" c6 G1 u4 w' l2 n% N+ i. _
    #taking summary of layers% L, y4 T; W. M) F
    classifier.summary(). G; E9 p! |  u# Z# o1 w

    1 |! p- f' `- L! r, Z/ ?+ B% \7 b' Q# s
    编译人工神经网络
    ; ]/ }: Y9 f, ~3 c1 S现在我们用优化器编译我们的模型:9 c( e/ @, J  u

    ; |) }# v* N$ f: m- q: |#compiling the ANN
    & c% ?8 ~. F( D, sclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy']): \: B: m: w% @' j

    3 }' m+ }0 w6 ]0 n! s% O% J( Z将 ANN 拟合到训练数据中7 k$ ?+ v; }: z3 |+ Y! n
    编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:) q) R# J& v: c7 O

    . J( {  I: B0 J' G% _$ p$ \ #fitting the ANN to the training set
    + s: C, ?! j- m* e% o' X: emodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)' y, q8 g6 ?" |! a
    ( k7 y7 }: S& b/ ^! t$ o9 w

    + M  E! a- C$ h4 Wit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    # b: O: F- U9 {2 s: h% x. v7 H( Y! @9 I9 J! m* V- [! ~9 V4 I1 ^& r
    在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
    ( X0 q1 a( H6 w0 B- \' j$ Z$ U9 q6 Q% [8 L( x. S
    #now testing for Test data
    2 |% Z( r( ]  K1 l. ly_pred = classifier.predict(test). B3 T, n: U$ {) v" ~# f: N
    1 ^9 F8 R' @2 t6 d& G
    在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    8 t9 @, ~- Q; @9 v
    6 w+ }* y0 c# e+ c#converting values% e* O: K* }. x/ t/ f5 R; _" N: W7 K
    y_pred = (y_pred>0.5)! ~' q$ Y; g. ^3 g0 {- @
    print(y_pred)
    6 M! g  d) K9 p8 a9 q3 N! a8 w7 O( m/ R3 {6 R$ t, T( R) i; g( N

    : B) c9 S2 y: S1 D2 u+ B
    , t: Z' r- d/ u9 n! w$ [# P分数和混淆矩阵; q- ]& ~) H1 \* ]- B9 e/ \
    现在我们检查混淆矩阵和预测值的分数。
    ! J1 g- r) ?, b/ b% R  ^* Q
    1 D' ?' e8 N2 ^+ Q5 W* Q7 T' ufrom sklearn.metrics import confusion_matrix, W& i1 S# \8 U2 c) o0 ]! c$ K
    from sklearn.metrics import accuracy_score/ E4 h1 }! T$ n' R- m# I' X
    cm = confusion_matrix(ytest,y_pred)
    ) j2 h" S3 d2 `" t0 j& \  Hscore = accuracy_score(ytest,y_pred)& N. F0 k3 ~4 f8 X7 q
    print(cm)
    3 ~/ Z0 I1 |7 n  u' w+ l- \print('score is:',score)! C6 {' g1 e, w! W9 v; G% O

    & p. d- l; C( W; l' ?  O4 D; ?输出:% {+ Y; E! F+ {6 }% F/ I# B$ z

    " F5 |9 z! c% r+ A& Z
    ( x" g: e$ g* B$ G; C5 K+ N. x. @% S6 K! v- U% A
    可视化混淆矩阵
    ) a, }$ K. g# f% X+ Z5 O在这里,我们可视化预测值的混淆矩阵0 p. }6 t, n1 t
    ) p; ^! V/ B& V' ]
    # creating heatmap of comfussion matrix: f( y- }9 o( t. i7 @0 r* C
    plt.figure(figsize=[14,7])& G% ^  _5 e2 ~% `) k8 Z% ]) r
    sb.heatmap(cm,annot=True). F& `. u  ^* |8 Q& m4 B% A! a1 S9 M
    plt.show()
    6 e: x' Z' N3 ]" m$ H% E+ m' e/ b. _# e/ T* j* l

    5 Q' t2 L' x- e' k- D0 S
    . Q' B" D1 B7 Z. l( s! k* ^9 r/ y可视化数据历史7 D' @- P% i: y# g7 j( h+ r
    现在我们可视化每个时期的损失和准确性。
    8 i$ |; A' Z( V7 ~6 e& a. I2 q6 }8 x; M* d4 G) U3 R: y
    # list all data in history
    ) w9 C1 }/ B! Y& Rprint(model.history.keys())% e7 j% a& E% E  [
    # summarize history for accuracy9 K, u5 Z" V& u* J
    plt.plot(model.history['accuracy'])
    , u; y3 Z& H/ P' _8 D, vplt.title('model accuracy')8 z# S# G* {! k5 M
    plt.ylabel('accuracy')
    ; W8 L7 ~- u, K6 k2 L; |7 B" h) Dplt.xlabel('epoch')
    0 k4 G! y( U6 B! M; a1 P7 |+ R! @plt.legend(['train', 'test'], loc='upper left')
      ?9 A2 j9 t, r8 ~& [plt.show()
    , Z( \. D, Y; ?; m6 N9 T
    ( R' S7 V  C$ L2 h  v  p. Y) U" ?# D
    ( e9 s4 S# w- j0 ?, b- A
    5 |5 f, x7 t* n3 P* W
    # summarize history for loss: `5 U0 S+ ], V# A7 s
    plt.plot(model.history['loss'])
    : o9 L0 ?6 P* t0 E$ e# B: Tplt.title('model loss')6 g% P# P( O$ O1 |6 y3 e! V
    plt.ylabel('loss')* D  |2 u! c; J) v1 h
    plt.xlabel('epoch')
    5 Y+ {3 x$ k  |" z1 p- g2 ~8 Oplt.legend(['train', 'test'], loc='upper left')
    % z6 ?+ @/ P- b; Nplt.show()
    % {- r+ ?" b. W4 r" d5 d/ I5 @0 r% A1 H; A
    ) B. j. n* p) T2 g, F" x2 p# \) N5 z: O% B
    : I- w  u# q+ \
    保存模型

    最后,我们保存我们的模型

    • ( I. J1 \* {- S3 a0 k' @
      ' q" G8 W  n( i
      #saving the model
      - U+ g1 A3 r. G# V% K: [& A

      ; p  a) Q7 t* Z8 }2 D, t/ E% M% F

    • 2 Q" _. A9 u, k; q, o

      2 g& I7 s5 [, G2 jclassifier.save('File_name.h5')
        P3 o- Q7 \2 X6 Q& S. L
      ' o. r2 {2 x1 z- P0 i) S, C

    • ( ^& g6 ]( j+ \4 {2 e% \' C5 h4 b8 m( B9 L

    + N6 y  S! O% B, S. W+ i' F
    9 v1 F4 {! F" ^% v
    5 V6 M# Q. C' ]% H1 v& _! b
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-29 15:22 , Processed in 0.525993 second(s), 50 queries .

    回顶部