QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络4 A; X. f' r6 e$ Y  H) J* N( ?
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。$ C% r) k; L: @- K+ z

    , p- X4 R' `2 v; i% ?大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
    2 z% A. K9 G  n" M4 R' Z  C. ^4 l( n  Z
    它由三层组成,分别是:4 r; ^, W- Z. h$ o1 f  t# v, i5 ?
    2 p/ q4 }8 E! |  p, G
    输入层
    3 c) W( s8 e, ~$ J4 M* L2 d7 h' N5 q) ]/ S5 w4 B) y
    隐藏层" Y$ _- k9 ?. P- M7 P
    ( `5 _; P" V- D& F
    输出层
    . q8 U1 |8 z% s1 |$ x; K
    4 k- _, o0 |8 L% q, M; q
    6 J" Y0 f' Y& a. q- _0 n- w使用乳腺癌数据集创建ANN6 S! Z; m! Y! n
    现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。  }) w* S) G8 ]% w7 }, R' `0 a

    $ s5 g0 }: u; s. Y/ z首先,我们采用乳腺癌的数据集,然后继续前进。$ H/ b' |. j9 \

    ' h4 ]1 P3 x& J. q0 ]乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data. l# y! _% ^1 v) \
    * M/ s& [/ @. J  ^* J
    下载数据集后,我们将导入所需的重要库。
    . x* ?5 ]3 I, A
    6 w+ J4 g; C+ v# B" s" u- @* {导入库
    0 f9 o$ H  o4 H' `# I' `/ S#import pandas
    6 Z0 T7 z0 S* simport pandas as pd
    ( {/ ~; }# p4 V" b9 P8 ?" k6 M#import numpy2 W. t% j1 ^; @/ F" c
    import numpy as np
    7 x* l: i6 a3 {/ yimport matplotlib.pyplot as plt1 q$ N5 A% d! F& {9 L; G/ b& T# g
    import seaborn as sb
    / K- F3 R/ {1 P" ]. ` 这里我们导入了 pandas、NumPy 和一些可视化库。
    3 r9 H4 F' b% I5 k" X

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


    & T6 J* x5 Q. Edf = pd.read_csv('Breast_cancer.csv')
    2 J. U. \' N1 H; ndf
    8 m1 S7 I$ U, B+ R* I$ t) l* D
    5 \7 Q& L% X. V# \1 c# O! L. y0 I( x4 v) r$ F: t
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
    " E, j" V- }/ l' [6 }
    * u# S3 h; r! u  X7 z3 ?1 [# counting values of variables in 'diagnosis'% z$ q: ~( R- b3 j' w9 D
    df['diagnosis'].value_counts()
    $ C$ u' q, h1 z* ?) m% E 1 z9 Z( h# m% X1 |% h% ?

    7 l' O7 [# g9 X# L  W" s

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

    可视化值计数
    ( N$ i) C; ~! m/ o5 f+ Bplt.figure(figsize=[17,9]), v# i" R. m% S! r+ {5 n+ d2 s* y! ?5 y
    sb.countplot(df['diagnosis'].value_counts())
    8 C5 {' t+ y6 w) t) y- [( ?plt.show()! [+ A! h: [+ R8 q, `1 V
    5 w6 h- N- j# J* y) l

    8 `* \, N7 z& T5 [2 ]% p' w% @空值

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

    % B4 Q2 d2 _- D: {+ D" W
    df.isnull().sum()% u# s1 N# l: g3 W+ W
    执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。3 X0 i% c# i# y) h

    / G, Y  p) {' h0 g/ m1 ]#droping feature
    & p/ o* u1 c% W1 H. @df.drop(['Unnamed: 32','id'],axis=1,inplace=True)
    3 j8 v) R! x. Z3 ]# r- M
    6 c  b0 M5 @$ C: {' @, M自变量和因变量

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


    4 Z' |. Q; q( J# independent variables2 t! Z8 D* L& Z5 l
    x = df.drop('diagnosis',axis=1)2 b0 N' l5 s0 Y8 x! i5 j
    #dependent variables
    ; @$ x! A) e/ K/ ^0 O& ^y = df.diagnosis
    7 ^" y% k- X  S 处理分类值7 w+ W- j$ V0 q. d
    当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
    % D6 e+ }6 A( u( |* A) {6 x+ \
      j6 o" j8 K  @5 R+ Afrom sklearn.preprocessing import LabelEncoder
    , A. l6 A  A5 q! I#creating the object
    5 b/ u* w3 {/ w2 i- T: F& \! Slb = LabelEncoder()9 L( y* d0 L) Q" p/ F  T
    y = lb.fit_transform(y)
    6 Z' `, P6 i0 v; T. _
    + s5 f: H7 i1 Q% z% \4 l* {6 Y拆分数据
    + W& O# c/ v- O0 K& n; i1 j4 }# k6 @现在是时候将数据拆分为训练和测试部分了:
    $ J" U/ y6 ~: Z+ S1 w  W! g+ D+ v
    - a3 K" ~7 c, o  Dfrom sklearn.model_selection import train_test_split
    & h5 {7 g* L. w2 n7 hxtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    ) ]/ Q  d8 i2 a7 o$ T- a7 z
    " V4 k: \- _* r) ~$ D7 F, x: F缩放数据9 }% o3 c4 w/ M, Q( t
    当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。' ~2 F  O/ t% h- C1 e, r

    . K( x$ ?( [$ C; X. z# y3 }) s! c对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:/ u5 G9 H, v5 N. V9 Y+ e, B
    " C. N- }' Z* `! L3 @5 k, ?. I
    #importing StandardScaler4 {1 T( ?( h( T* A
    from sklearn.preprocessing import StandardScaler: r: Y) S' \7 F
    #creating object
    , n8 |) q; q" Xsc = StandardScaler()
    ' h% B( o3 n7 Y; vxtrain = sc.fit_transform(xtrain)( y  J; t- u6 E
    xtest = sc.transform(xtest)7 J" m1 p) D$ T0 `# y

      ]2 D7 R: Y4 K$ R! X从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
    - U# N1 Z, z; R/ \9 L1 o5 l- D+ @
    ' c1 f$ b  M8 p/ r; b0 i' q6 F#importing keras
    & H' |) D/ z! l& ~; M7 X3 c+ Jimport keras
    ' Y/ j) o/ L. k( G#importing sequential module
    0 k, z& B2 o0 }& R: J9 Q( U% a$ Rfrom keras.models import Sequential7 t) C& J* t# r' K, e
    # import dense module for hidden layers
    + K7 ]0 g0 g" r( }$ @) z' l* |! Jfrom keras.layers import Dense
    ) c4 L4 T" r2 m9 o% F3 \' ?3 }#importing activation functions# L+ v0 @& a+ c; h+ z% G! H
    from keras.layers import LeakyReLU,PReLU,ELU$ ^6 X0 V0 m! m# ]" K/ M
    from keras.layers import Dropout  S7 P1 D- ]% O+ v( s

    8 L/ h/ c% r+ E' \- \* a2 G创建层+ ]6 G' R7 T0 Y! `3 I( D$ T
    导入这些库后,我们创建了三种类型的层:
    ( q: H* t, b9 f) L' t! B% W: K2 H$ R" z8 Z' T
    输入层- V  [$ R( {$ j" Y. l6 L
    - P  j3 N+ {$ t6 Z
    隐藏层2 n  d, J) B8 S# i6 H" \$ s
    ! m" _) x3 n2 B% H
    输出层% \, `" T+ `) p% ?  H' Y
    # ?" Z( V1 l) e5 C" K) P
    首先,我们创建模型:
    % s( q1 f' T# x1 g5 H: t- S3 x, q/ \8 w8 x9 q7 {! O" I+ e
    #creating model
    . [* a1 [" V6 Y$ a' p$ _% ^classifier = Sequential()
    # A4 F6 w: a$ l$ ]% r* @) _0 z$ W3 L( V7 g0 C5 y) t$ D
    Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
      c; K4 _3 r% z2 c3 Z
    ( I: U6 n1 E) l8 a现在我们创建神经网络的层:: G9 t$ |8 b) G+ f; Z8 }2 i

    , R# w+ L, m+ L7 x; v; Z* k2 v$ N. \#first hidden layer+ U9 y0 G0 y4 ]) Y
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))
    - x! n, d5 f4 i; E6 u$ d#second hidden layer- a, k* I+ C' m
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
    & E7 H0 `, F0 {  m1 \, L( V' d# last layer or output layer1 Y. b* {1 c4 J+ j' v9 i  `
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))6 i6 X' n7 U) N7 Q7 _0 P% `# U
    % P6 y0 H9 Q* w+ m* N
    在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    : ]& u% `5 a0 \5 T6 C. O
    7 t. p' X. O$ j9 V# V* f- a8 G第一个参数是输出节点
    ( P; c( m. X9 s. H" l2 E" ?9 X9 Q; T7 l# D6 H, D! u8 E& H7 y
    第二个是内核权重矩阵的初始化器
    * c: h) `7 W8 m2 X  ?9 L1 Y% ~0 ~: F7 l$ C
    第三个是激活函数
    " a" h" ^# s% B! e- r5 H, w2 |; M2 Z5 y) V
    最后一个参数是输入节点或独立特征的数量。
    ) k+ b+ J, W! Z$ {: R
    % }2 n( q3 C8 k执行此代码后,我们使用以下方法对其进行总结:
    4 A( F% {) @+ o#taking summary of layers
    & s2 F! k1 V' j$ ^classifier.summary()% a5 z+ Y3 k* ?' y* d8 Z
    ; `( l8 \8 |) m, ]

    ' C& q8 J* ^  j/ B编译人工神经网络
    / h8 Z6 r5 J( V4 x, T' U8 g& y+ j0 |4 _现在我们用优化器编译我们的模型:
    1 f3 W/ X: X( r% |0 X7 Y0 l4 ~' ~8 L
    #compiling the ANN5 p* _2 c$ T. s9 G# h
    classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    + X% T; m9 g1 B( D9 ~& N; t+ y: P, h" x
    将 ANN 拟合到训练数据中: Z; o& h. d  m9 q+ {# l
    编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:9 [: M  Q5 c& o
      r8 d4 m/ D) g* i6 y
    #fitting the ANN to the training set& z" ^+ `9 d9 c
    model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100), [. N- Y( @/ \; Z
    " S2 x* z8 o7 H- k

    ' f1 g! S7 M! n2 [( @/ Hit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    : o: J1 U! Z" d) h9 R: H
    6 h5 w1 p3 j  {# a2 F( G- n. Z$ e% T在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:# l% y; v9 q" D  K6 J; r
      ^4 m/ a/ O; U1 t
    #now testing for Test data
    % M  P$ q; R' oy_pred = classifier.predict(test)& W0 d7 E! r  @: x

    , |+ B# l5 X! @+ U( c在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    " O% ?( h* ~" c" n9 E5 R& e2 J  x( ]7 j& Y. x
    #converting values
    + ]& A* O' D9 C( @; L" A: X) Ky_pred = (y_pred>0.5)$ h: P2 O- V. N' \1 M; J. c# X8 E
    print(y_pred)
    1 M+ K" E# N: l6 {$ Y% h; ^- ?: ?, _0 q

    3 p. z4 H! V' m8 t7 x8 z8 r1 ~5 N6 P( w
    分数和混淆矩阵0 G1 D" M2 G* }7 z! n+ V
    现在我们检查混淆矩阵和预测值的分数。* z% N* K) |% }! S* p* P3 w* H
    7 k1 \! _  g( a/ O4 a
    from sklearn.metrics import confusion_matrix- q  G6 I  C0 S$ J" ]  X# g
    from sklearn.metrics import accuracy_score0 ?$ _$ q4 G. `; o' g5 _
    cm = confusion_matrix(ytest,y_pred)
    $ L! n$ F% e( W" C- H! t2 \: {score = accuracy_score(ytest,y_pred): y& f7 F9 ~% N. k- _- K
    print(cm)
    # W6 U+ c+ ~, P$ u& a" D( Yprint('score is:',score)! ?1 O) Y7 o; E0 t4 i

    7 d/ J* w) h3 w! w: I( X) ^4 @输出:
    * j& ~  k3 Z! c9 u
    9 z! ]% Y* `0 l1 I% m% {( T6 V+ g! N% p5 H  E9 j
    + e1 Y7 V# C" u% f3 s
    可视化混淆矩阵
    0 i1 z0 a5 w. Q) W0 o! m4 G; U在这里,我们可视化预测值的混淆矩阵
    8 S6 i3 d8 L. @5 R
    : P( l  M, Q7 b6 v" s% c# creating heatmap of comfussion matrix
    / a5 [  G; ]9 o5 Y  [6 `% w' gplt.figure(figsize=[14,7]), ~# E1 M" b1 m3 W* y/ U
    sb.heatmap(cm,annot=True)6 m" I  O$ R& |8 v" ?
    plt.show()) {6 C, G( V' k& T! O4 a6 c9 b
    3 k8 u9 f1 x- |; F. |. k
    4 w3 n$ M6 b/ M* d* N

    6 R+ o! V6 p/ y+ n) i4 @5 X可视化数据历史" A. x6 j1 ^& ]* v+ m; H# ^* S
    现在我们可视化每个时期的损失和准确性。
    & j' N( {* {& H' E! B+ \7 t8 A: w: }7 @7 X
    # list all data in history# A3 n9 D$ E  s, \3 u* L, b
    print(model.history.keys())
    / b/ z% S9 j- U( D9 M# summarize history for accuracy+ b: q! \7 }; A) O; o8 ]+ E
    plt.plot(model.history['accuracy'])& I# e2 N( I0 m: u- Z
    plt.title('model accuracy'). m# W+ w4 F; `" t% u
    plt.ylabel('accuracy')) l  Z1 @+ ~$ z; O) A8 d6 \
    plt.xlabel('epoch')5 X; q7 U0 S) X; X
    plt.legend(['train', 'test'], loc='upper left'): `" H* J$ m8 C& g5 g4 W
    plt.show()" O/ z' Z% O8 O9 g& G0 P$ X

    & B7 J$ c8 u. O# U
    : b5 n% e2 H5 {* P$ z
    ! n, f# t) R  M6 f4 e' a4 o* H
    ) e- |+ T6 h3 W' d& d8 E# summarize history for loss
    8 t$ j, ?/ D$ r; d0 T; C+ ~, [plt.plot(model.history['loss'])
    ( _& S) S$ C% B- fplt.title('model loss')
    7 N  w( e- v- mplt.ylabel('loss')
    ! N* y5 q# w, P  e- b3 Bplt.xlabel('epoch')
    ( n, L1 `  ?; jplt.legend(['train', 'test'], loc='upper left')
    & y( s8 Z: N+ O/ G+ K6 _plt.show()5 J6 m1 `: t9 J" `

    1 Y5 k, a' r4 K" L9 q* J6 b  x1 `  s$ K) `
    5 a9 H8 y# q+ h
    保存模型

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

    • 2 ^: B$ k$ l* R2 K3 ]1 b

      9 C' I7 `( o4 T8 B! h& P# `#saving the model
      : x7 S+ `- P1 [) E  H2 l, n! C5 Y

      " v% e' d6 P3 S( w+ O! ?

    • " i: |4 i; M3 \9 o

      ( G  i! e) g( N4 Nclassifier.save('File_name.h5')
      2 [$ v% K9 d+ o: z7 Y$ e
      5 S. q+ U' l% a# K
    • 2 O- B' o$ B( ^& x, k+ M! ~

      ) `: T5 Z8 @; ]$ Z- R* L7 Y

    9 D4 R6 l* Z3 h# x
    * A! M1 D; q6 {0 [! E4 m( J4 I1 Y; `- |' \& P
    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-9-12 09:24 , Processed in 0.715630 second(s), 51 queries .

    回顶部