QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络2 B5 L- X$ u6 t# I+ R0 B
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
    9 Q# j8 A, t1 p
    ) I8 ~) b& A/ o: E5 e% ~大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
    : U6 D, ~* ]0 `+ h: j' F7 ?
    6 w; I0 z$ L2 n6 o0 @" s它由三层组成,分别是:# b% t  n) ~, k( W/ ~
    0 y3 M( L4 x5 d  ~, I* n
    输入层
    $ t, W# v. `0 z/ h- m5 |1 s& Z/ [2 d0 s
    隐藏层& m2 t" G9 m. B5 t$ m

    1 g0 [' h2 y  C! I" I# t/ v输出层9 D4 r  {( L& ]% [9 A
      Q* q1 s; E  J7 F+ u* I# v, @

      ]4 ?3 d* H3 d4 r" g9 J( ]- N# _使用乳腺癌数据集创建ANN
    , V6 d% E* H9 W现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。
    - F& j' A( t: y1 O4 w6 R3 H2 H- ~7 l' q" a- d$ G( O' s
    首先,我们采用乳腺癌的数据集,然后继续前进。
    ' Q$ ?, W) ~3 i
    0 O# J6 V* u6 n: Z' R乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
    8 ~8 x' X& G% B* D  }5 {. y
    . Z% g# d8 z6 F9 X4 y( [下载数据集后,我们将导入所需的重要库。
    : b, m+ p! f0 t( f' X* z7 n3 l- Z
    导入库( _. j% o. W( K2 w+ T
    #import pandas: S3 _4 [1 {' [) P, ^+ o: U
    import pandas as pd
    ; n. q5 \8 J( E  c; k- S: ~/ S#import numpy: m9 U. s1 a5 f
    import numpy as np
    / q/ j2 L- a  s& ^8 l1 `import matplotlib.pyplot as plt0 S" `* y" ~  r- d' r
    import seaborn as sb6 u1 y9 _) u7 n" ^. b
    这里我们导入了 pandas、NumPy 和一些可视化库。
    8 n2 e/ e( C6 q9 q% R

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

    & c1 I: g" C+ g3 C, w5 F8 [
    df = pd.read_csv('Breast_cancer.csv')" H  g) S. M  r$ \2 T. r
    df
    7 W' [, P$ x2 M% x5 l- ?
    + ?) f+ M) I# E2 h+ E4 N6 q) I% S) d  p
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:0 k2 m7 u: r% B! c' [) r
    * H0 i. e6 C+ o* X  u* g) ^
    # counting values of variables in 'diagnosis'
    4 J/ ~# |9 }9 Z, n* Y/ t0 Mdf['diagnosis'].value_counts()( b$ C( H( u- K0 }- @
    ! P/ [$ F& x0 L1 A
    " t2 Z  ~9 i# [/ _8 {

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

    可视化值计数
    5 G8 ]7 ^: p7 T5 k: j& }plt.figure(figsize=[17,9])
    2 _# z5 P- ?4 R* d3 dsb.countplot(df['diagnosis'].value_counts())
    / D$ p8 B' L/ ]1 r0 d9 p- vplt.show()1 L/ }( ~$ m9 ]9 z2 B! R% r

    5 l$ [6 X3 a# Q7 s4 C, O( T
    ) ?  W0 W8 T) `; X8 H3 T空值

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


    , v( G; t8 i  M' f0 pdf.isnull().sum()
    - z, |# J1 ^3 F! }% @' U- x 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。
    . G. r: I5 ^2 m$ v5 }: ?9 f* }5 Y" H* L/ R; d. w( K1 ]
    #droping feature
    6 M% o1 v3 c) S8 w) m( ldf.drop(['Unnamed: 32','id'],axis=1,inplace=True), _5 X, D5 G; d, E; a$ K" e

    5 y! ~6 \+ q8 n+ O7 n' @- i自变量和因变量

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


    1 Q* {  C4 O% T# independent variables
    , e& |# E( p8 Wx = df.drop('diagnosis',axis=1): B; I' _" [$ m8 \
    #dependent variables3 m- d! c! W1 s, W# S9 d' `+ |
    y = df.diagnosis, r1 ?' f; ]' r; P/ v
    处理分类值; F# U# O6 K$ ]
    当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。9 K2 P: J$ P: j$ u" ]

      h8 [: ~- H8 y+ w) C; Sfrom sklearn.preprocessing import LabelEncoder
    5 A) n: G; \/ ]/ i8 P+ Q#creating the object0 o, r8 X5 V/ S0 X  z/ {4 |& z* }
    lb = LabelEncoder()
    5 ]7 m( N! M8 `1 l5 v9 Yy = lb.fit_transform(y)
    + |6 {7 g5 u  K
    : k: P1 D" U2 q% ?拆分数据9 E4 h6 V( s, U: q) _( d' z" d$ \: J
    现在是时候将数据拆分为训练和测试部分了:
    3 s8 a4 \' c$ m
    % P5 a& y1 s  ?0 Z1 Jfrom sklearn.model_selection import train_test_split- i# @' P% z5 k( T" f& w
    xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    $ W+ D1 @% W7 I/ H5 i- b( [) ?* d  F2 Q- \
    缩放数据
    + o. E2 v& k8 y5 E1 j6 n( ^* w4 P( M当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。3 P  c0 s) e  |. S3 x6 V
    . u/ l7 i8 _4 y6 K3 h" n. O! l
    对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:2 |& F, ?  O# ]5 J/ w; E5 b

    7 B/ ~$ [5 T9 g8 |7 z#importing StandardScaler
    ' ?( D7 ^! j( T  V/ Y8 pfrom sklearn.preprocessing import StandardScaler
    1 {/ L: _7 K  K/ z4 @; [: ^" u#creating object) G% \5 g' x! Z3 P) [4 U
    sc = StandardScaler()7 }: ?, K4 B( s7 Q8 K
    xtrain = sc.fit_transform(xtrain)
    , e" b& }- c7 j! }# Z' g2 fxtest = sc.transform(xtest)
    7 s! {3 |2 h1 o& h% M+ P6 |& P( C1 h* ?8 r8 x0 y, }
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
    ) d( c7 }2 \8 O) w2 d
    1 }- Y7 d9 Z, a  c2 e7 W  _9 G#importing keras4 e& n( q0 \/ \( ~0 e' D
    import keras" u# _1 n" Q* w$ Y$ ^
    #importing sequential module
    - X6 o# Z8 Z' x' z8 |from keras.models import Sequential
    ' ?+ ~; y) J* J+ z# import dense module for hidden layers
    ! ?* D' \- C) m3 @  R% Rfrom keras.layers import Dense% J; ~0 D6 B& f
    #importing activation functions
    7 E/ _: E% A' l' }8 u. F6 K# B4 Vfrom keras.layers import LeakyReLU,PReLU,ELU1 K$ j. Z4 ^1 B6 H8 `
    from keras.layers import Dropout
    5 l& W& B! J/ _8 `3 q, E' q5 p! Y% n" h- }4 d) \% d
    创建层/ b4 i- S. h' t7 N
    导入这些库后,我们创建了三种类型的层:7 d$ q! T+ s2 {3 ~* ?, C
    7 q/ p+ c* w, k# P6 F/ I
    输入层( l! a2 S8 @1 _
    , r, Z  h( y* Q2 f6 l- M& ~0 m, k4 E2 I
    隐藏层  A2 W/ O6 ?1 b. v1 Q

    3 Y7 ~5 I0 \4 R3 b, ?: p' ?6 G输出层
    ( x$ F' s, ?9 g# i
    . U! |, p" K6 S$ o9 I首先,我们创建模型:1 v4 t& b  s) ?' n' e' D5 Z

    # m# K! D3 b' W6 V$ @# X0 n#creating model
    8 Q% h) @4 m! D/ P9 Kclassifier = Sequential()
    8 l0 ?: ^, D) h; Q! |2 J& J( x$ r! x' Y
    Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
    - T2 |3 U3 A; {
    6 m# F& ^5 L$ K# |% j2 L5 O/ c1 w( F现在我们创建神经网络的层:1 l: @/ s8 \- N& v8 N
    * X$ u5 Z' n' ^$ y, f
    #first hidden layer. t# c6 |; r# e3 r/ c7 e' D
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))* u& |8 p3 q4 C% R
    #second hidden layer
    * _# }! n* M4 m  [7 Z4 oclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))8 `" R" R4 q  ?9 p7 W7 \9 F0 h
    # last layer or output layer7 f+ O" C" d/ K' J% I$ G
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
    ) O* h: \- b; f* k, L
    6 g! a- `0 o- U/ {% @! X" [! R5 g在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    9 D- f/ j. {6 H: @, O* x- j; q. u+ s8 P- _( _$ l/ @. n
    第一个参数是输出节点0 A8 ?0 h% f; p' [! C

    ; P4 o/ Q9 V- X" C+ ?1 R第二个是内核权重矩阵的初始化器
    4 [7 ]- E8 C( F+ I# s9 L* Y
    . I+ E' G, h" [( |! Y7 [- Z. M, l第三个是激活函数
    - w- @; l+ U( ]3 ?  U+ _
    2 W$ w3 y. p2 v最后一个参数是输入节点或独立特征的数量。8 H8 G7 r3 w  z6 M6 w
    0 O' v% F5 G8 c- E1 {/ M* F
    执行此代码后,我们使用以下方法对其进行总结:% c, O, y7 Z6 }- n
    #taking summary of layers
    : {/ [2 |2 _6 [* Z$ Q" W" }2 B( dclassifier.summary()% m) b9 @. |8 b

    3 }( _) X5 I+ ~; h5 S+ i& m6 ]. ^) w: d$ P: k; {/ k9 w
    编译人工神经网络
    3 h0 ?1 f6 \, a9 L' ~5 P现在我们用优化器编译我们的模型:! P) ~4 V8 ]2 u4 @1 z* X3 ?

    4 J7 a- S' G4 m: i8 s#compiling the ANN
    1 |. q" v* h; j+ ]. Hclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
      `7 O' s- b6 Q" c) F0 R( w( U- o. ^
    " {  g. m- u( F将 ANN 拟合到训练数据中; K4 I( c& v8 }
    编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:. H" y+ S8 g- V

    9 c: Q3 {! F, C! t! m9 E3 ?3 E* ?' q #fitting the ANN to the training set
    & x& Y& f# w4 [0 {) r2 @' bmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)0 i! c: Z( a- b0 q, ^; ?1 ^% Y7 k1 |# L3 @

    8 {% F: x6 J+ j$ a
    4 e* \7 N$ A- t! Fit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    % e9 g, N# K. y% n- e
    ; [9 u# w! d5 L, Q8 a/ J在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
    - J  |5 x+ u% x- z2 x
    3 }5 @/ ]1 V- f3 e' ~; N7 n#now testing for Test data0 d- x8 e/ H  B4 A7 K
    y_pred = classifier.predict(test); G1 Y; k' L- L& `0 w+ o$ c2 o" M

    + l3 ^( c- r6 f+ j' C在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。4 I. q% c/ y2 R
    0 `/ s7 B# N. a/ u. b9 r; p
    #converting values; z4 V* R$ t# z. [
    y_pred = (y_pred>0.5): M" S4 r& P( |3 F0 w* I4 i; _
    print(y_pred)- M1 Q+ Y0 D& [  u( y7 D

    " ?- o$ x! J! ?( d/ A# S7 L, u4 j  f& X3 g
    & G) ^5 N7 G! \/ r* N3 H5 r+ G  M# i
    分数和混淆矩阵
    ) Q2 {9 H; u. I: P( _现在我们检查混淆矩阵和预测值的分数。
    $ I( q1 C: n* C& S: v) N
    7 K; b/ W. o9 C  }" afrom sklearn.metrics import confusion_matrix. Y" I, j( u5 _4 ]
    from sklearn.metrics import accuracy_score
    0 ?% m! l4 u5 wcm = confusion_matrix(ytest,y_pred)
    0 n9 z3 d( n. j" |& Oscore = accuracy_score(ytest,y_pred)
    7 u, ~0 l* [  z& ~( vprint(cm)! G2 w3 T& t# x; d& k9 h3 I8 l
    print('score is:',score)0 Q7 c% m7 ~( ]
    : L- |% D9 R, u( c  P
    输出:; r- k, h8 l# ?
    4 P8 W6 e9 K" s4 v9 N

    6 Q; I0 V6 H) ^; ^( I7 _, N+ L' c- J8 o9 L, T" ~5 E
    可视化混淆矩阵* K$ E4 t3 q( b" r- W* R
    在这里,我们可视化预测值的混淆矩阵' E, q" J" h9 M% T, |

    " D* A) T3 h; ]+ Z# creating heatmap of comfussion matrix, \: a$ S' `+ o" M6 z
    plt.figure(figsize=[14,7])
    ) N6 B, g* w$ S  I4 Psb.heatmap(cm,annot=True)
    ! l; f- ~& H1 X  Dplt.show()
    & u/ c) [7 l6 J' m1 r) b: {/ N, s+ K. _' [

    / Y2 w" v5 q# c7 Q1 m
      V! q  a& p( K. h' m" O3 O: r可视化数据历史+ n2 V2 O1 V; P( {
    现在我们可视化每个时期的损失和准确性。5 M' H2 [" @+ [

    ' g9 N0 K- }4 {. \1 E2 n; I7 e# list all data in history; L" p0 O4 i% }2 P
    print(model.history.keys())
    ; R( ]# o( {& \* @9 K& k* D! ~# summarize history for accuracy) c% F) B2 z# Z  F# S" b# h. Y
    plt.plot(model.history['accuracy'])/ \, L0 V* o5 x5 A8 a4 E; A2 t3 n
    plt.title('model accuracy')
    1 O$ ~7 d, @5 Hplt.ylabel('accuracy')  h# O& D& g4 X* C
    plt.xlabel('epoch')
    7 ?% W8 h' Z: b* Xplt.legend(['train', 'test'], loc='upper left')
    & x" C2 c0 ~! A# w. Bplt.show()
    ' _  c9 }0 ^  e! e; o  h7 B+ Y7 }+ ]  h* }- W9 l( {: U

    ( J0 v  ]9 B9 z7 \
    & a+ v- N7 {. z6 ?. q, i
    ! W0 }) c2 y, O4 T1 L3 B5 t/ g- s4 @: X# summarize history for loss
    ) B, [' ~7 y5 ]) H3 Jplt.plot(model.history['loss'])  v; ]9 J! C/ |. z  n! N
    plt.title('model loss')
    : j/ h5 ?% d4 Rplt.ylabel('loss')
    9 o- A( ^2 s6 f; e# K6 o& i4 Wplt.xlabel('epoch')2 B) t( ~  F: P5 H  N) C! }0 c
    plt.legend(['train', 'test'], loc='upper left')
    * p4 W( ~6 m& R+ }3 V/ W( i9 Mplt.show()
    ( A" f# s9 o9 ?% O( V/ b3 U9 i" p% l4 S1 [1 i: G* |, `; ?
    $ [. `8 X0 [0 Q4 L

    7 t( k2 }, [! ]- G保存模型

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


    •   d4 J1 u6 J' o( }0 f2 K# x% |" e

      * @2 D+ B8 |5 i" U* C#saving the model
      ! I& Q) G" Z9 S

      5 u4 x. \2 u- |4 a- W" N
    • . O  _! [( ?% E
      # h7 z% d/ m5 D5 ]0 }5 }7 e) M( c
      classifier.save('File_name.h5')
      , L: z) i: c4 Y' p
      9 h, g9 t& h5 b$ z# T" ]6 O3 U: y

    • 4 G! r/ m2 c; S1 F8 \: S& e0 N' Q( c& Z: {

    ; {1 J3 g* Q7 Q# E5 d
    4 V# X8 M3 W% n8 g5 y
    / J* p, Y5 l% Q# r
    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-8-24 17:06 , Processed in 0.473354 second(s), 51 queries .

    回顶部