QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络0 G; \) N9 t9 \2 y- Q+ o
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
    ' T$ g2 E- E! i6 w% h6 m' d- Z; X* l
    8 |+ a# N- a7 L* s大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。9 ?1 P4 X* k' A( d, I
    ! [6 D. K) [! A$ [4 S- K2 R; C# e. a
    它由三层组成,分别是:
    # K& @3 h& c7 N  r) u& ~2 e0 U6 P" a! `0 e
    输入层
    - v/ d3 K8 ?7 v. Y. L/ t2 i: J: p/ {. a7 n# A# d0 `# a1 Y* B! O' {( w
    隐藏层
      r2 _! c0 f, D, ?1 M
    - K7 Q, [& T) _' @( m: h# h输出层& T6 E; G9 L- W6 m8 c+ A

    1 I! V: h9 x; M# \0 P! k7 z, d! p8 o- ~, l+ h
    使用乳腺癌数据集创建ANN( x1 ^3 G! u) u$ z9 k( U1 B
    现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。
    4 X! _9 s. c) d9 b
    ' e! Y5 \: g% k* L* W$ c9 z3 s首先,我们采用乳腺癌的数据集,然后继续前进。
    * d. Y4 Z% i+ m" Y
    ; r& z0 x6 Q( S; P4 A, d- C乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
    7 o0 s/ _8 L, L1 P0 Z& \$ z$ V6 \
    6 z2 t4 U, S9 ~下载数据集后,我们将导入所需的重要库。
    1 g; G5 e$ j! m8 e9 F: I
    # ?) N6 [0 e3 Z% L# w4 U导入库! Y" {5 T3 y2 C  l# M& P
    #import pandas
    6 s0 O& J7 D* m8 u" fimport pandas as pd
    1 t1 c) w8 v, L& z4 [' w* G#import numpy
    0 V* h% E" ?9 q4 ^import numpy as np7 y, B( k" J# Z
    import matplotlib.pyplot as plt
    / Z$ C2 g3 {( Wimport seaborn as sb3 ^$ a5 f2 W, K; R% ]! m! y4 i% W
    这里我们导入了 pandas、NumPy 和一些可视化库。3 @2 A5 }# i- T, a  I' v

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

    % S! R& T: _0 i
    df = pd.read_csv('Breast_cancer.csv')
    4 p2 l8 v5 W/ {7 d$ D) `df9 {; ^; Q" q9 ~9 b* o& j- A! Q; V
    ) e, {  m( ]4 M" |# K# D8 T8 U
    : R0 a1 l5 f9 E& ?0 U8 X
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:  ^; }$ W3 j2 |% L( t% u

    4 ]8 t2 n5 s( a8 d8 R# counting values of variables in 'diagnosis'
    * Y, s2 r  u' ]# K& Y# P5 O+ Udf['diagnosis'].value_counts()$ `; h) G+ O4 C! S0 o6 l7 s
    8 |. y" T" G5 t' Z; K' g+ L) R

    8 L, h9 q8 H) u8 E4 @

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

    可视化值计数4 K% W; ~, X0 Z
    plt.figure(figsize=[17,9])
    ! T$ {( ?+ X1 r( qsb.countplot(df['diagnosis'].value_counts())- l& B+ t. I& {& S+ W
    plt.show()  Q1 l* R5 H9 {& U

    # I9 J9 o  W1 O7 {$ @4 h% e5 {( A2 N0 y" `8 L
    空值

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


    & _3 V/ n1 H2 R' f6 z% jdf.isnull().sum()
    # h7 a8 y! Z3 [* S2 ^ 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。
    ! Z& z# ~( o3 b* W+ k) e
    . d3 {) D7 L2 M( k8 o#droping feature. V  d4 e2 U) [6 _( V8 P# W
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)
    / X2 _  r7 e5 I" i! v: _
    1 [! V  P: t0 F自变量和因变量

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


    1 Q- r4 F2 J) ]# independent variables
    " t: o; g. h* H" M# G5 _x = df.drop('diagnosis',axis=1)
    8 y0 v$ q' R" @3 B. g6 L#dependent variables8 j1 Z, D5 q) P0 O) Z( e- B7 @( X
    y = df.diagnosis! J# P. t3 f. a" Z4 |' g  n
    处理分类值
    / V$ L1 y: M: t; a8 @" j当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
    0 [# r0 x8 `+ v- R$ H; D  h/ g/ l2 O5 |" q% F
    from sklearn.preprocessing import LabelEncoder2 m5 k' |- S" `# E1 j5 r
    #creating the object
    6 q6 I6 f+ g( [5 l  b; i! |lb = LabelEncoder(), Q0 A( ]. e, ]- u
    y = lb.fit_transform(y). P! s) y9 {7 q( O: r" V( V
    6 r( ^. h9 H# y7 X+ f
    拆分数据
    : o, X$ p8 z9 `2 T1 d现在是时候将数据拆分为训练和测试部分了:
    1 V* T1 j0 x: B  T  M: x0 s) t6 ?# N
    from sklearn.model_selection import train_test_split
    7 Q* `2 z5 V4 W; {# D" ^xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    - W+ w1 ?. Q* b- `" P& ^
    0 {/ G/ q+ u  a; Y9 B缩放数据
    $ t* x7 V+ F+ l当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
    % l! e4 c. _7 o0 E3 m0 p
    / `, T1 ^1 s- r( c1 i% A' g. h对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
      {1 O: `: {8 L4 L- d% ^$ X3 ?2 K+ C4 @( C2 J  h
    #importing StandardScaler
    ( E+ f( m2 ]# I- C. `' Afrom sklearn.preprocessing import StandardScaler
    % [! k$ v+ g9 ~$ X+ j* s4 U, h: d#creating object5 e, Z. l! C( o8 p
    sc = StandardScaler()
    ; S1 k# Q5 R% g: \" r7 [8 hxtrain = sc.fit_transform(xtrain)( Y% ?  I1 k1 d$ u4 D
    xtest = sc.transform(xtest)
    8 |$ _/ w. Z1 ?0 B, b
    , e6 P/ h  \5 x) S; J: G从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:8 F& {* s+ }4 V
    0 d) w5 Q/ x6 r) d6 |
    #importing keras
    : A" l5 C. n& ~, ximport keras
    / [3 W! E( S& c# K+ d#importing sequential module
    * n) C6 s9 ~2 P& f9 bfrom keras.models import Sequential
    ; e1 w/ b! T, M5 ]2 M7 B# import dense module for hidden layers
    . M% ^0 O( y! }7 Nfrom keras.layers import Dense0 z/ {" c2 @3 \6 ], p/ a
    #importing activation functions
    1 d1 l! m; y. |9 w4 K1 Ifrom keras.layers import LeakyReLU,PReLU,ELU
      k! |$ |, O, O+ S* N' Ufrom keras.layers import Dropout7 F( z" Y: l$ `9 Y* o5 e$ J$ b

    & k: x. f) y4 H! c创建层
      E! ^" o6 d  u导入这些库后,我们创建了三种类型的层:
    / \, F2 x' Z* C' {# t3 ~
    4 r& T' l1 y2 q/ ~, \) E输入层! }& A1 g% _$ {# O; w7 o% O
    5 H1 i) `% G9 m3 @8 N9 m$ Q- ^: h
    隐藏层+ Z: L6 U/ C  t& z" o" R3 s+ V$ b6 T

    - ]" k8 |2 z* B$ V输出层! j  X0 V! C9 J* j! F

    / O# j% |2 p+ W首先,我们创建模型:, ?9 ~6 R$ R9 w7 \* k5 ~. I

    % T' z8 |/ ^! @8 R3 c#creating model' o. Q3 ^/ g5 N% v/ W
    classifier = Sequential(), |) c. i# @/ ]. P5 B, I. \( n6 T+ k

    9 ^! o  ^  V+ ZSequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。" a  T& F: c) i, h7 D
    # A. g& p0 h9 {6 H+ c, z. r
    现在我们创建神经网络的层:, l5 H) }5 L5 D/ e* I1 R, Y; U
    " z6 v/ l/ c% Z8 u' Y& \* G* j
    #first hidden layer
    % Q0 _$ k  T9 Q( x. ?7 pclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))3 l( E( i0 f! Z/ c' [
    #second hidden layer
    / Y* n* F- V1 u7 W: J* C" [3 C- |classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
    , t7 m. X4 e( e# }  J* d( I* X# last layer or output layer
    6 F  N2 a; ^$ H6 L* H, X5 x; wclassifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
    7 l9 J$ h5 F* Y
    . k& f+ Y" C/ N! ?) J8 g; X0 k  v/ {7 g3 f在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    $ V9 T0 P6 `1 g2 o+ H( j5 w6 w' M2 U$ Y. F0 J6 U! }  v
    第一个参数是输出节点
    % X  u7 ~) @9 D6 u5 `7 F( p6 T
      x$ X9 f2 P1 o1 K2 K9 A第二个是内核权重矩阵的初始化器
    , _6 P5 ^) N+ i5 A) Y( K$ ^) R) |. X8 ?5 d/ F7 A
    第三个是激活函数" k$ a" ^  Y& ]" w* Y
    * a. H$ z( n3 r9 k# }$ l
    最后一个参数是输入节点或独立特征的数量。
    4 P# ?$ f* n1 v" ?
    4 m0 Q! G8 [+ O9 i  \4 X! U- b执行此代码后,我们使用以下方法对其进行总结:
    0 i7 Q* W. w" i2 X#taking summary of layers
    . W1 \5 C: [+ u7 Q  s1 d; U* Z4 m9 Wclassifier.summary()" O& y+ ?6 `, {: l7 B; D5 {

    . F; H' k( K- p
    ) j9 D  T" I* u编译人工神经网络' L/ H4 ]* m( p
    现在我们用优化器编译我们的模型:+ Q" l9 W3 R- b8 q" I7 z' L
    2 }% `- s0 |' i
    #compiling the ANN
    : S7 J' e8 v, ^9 mclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    6 u( o9 o3 K8 S; M1 X# D& H9 _( f# z% I* R1 e  s! b/ ?
    将 ANN 拟合到训练数据中9 L4 {' `3 b. s2 t
    编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:2 v  c( s' u/ w" l5 T! h

    . X0 \) m. V7 s( d #fitting the ANN to the training set1 `: q: a6 n, j* W  N
    model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)4 F5 s5 n5 g! P

    4 R3 T8 F  t$ R+ g0 g' ]& o1 A
    . C7 O- c  T' cit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。* ]- M1 f3 J5 v, D4 y1 }4 C

    # _; C7 e8 q9 [/ u) D5 K6 U在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:0 f9 i1 P* ^. [! |$ a" w0 E

    * ~" o6 Q) W- f- y#now testing for Test data, }) [; q  {; C+ |4 A3 _) b
    y_pred = classifier.predict(test)
    ; ]8 h8 n6 a; M7 M  ~# ]" F
    0 P3 D0 [8 ]1 H在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。9 w$ H' q" e$ c( o, ]' `
    . D8 w& d7 S! o" l) R$ j
    #converting values# R" t- D1 ]  c; p; u" x
    y_pred = (y_pred>0.5)
    4 }1 R$ q5 c0 I2 b" h. nprint(y_pred)
    4 ?' G$ m3 }( y$ J: M9 F& _
    " ^: [# o( [: O9 S" y' b
    6 D, w2 c1 `( k* L6 q7 E1 y
    * `! l9 w, T* H4 E# v分数和混淆矩阵
    * J3 ]# B6 \; P, q现在我们检查混淆矩阵和预测值的分数。6 _( ~# m' ^; K8 _/ p: z* T( l

    : }+ `: L2 k( h9 K% }from sklearn.metrics import confusion_matrix
    9 l2 u! Y1 n* @1 F+ Z) V! f, F: ifrom sklearn.metrics import accuracy_score
    $ ^/ _' U5 z3 @4 vcm = confusion_matrix(ytest,y_pred)
    - \8 s& }( s; \& Qscore = accuracy_score(ytest,y_pred)* Z2 `% c" A4 t, K; a- J1 m/ g
    print(cm)' m- `( r9 W7 @! j. d6 q, J5 ]
    print('score is:',score)4 Q  W* a, w8 H

    ! L- Z  W( C3 z: v7 p; C9 c输出:0 D1 g' r) B, N" C0 E8 U1 X  m

    ! F( I1 e% n% T2 }: M
    1 _) J1 {% T0 `3 r6 a8 d0 S1 f& J) _4 l- x( l
    可视化混淆矩阵  K+ C2 r2 U: B$ U
    在这里,我们可视化预测值的混淆矩阵  E0 c9 Y0 w" r* n$ y

    / k0 H" K# A: s+ M/ y8 ^# creating heatmap of comfussion matrix+ H& E( _0 I: j: C
    plt.figure(figsize=[14,7])& q7 J  x- s) R$ s7 j+ @
    sb.heatmap(cm,annot=True)
    / w1 e5 v" V# k4 Q# p0 S* ]plt.show()) d# q5 w) }# F% P
    " R, W1 K& W4 [% J$ j3 f: B
    % k: [9 f4 u# P( @9 R4 m

    4 d5 T) L, V& r. }8 C2 m可视化数据历史0 P5 N7 x2 D& a) M
    现在我们可视化每个时期的损失和准确性。
    2 S1 J, U3 W* F
    ( ^% w3 {6 ~; G3 _4 h1 b# V# list all data in history' t  E+ W: i3 S& `8 m+ Y3 r
    print(model.history.keys())
    # w* g4 U4 G7 I2 c# summarize history for accuracy
    " Y4 ^' I) y- Cplt.plot(model.history['accuracy'])
    + n% K7 ^: F/ splt.title('model accuracy')( \- Q6 l" Y, W) }
    plt.ylabel('accuracy')
    5 |5 M5 ^0 {( f7 @3 |plt.xlabel('epoch')
    5 a; `  B" d4 P4 k6 lplt.legend(['train', 'test'], loc='upper left')
    # R* z+ \- y, @9 Oplt.show()% m+ }+ E' s: R5 U8 H+ A% d

    # r) q/ N; K9 g% @- Z
    , o- S! Q$ S8 t( x8 X) a7 s% ~7 N7 R- I, O2 V$ T; W' n( c

    ) a2 K% L; J) m( m9 D' d# summarize history for loss, k; |! N/ `0 k+ e
    plt.plot(model.history['loss'])4 {7 O+ u3 ?7 l6 }$ }
    plt.title('model loss')
    ) [) j6 i$ P( q$ \+ k! a8 J9 Dplt.ylabel('loss')
    # R0 U- e) R! X, A# f5 Gplt.xlabel('epoch'): Z* \* F# W; X$ L7 d
    plt.legend(['train', 'test'], loc='upper left')
    * y# @) b8 H$ @6 ?$ Hplt.show(): E$ c) g6 r1 c
    2 ?0 R: M& X" j, }
    ; B4 M. ?8 \$ R- r2 g: Q8 r

    ( {0 }9 f/ ?6 D( P: n; u保存模型

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

    • + V; {1 c% T, [% e" x6 F

      8 Y) n) P; {7 E$ O- @% O1 A- h#saving the model  w9 }2 M6 O/ p' F

      + E. I4 I8 P, E3 t

    • 8 F; J  M/ A* j% Y- u9 o* r
      # @: b* R+ C2 @
      classifier.save('File_name.h5'), S! t  W6 Z  N5 v8 M
      ' T" w7 z5 S' \. }
    • : S3 V2 r& u0 V2 n9 W* ?, n
      9 Y3 Q9 C; T8 ~. J

    3 v2 M8 l( d3 c/ J
    ; d9 Z! k% Y) [( Z% h
    ) a) ?$ s6 q/ j: v& G
    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 05:32 , Processed in 0.524283 second(s), 50 queries .

    回顶部