QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络3 Y% R: x7 j1 N
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。; F) \' m7 @/ ?# h1 U6 h5 l
    ; f& I- @0 o- w2 Z
    大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。6 i$ b" \% x9 H& h, R7 }

    / U5 C2 ^: T' k$ v% ]/ i它由三层组成,分别是:) I" W& z" K8 V( H' Q: M0 F+ \$ {
    + ^. h- P) ~) s  U) A' V  Y/ E
    输入层
    , Q3 `* Y; y! O; ~4 O6 c; n+ n$ D  H; o4 y) a  S0 }
    隐藏层1 Q/ o' t, Z& U* x" d& o3 k

    - [, Z6 u8 t2 V  O输出层: i3 G  t" j& _# O( x: X# F

    % L# }$ A1 E6 g% d, m& N% u/ K
    使用乳腺癌数据集创建ANN
      A  f; L, p% M0 r2 X现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。8 R. T. i5 w8 c+ h

    0 o4 N4 v# Y  C首先,我们采用乳腺癌的数据集,然后继续前进。
    6 @% d2 K; W0 E: P1 I) L: g  H( h
    乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
    . X9 Z% S3 q4 m( X7 A# }5 x' ]" m
    5 x& I7 `( N+ P, j4 i; k  Y下载数据集后,我们将导入所需的重要库。
    : [/ R$ Z% P: q# i$ K' y8 L" k1 F5 L8 J' A; s- e
    导入库
    " f" A+ n6 N7 k+ T6 _9 i#import pandas
    ; U9 w6 p  |6 rimport pandas as pd0 G7 S  H2 U2 s. I
    #import numpy
    ) y) }' n( G6 l* ^+ wimport numpy as np
    ) I. {$ W# x* Gimport matplotlib.pyplot as plt
    5 Q8 b+ j# u0 m- ^import seaborn as sb
    5 p5 w  i) b  H6 W 这里我们导入了 pandas、NumPy 和一些可视化库。
    4 F. d* J* F, X

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


    . z1 s+ J$ H8 w# R8 W) Odf = pd.read_csv('Breast_cancer.csv')
    / r, D% {3 }' K. }df
    9 Q/ j+ V9 n; E7 y& b& z
    4 p, M' S7 J: Q* t' s0 T1 \  g( B8 _* `6 ], G/ z
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:7 h- H4 R1 U6 B6 k9 M' ~, b8 ^* b

      H4 Y, e- z) n! h0 W# counting values of variables in 'diagnosis'
    7 [$ E) C9 c5 H. Y1 Bdf['diagnosis'].value_counts()7 M# [3 w; t& q+ Z5 G' |' X

    4 f) [4 z' |' C. H' _) o4 G  @# ]6 B
    . d+ y. u* f& z7 o2 T

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

    可视化值计数  C  G2 q3 d, ], d8 r4 Z
    plt.figure(figsize=[17,9])
    8 h; @, h" L" }sb.countplot(df['diagnosis'].value_counts())0 b% w) p! a' n- I
    plt.show(); d1 @! [+ c1 h+ w: m8 p

    ; u$ n7 m' P  x" K$ u; X& W. N" I5 @
    空值

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

    9 S) v, y' h; m( P  _  w
    df.isnull().sum()
    " `. F" Q- a, f7 r+ Z0 D1 h* f 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。
    9 h2 A* [! D* v$ A: x# q
    1 y3 s" m: S/ P#droping feature
    9 L' S/ F/ s! u5 }) ~* Ndf.drop(['Unnamed: 32','id'],axis=1,inplace=True)+ \' o) ~& W# H9 S; U' Q
    6 S, c: @) c' R
    自变量和因变量

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


    ) N( ~3 q5 ~( O5 l4 H% Q( [' p# independent variables
    , ]" c4 W9 d, n# ]) ]; N- nx = df.drop('diagnosis',axis=1)7 T, k6 l$ l! Q
    #dependent variables
    1 ^# @: u/ Q* ]* Hy = df.diagnosis
    ! k: \; a5 J' b1 v& c 处理分类值
    1 C0 R$ S9 V$ ^5 @6 g当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。: j1 m7 ~+ y+ V
    4 r% Y0 d1 x# w, h" s* C$ r
    from sklearn.preprocessing import LabelEncoder
    6 k  j) I1 @) s. d3 @, k0 ^#creating the object5 A. o: v! \2 q; s  N1 w
    lb = LabelEncoder()
    , n6 }4 Q$ j* M1 V- ]: ~6 Zy = lb.fit_transform(y)
    7 t0 O1 a4 J/ Y9 A% O, h, N, V$ A2 E) H
    拆分数据/ v  D  Y3 t4 K4 L/ ]" @7 H
    现在是时候将数据拆分为训练和测试部分了:( S. n3 }# H+ O$ `3 E: `
    * A$ z! p2 Q" U* U
    from sklearn.model_selection import train_test_split
    # J# P7 Z' R( ^! b' _2 C1 E4 Nxtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    " S* Z" T, _5 R. u6 K
    ' [. e; V6 Q# V. ~/ ]6 S缩放数据8 O$ N7 K5 J' G( C& p$ l
    当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
    4 j9 I6 v9 P1 |4 f' u" u6 @/ C' G8 ]: ?5 R, `" V7 _
    对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
      N4 Z' E; @; E( c$ B# [, I- D& c2 n8 i9 G8 R  R) {/ X- t: ?
    #importing StandardScaler
    ' z: L' E$ b0 N1 s; kfrom sklearn.preprocessing import StandardScaler  f- W4 R' z! |- [, T( f/ _; r
    #creating object6 i6 \# P! R& J, p/ f
    sc = StandardScaler()9 Q. ?/ I; {5 Z
    xtrain = sc.fit_transform(xtrain)
    7 M. S8 |/ x& ~3 q+ W; nxtest = sc.transform(xtest)' k' A5 _8 ~; M# B+ Q. |! Q: @
    , [3 @8 c3 R, {' j: ?$ d; m, X
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
    % _( f: n* d4 L  N4 }$ t% a6 n* {5 E
    #importing keras5 ~2 v. H& W& t- R6 J8 n9 M3 Q' f: _
    import keras: U: H7 e7 Z8 u: ^( z7 W
    #importing sequential module
    ; g: s3 Z- d# D4 xfrom keras.models import Sequential
    ! d) X6 |/ d/ H1 }# import dense module for hidden layers
    9 \5 M6 N/ q5 e4 K& F0 k5 s- }from keras.layers import Dense! ]/ \% @8 H8 G, E0 k$ `
    #importing activation functions( K; |6 b8 W, n2 ^2 O
    from keras.layers import LeakyReLU,PReLU,ELU
    + o; D' v1 M$ Z; W  Qfrom keras.layers import Dropout  [: {6 E2 T( d% }4 A& R

    ! y# [2 g6 D: V; h' r" v创建层) o4 N) g' w$ x
    导入这些库后,我们创建了三种类型的层:
      {& n; J! v( y! t" N7 U" l, W( r
    输入层5 M4 B: t$ ]4 k( v3 M3 e' [

    ' Z% H# J' v; x( K; f0 w/ \% f隐藏层
    7 y4 W3 v" x: o7 l# [: w" w$ U/ h% d
    & K7 Q" J* e. p/ j/ j# k输出层
    8 G$ Z, Y8 P# t+ {+ P" F: L
    7 x1 |# J' f' @$ @首先,我们创建模型:
    8 P0 P. [7 q; x6 g5 d1 c5 E' B
    ) ^, [$ B, S, v- C#creating model- U8 t; Q9 r6 b2 w7 w* a2 ]: ^
    classifier = Sequential()
    8 Q# \) M8 @! g7 M9 X
    ! d/ t* T- h, w) I  USequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
    . T7 K1 i( j( H) ~. |2 w) N" M
    & _* _9 Z: A! _, P+ ]/ Y' U) Q3 N( `9 J现在我们创建神经网络的层:
    & M; f: a  V) E  J" I* k; f4 e$ l. a& q4 @
    #first hidden layer0 p6 V, J2 r/ ?( R3 C: j1 j
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))
    & l! q. ~( e6 h$ F* ]#second hidden layer0 I  P) R7 d5 P' ]. A
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
    . k- N% v/ G: G8 Y+ ]3 j7 o# last layer or output layer
    - S' D- w2 K, V5 dclassifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
    - L$ f) k; [2 X: K: U
    2 x7 a7 s( b* P- A% ?. g' N在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    + c, U* O# }/ s' f6 u- |( ~5 |- N# d1 T3 V+ b# `8 |$ u: n" H
    第一个参数是输出节点
    # b% U7 L* o8 C& K
    $ H2 A( ~- a" p' s9 ~第二个是内核权重矩阵的初始化器
    " z& C$ E  O5 q+ Q* `3 n6 \- D$ Z( x$ S, E6 M2 L5 N+ |! H
    第三个是激活函数
    2 J" s  j/ S, a. s
    + u- [$ d: s) S" k& r% Z最后一个参数是输入节点或独立特征的数量。/ @# `$ m  U/ V1 k

    / |" w" C; [/ {* p6 w! f执行此代码后,我们使用以下方法对其进行总结:
    : z4 _9 o6 t' B  g#taking summary of layers
    # v% |: M* Y4 v& w: xclassifier.summary()# B$ x% ]: a$ J; H
    * L; w  j  h& j& e8 A. q

    * b# E% f6 R: V' _& h: V编译人工神经网络
      g2 x5 T+ J4 h: ?现在我们用优化器编译我们的模型:: t2 g) ]3 A, R7 P: ?- A

    1 k' \( t* E0 V' r+ g#compiling the ANN
    4 u3 F( {$ N# d* }& [0 x* aclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])8 M" c+ b: s" x" |8 s

    + ^% L  o: L: Y; y1 G" d/ |" {6 ?将 ANN 拟合到训练数据中
    0 W4 U$ \+ z, b  `. c  m编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
    ; k6 _, u1 h& ?; `' G* P6 p
    % c; H. d' B( Y: K8 o #fitting the ANN to the training set
    7 w& p0 Y- s8 K$ W# o/ B6 lmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)! P6 ~! H# ~0 \; T! L- {
    8 D: R$ |) R( z$ _! W' t

    ' X6 U/ @2 Y  s2 t* B. Z* t" sit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。0 ]7 {4 \% o8 X- k9 E
    . ?; f' w( e. C! A- D+ `
    在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
    7 L- u9 J. m5 H/ k8 P/ p* r( G3 u. s
    #now testing for Test data; L2 M  ]# p, s1 f
    y_pred = classifier.predict(test)
    , p! s& v* k# c4 B8 w' H9 {0 b4 L  I' ]- o8 @2 w' w4 P
    在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。) Q3 i, a1 ~$ j: v8 {

    7 d% y5 M) [+ Q+ u, v#converting values: ~* _. f9 ]& y0 e! z
    y_pred = (y_pred>0.5)/ s; w. ~( E$ w7 }- g/ ?( N
    print(y_pred)
    8 ^/ _# M7 L9 B- L0 I# }
    , H$ c. U7 K6 U4 t1 G! q1 W
    + Z7 Z7 H! q1 |% C
    % v& b# M% r& E/ O) o分数和混淆矩阵
    . B$ ^8 _( X3 L现在我们检查混淆矩阵和预测值的分数。+ t0 i, r$ A# H" W$ K

    2 l- h) |) R: K& C# K  s$ P% Gfrom sklearn.metrics import confusion_matrix& f5 A% r/ X- [
    from sklearn.metrics import accuracy_score
    ) Q' p: h, n2 m& ?/ |, Fcm = confusion_matrix(ytest,y_pred); h' D% E6 H, i- i
    score = accuracy_score(ytest,y_pred)
    4 k  h$ r. b4 Dprint(cm)& q( G0 A8 y: l3 b! g  w4 P- N8 `
    print('score is:',score)
    4 C* ?2 o  t, K" w. j9 k
    : Q2 b! z3 c  F  C0 r/ W输出:, g* b; b$ _! |! ]' ]- m' |

    + k. b3 R3 ]. p8 v! @0 \2 ~' A7 ~- [; {) \' R' D- D; S
    ; z) Z. _; M$ A, u- ?
    可视化混淆矩阵
    ( H0 ]6 [1 k& @- P+ {- E1 x" P在这里,我们可视化预测值的混淆矩阵8 J" h! f& e( Z/ {) I; h
    ( {! n' Y3 q  n: R4 p9 g/ t. D3 m2 U
    # creating heatmap of comfussion matrix3 _! z& q. i. V6 d
    plt.figure(figsize=[14,7])8 |+ j% j, R0 x8 `
    sb.heatmap(cm,annot=True)
    8 S6 D! E; R3 K2 E; Splt.show()
    ' a2 O4 c8 L! p2 q) C/ a5 ]% Z4 g* r  K, H' t5 r3 N
    * i% s# Y4 f( n0 ?

    # G/ l. W1 x0 @. p可视化数据历史% F9 y4 m$ ~8 I: t- d% T- p. ^7 L
    现在我们可视化每个时期的损失和准确性。1 Q. v# I2 o- G6 E' \

    1 _& {  W7 K$ m: s2 o# list all data in history* i1 @+ d! w% ~; T
    print(model.history.keys())) G! o, |+ y& T& Z$ W: l) Z9 v& s+ q
    # summarize history for accuracy) p" F& [0 A5 c  @# O
    plt.plot(model.history['accuracy'])* \( n& O" R" D: e1 `4 k4 v
    plt.title('model accuracy')' P" E! i1 T/ p+ Y
    plt.ylabel('accuracy')1 ~9 P5 H" \# W+ G/ l4 n
    plt.xlabel('epoch')
    5 C  b- V7 h8 s! L2 M# w8 Xplt.legend(['train', 'test'], loc='upper left')
    ' x. g) j/ I; U0 `7 O. h" oplt.show()9 a( D+ x0 }6 V$ e% ~0 Z% y9 U
    / U  B4 ^6 e! U. @% i

    7 M* x, I  d9 h, V2 F1 n# G1 W9 g  u2 I

    - t$ D% I5 N9 i% |. n3 H4 X# summarize history for loss& w6 Z4 }' O" i$ r
    plt.plot(model.history['loss'])
    ( C1 \# x. ^" a5 L% `. f3 _8 Iplt.title('model loss')
    , k0 b( j: u) tplt.ylabel('loss')
    . ]. Z0 ~$ S& G7 V3 x1 Cplt.xlabel('epoch'); y( v% J3 ~, X$ D& s/ {/ R4 h
    plt.legend(['train', 'test'], loc='upper left')( O9 ?' d$ e; K2 S9 H. d
    plt.show()0 _/ E  E& o& o) r" \  G( O
    1 J$ O2 j" |  \

    / t, v6 M; _! `) f4 ^! B  Q; J
    9 B3 b& ]2 J3 |* n5 v* N' p3 I/ E保存模型

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


    • . R3 j) b8 @% G+ N& \( B, j% G; r
      5 y7 f; h7 K, I# \% I7 T; p4 i# |2 Z
      #saving the model
      + z9 r. A* Z& m) X: b6 A9 s
      & L" `$ l' g* u" u

    • * L1 G8 ]% x( |7 h% N, v+ A

      1 I9 q  r2 r* x' M/ {classifier.save('File_name.h5')
      / Y. o. j& J2 h

      / D6 i$ l6 Q# I9 r! v: \

    • % u! h, k8 T4 \5 T7 Y3 M" |
      : n$ y9 z# L0 k0 W6 R

    2 C1 {, z1 r* {$ e" J2 h5 S9 ]0 A

    ) F1 Z8 E7 F* T. t2 E5 P" t: u& F- o
    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-10-10 03:20 , Processed in 0.531048 second(s), 51 queries .

    回顶部