QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络/ r. P0 M( I, Z6 [
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。+ @4 a" |3 u1 b: @) o
    + s* |% \/ @' e4 o8 a  E
    大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
    0 T3 A) d% g1 J% w
    8 s, d* m/ I. L! o它由三层组成,分别是:
    , }" ?- Z1 b, G. |
    3 u3 k/ Y! ^  _# d输入层6 L3 Y+ w& _; `
    6 L4 v4 J: a% m, F% c
    隐藏层
    % b( W4 s% C! L+ b5 l4 K
    & p4 ?. i+ X, x' ]  w输出层
    8 M0 W5 q! Z- @- q5 f) T. }
    " k* B" Q1 r5 C& i! Q2 u% ^3 w6 Q( e8 A4 U
    使用乳腺癌数据集创建ANN7 I8 i& Q6 o- B. R( C$ k, T
    现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。
    " r# e: q# c. ?- I4 V) o7 G1 }0 x
    9 v: @5 o$ T, r) L! G首先,我们采用乳腺癌的数据集,然后继续前进。% [$ m8 q. e  Q! R; J' L
    ; y* v! g* B' H) T6 N+ ]
    乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
    ; @0 `! R* r' e
    4 y/ M; y4 F& s# l7 q下载数据集后,我们将导入所需的重要库。8 {5 N: c( V) X4 I: h  D2 N" a- L
    4 d2 `3 f  l! ?: Z
    导入库
    ( i  k4 p5 ]2 u4 H# m9 x#import pandas
    8 F& K; s2 B7 D% limport pandas as pd
    4 X. a/ Z  n, ^, K2 P#import numpy
    7 t1 r7 {  v, x6 g0 S% Gimport numpy as np
      T/ F0 j$ ]) ~- ^* x& d) yimport matplotlib.pyplot as plt6 l8 {" O6 v" ~* E# q
    import seaborn as sb7 E& g1 U4 M- m* P2 Z; R  r
    这里我们导入了 pandas、NumPy 和一些可视化库。8 X' i( @& e4 ^. z1 l% C" `

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

    ( H4 }# C2 E* s! z  k
    df = pd.read_csv('Breast_cancer.csv')+ _+ n/ }9 t% b. u4 O: ?
    df! Q- @* ^( \3 ?

    6 Q# ]8 W4 t3 z  [% v  p+ ~( h5 f3 y" @/ j5 c7 W
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:$ _! L' A7 `  p0 W

    $ s3 C" V) I( P9 w" }# counting values of variables in 'diagnosis'! g5 q  J+ |4 @& [/ I* Y# P
    df['diagnosis'].value_counts()1 `7 k  h  P( x

    % N  N3 L1 U: J" O( w1 Z$ S+ J: ^% h& A0 Z' D( l

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

    可视化值计数( n2 L* d4 a' S9 G& u
    plt.figure(figsize=[17,9])9 N  }# G% b& Z% P3 u
    sb.countplot(df['diagnosis'].value_counts())
    ) |/ N3 C' }& Xplt.show()  z+ y1 V9 ^4 ]7 q4 z3 o7 @+ p$ L1 o% G

    * ~: o- @6 Z: K" w% p( f7 u" \8 w5 [5 T* j
    空值

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

    ' l, ^0 h/ s  i8 y# j- y
    df.isnull().sum(), ]! j( q8 u7 k9 ?9 R
    执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。$ i- l3 Q9 f8 v  u% m8 R1 R, C

    / T7 }; @5 s" v( j#droping feature
    % R' v) d' i# z: q6 [6 T- ]& }df.drop(['Unnamed: 32','id'],axis=1,inplace=True)1 W0 ?1 O3 e2 q& G4 t

    0 [7 ?/ g  A! Q. c自变量和因变量

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

    0 g, g6 y* f! E* h
    # independent variables
    % h# |: X% b! q8 x9 s) Z  ox = df.drop('diagnosis',axis=1)8 w' G+ t) a8 U- N3 _: `! R; B  O1 m
    #dependent variables) D3 c5 @* W- \/ |. u1 ^# e0 Z% ?* D
    y = df.diagnosis
    6 n1 W8 N6 W* f  n: Q% O# C 处理分类值
      g; W7 K- H  D* T) b当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
    ( _8 h2 x, O6 N7 D& r
      S# G7 u- k" |from sklearn.preprocessing import LabelEncoder
    ! M& L% o/ Y! }+ N#creating the object
    0 C2 N3 H) W8 n+ `lb = LabelEncoder()) L/ `% J2 k: w) [
    y = lb.fit_transform(y)' b" ]4 c4 t, H$ L5 d. r  d" J
    6 ^; o3 N3 R8 w
    拆分数据5 |+ f5 \& s: Q% N, q+ S
    现在是时候将数据拆分为训练和测试部分了:
    / G9 E" v6 K6 h
    $ I3 C- I& i' g2 B  c" d6 |4 Rfrom sklearn.model_selection import train_test_split
    : W% W. j/ L% l0 Z9 \xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    8 P& \" D& g$ N% L
    ; M0 E' `0 F0 H缩放数据6 U" [' V/ I* G  J
    当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
    8 y& k2 Z2 Q) I% Q& d9 D2 F- I; h! K, h/ F
    对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:. w: P5 j- `. v" R/ r" z3 k4 Q
    . ^! f* K0 f8 Z8 o0 H, C  V# |4 s; B! D; q
    #importing StandardScaler
    # h9 T( i3 Z. Y* c: ~- y3 Wfrom sklearn.preprocessing import StandardScaler
    , `; w+ c' ]9 F  o: q) H" A% k; Q#creating object
    2 F" u  o/ B0 s1 D, }9 F! jsc = StandardScaler()' j! @8 V6 a4 |) [+ B
    xtrain = sc.fit_transform(xtrain)
    - u9 x0 S# M) X9 \4 ?! ~% ^xtest = sc.transform(xtest)
    1 |. ^+ X* I2 [; v) x, q7 a2 T: p2 Y, ]( |
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
    , U8 r) ]# E9 G4 r  n3 g
    5 X; r5 \: T2 [# R/ p- u#importing keras5 n2 c. D& D$ O4 D2 J
    import keras
    / Z5 F; x. {- j* |& P#importing sequential module4 n4 X& o$ T$ t  v0 i% m% O7 r
    from keras.models import Sequential
    8 S3 y/ v2 o. H& R2 U8 o% T' G% l# import dense module for hidden layers
    - f/ [( V+ U9 u( e/ afrom keras.layers import Dense
    & x, ^& m6 z0 y* ~4 N#importing activation functions+ C# E1 m& F( z4 E
    from keras.layers import LeakyReLU,PReLU,ELU' G' o) p( ?: \1 }. m
    from keras.layers import Dropout% D1 s6 z1 E4 V0 T
    2 y/ }- b/ e& f
    创建层
    & {! c7 m& e$ g: o: R导入这些库后,我们创建了三种类型的层:
    4 _6 v. L' z. @+ w" L9 W' g# h4 q8 M$ V3 `
    输入层
    $ @/ W4 R4 c# m; H: _4 N; I& ]! i+ x
    隐藏层3 p  J7 |. ?5 I: ~) e/ W$ J
      t9 R' p  H0 a2 {& b
    输出层3 ]8 _0 h' v, E8 U
    ' Y3 Q2 F7 N+ N8 F
    首先,我们创建模型:& i  ?0 f$ y$ S1 J1 U

    4 X7 e- V) W  w' j; J4 K. ?$ N#creating model
    ) W" H' b- K/ ?! k  y0 @, @7 p3 Qclassifier = Sequential(), F2 }4 r: |3 d+ v& W! a8 q5 m7 T
    $ g# A3 o6 j  }! `$ X0 d& a, b
    Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
    0 K( t9 F+ q% U: Y% J2 ]
    7 i. l2 b/ L) O5 y  j* x现在我们创建神经网络的层:* b( m3 u! _$ ^, b& [  w( Q
    " V$ |2 C" H  s
    #first hidden layer
    ! a( i/ L4 h5 I! v3 gclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))
    + b5 d& a( h' ~' X  X1 n#second hidden layer
    ( e0 r* c. O7 L6 b7 A6 aclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
    $ r- B6 |- U' i4 c( F2 A  U4 P# last layer or output layer
    3 _: D, E8 M% C8 K% lclassifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
    6 y. {& `. ?2 e) F0 B9 S5 a  E/ p& w+ X1 Z
    在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。" a) F; x2 ?/ F! ?# M8 |

    4 b  c5 i9 |1 a. ]2 l* E4 z第一个参数是输出节点
    - o1 L: R* t( L+ ?  s  |& m
    " l- q# ?' [. r1 p+ Q第二个是内核权重矩阵的初始化器+ @) q- a5 C+ A/ L6 e
    * M! ^0 i6 \7 }- |# B+ c- m
    第三个是激活函数
    0 r( R- ]5 A1 C* v" p  {/ B( {% T; H' ^) C$ v
    最后一个参数是输入节点或独立特征的数量。
    * o2 [& s" M' t9 j9 f) _& S! q' i% a4 W: [& Q/ j, [
    执行此代码后,我们使用以下方法对其进行总结:3 [1 x, q' [- s: n0 o3 @
    #taking summary of layers
    + Y$ I/ ?$ G8 e; h$ Zclassifier.summary()' |4 Y7 R1 H; h/ ?" U, O! v, W

    . b3 J  l+ e& b0 Y; R- n
      }" Z: [4 X9 c编译人工神经网络. r$ ^) v6 Q- i" f, ~% [' }
    现在我们用优化器编译我们的模型:
    . |6 ]' n. c+ w; l; F- \
      C# p# Y$ ~1 a#compiling the ANN
    ! \; z# {7 t+ t' x0 K: ^classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    , f* l* G6 S; a
    6 H' T! |. ~1 E- T( I将 ANN 拟合到训练数据中/ Y  F4 p9 P2 R' K* P* U
    编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
    7 Q) [8 A7 o( C, j4 M5 |
    8 u) I0 Z; O2 g0 d; b6 O #fitting the ANN to the training set. U5 \0 f6 c" j# a2 ]0 ]3 N. V
    model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
    5 A0 k- L2 B, x- p' R
    ; Z1 m; k/ P$ p  A$ f% E
    9 K  |; a; k, G4 z  G' \it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    - S  g7 \) @  P/ d  W6 ?
    + f4 M9 D- @5 z9 n在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
    3 d0 c$ [+ @, u/ Q9 k( O3 M2 Q3 M; L  B- X  j5 v
    #now testing for Test data
    # e2 Y5 _. Z+ j$ @& ay_pred = classifier.predict(test)
    * U$ x- D7 M3 J" Y: M+ L! G0 h1 G( D7 t4 W2 {
    在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。; L& K. A5 a! X, h* j9 a+ O0 G  ^1 \
    2 ~- ~; i$ ~& g: B% j" u
    #converting values
    " p( Q" V( B7 z, o% b7 `y_pred = (y_pred>0.5)
    ! r$ r* C; O5 }7 Jprint(y_pred)
    9 m$ ]3 a" H4 ~2 H, T( Q, b4 \- o0 e# Z
    ' ]3 Z: V% k9 ], ]8 L

      g' o; i8 B7 G0 j8 o/ v分数和混淆矩阵
    * Z  `) _& ?' v; E3 d# M" j现在我们检查混淆矩阵和预测值的分数。5 Y1 X5 C0 L! Y/ `1 o- Z0 a
    ' @0 l& R% \( a& W/ Z
    from sklearn.metrics import confusion_matrix
    , l2 j0 k. V8 q( n+ D5 u6 a# dfrom sklearn.metrics import accuracy_score: d( q- n* k' @$ `2 M6 G4 @- L
    cm = confusion_matrix(ytest,y_pred)
    / l5 @/ ^4 q9 J" y7 W% Z) Jscore = accuracy_score(ytest,y_pred)
    1 W; ?7 q6 m' \: M2 b+ m" Uprint(cm)
    $ \% I* D$ h) i9 V9 I; p" Hprint('score is:',score)
    6 M. q5 y; N- h8 b7 ]: i2 W# Z0 m- l$ Y* t
    输出:
    ! G2 p1 ?2 O5 \* D+ I: u, H* e" S! `0 c: @( L4 u( a
    : q. ?6 |/ @' d$ k1 ~0 j
    / Z1 z6 X* W4 e. L. B$ _
    可视化混淆矩阵. C' y" P: ]2 B
    在这里,我们可视化预测值的混淆矩阵  w/ x4 X& l0 g8 a, C
    2 U! y# M. J) \
    # creating heatmap of comfussion matrix# N* E9 m  _" L) m6 C
    plt.figure(figsize=[14,7])7 J8 M) r; E% s# j# K4 m, p0 }
    sb.heatmap(cm,annot=True)$ D0 N2 e  ^! ^- n% P, B) G
    plt.show()1 `. [5 E# s, B" ^& _& y
    . B8 g3 ]7 W1 Z8 g

    9 q- G8 R/ S3 Z, r4 r
    1 H7 m. g3 n2 ]" Y2 D6 ]8 w可视化数据历史8 R" v6 [0 d3 U; q1 N& e
    现在我们可视化每个时期的损失和准确性。3 H5 D7 P6 R* Q3 H+ D; x
    8 m9 `% l# W, @: f& l, O4 q& x
    # list all data in history+ H7 B# v. r, |( E
    print(model.history.keys())
    , }/ K9 s2 c* j6 ?5 X9 U+ m6 V8 ^# summarize history for accuracy
    ) a( B( G. g" `9 J8 ?plt.plot(model.history['accuracy'])8 F5 A& O8 {! w8 ]: l4 c
    plt.title('model accuracy')& x: N6 W- G$ E- y: y5 {
    plt.ylabel('accuracy')
    3 T, Z+ ~7 v) J( Wplt.xlabel('epoch')8 T* f$ g1 F4 R" T- b& n
    plt.legend(['train', 'test'], loc='upper left')1 V1 J" a( C- h1 J* P3 f: s) m
    plt.show()
    ! y( d6 Z  x" L$ `
    8 p- Y* n$ O8 g" L8 v7 p3 d& _% ?7 I7 u. @; [

    - z5 R  T) D/ |" e1 Q( d4 r
    " \3 R3 U9 t+ ^) C6 k+ Q8 [# summarize history for loss0 |) w  e4 ]- [( z8 e
    plt.plot(model.history['loss'])' @: f; k" i) z7 l6 E" a
    plt.title('model loss')
    ! w4 y2 n& K& ^  V" Y5 x8 Aplt.ylabel('loss')# y" K$ q- ^- v
    plt.xlabel('epoch')
    / y% n3 z: T5 k! N! F/ eplt.legend(['train', 'test'], loc='upper left')2 Q4 |% x3 m* V' T) d4 g" z
    plt.show()
    / [8 [8 A: d* S$ W
    # T# P9 O- x+ m0 R' k  ^) T/ v- X  {* z4 [  I
    & d' d" {; L2 {/ B% h" l0 z& d" X4 D
    保存模型

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


    • 0 v0 T* B: ]# C- c( r8 ~0 m! i  C
      ( K6 b- j8 ~, o3 z$ K
      #saving the model  l2 F! I, D! s  v+ M. r# u$ Q
      & W  j0 o% C+ m  r

    • / V8 ^+ J" s, f$ ]0 {: h# u8 z

      ( G% f6 L( n5 g$ ]( ^+ zclassifier.save('File_name.h5')
      ; E0 q( Y$ }1 A5 K- l' L

      ! `0 A$ r+ w* s* C$ D$ q

    • : m* Q# g7 I4 L5 n6 g
      8 D1 ~# ^* I' @( e  U8 m4 ]- q
    / Q% g, h3 r" c" x8 |& K8 ?  H. X& P

    / H: b4 k/ ~( g! v- l; _7 E
    ( T5 _$ q$ a9 }# ?/ E
    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-6-14 07:35 , Processed in 0.425157 second(s), 51 queries .

    回顶部