QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络
    9 b% i7 e$ z; o5 M# `. a% ]& H顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。. S# J0 i2 Q/ `) J1 t
    - K+ s" _7 m. E9 A4 \* Q9 O! `
    大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
      p1 ]* q; \' ~4 ~8 S8 h! Y( U, d5 t
    它由三层组成,分别是:: y. x0 ]& h, V" k' E1 T. [6 d

    ! t9 X7 J$ `6 ~, L, m输入层
    9 J; N8 r# E- n
    5 y& O; t/ Y- q* e* z隐藏层
    8 {6 _$ e  @% J4 F: c/ l1 T, H7 z: ~& ]
    输出层
    " y5 E1 U3 Q3 J6 F
      L# I, m" P9 R& H% D+ l- `- O5 p( L. z( f" @
    使用乳腺癌数据集创建ANN8 d: k. e8 m# E0 p
    现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。5 U+ l* E. ~% C  V$ v; b( ~6 `0 ?

      T9 L8 t" g1 O/ z$ ]" U7 Q  W首先,我们采用乳腺癌的数据集,然后继续前进。
    9 w& l" J+ N# f! m- v# z! U" B' Z8 R. z( M
    乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
    : W9 ~- E  I/ P6 e; L9 G. D- x1 Z0 K! o: q/ Z0 q- J
    下载数据集后,我们将导入所需的重要库。
    9 |% X& i) T9 E$ _
    5 @- d( Z; Y2 C' O& P3 U5 I( d+ \导入库3 k2 A5 _& x+ [
    #import pandas6 G( @$ n- W' g8 n- ?
    import pandas as pd, E& S4 O1 J/ }" |5 @5 s
    #import numpy1 _& n% Y) k. r9 N
    import numpy as np
    : B  S3 n0 ~) j7 `. @# Gimport matplotlib.pyplot as plt
    ! o1 h4 h5 M. C' b9 u: T, s, E( Rimport seaborn as sb; ~5 _, a7 U6 l) _
    这里我们导入了 pandas、NumPy 和一些可视化库。
    ( w& ^) k: q- u

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


    ; @, G( q  }# M/ c  Z2 v# h+ ]df = pd.read_csv('Breast_cancer.csv')
    & K$ e, `) ^3 y/ X/ U4 P2 kdf
    ( W5 I1 f+ O" A8 o( r$ Z$ s
    $ u) s" p$ J0 y" ?. W+ ~$ V6 I& h8 v0 l6 ~) A; j% s
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
    . z4 ^  K: G% e* X2 L4 p" N. X* p
    ) b/ k* S- }: ]3 F; g# counting values of variables in 'diagnosis'2 P7 R3 A7 p4 N$ \/ N2 M! A( j
    df['diagnosis'].value_counts()- e" K6 n! G$ N2 g

    . Z7 f9 B2 E; B) i+ b8 T0 H) \( r# {! z6 |, \. `* Q

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

    可视化值计数3 H$ c" @, r% y' i7 g
    plt.figure(figsize=[17,9])9 j' A5 _6 h) M1 ^4 F- K; w% V$ N6 t  Q
    sb.countplot(df['diagnosis'].value_counts())" v+ I" t8 U( M0 z& Q9 f4 L$ V7 |. U
    plt.show()
    + G& v4 q$ p# F) Y . U4 e7 M- `! b, f+ q
    4 Z) ~  \' U) y' E* Q' I4 W
    空值

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

    # n9 b' ~9 B; Y+ Z4 ?6 u4 b
    df.isnull().sum()
    ! W; j  E+ `7 v& ~2 N% v! l 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。- R* d% y) e, Z1 D3 ?9 N8 w$ x

    0 Y3 `$ S0 a3 G# `& w! I7 {#droping feature# t6 x1 L: g5 v7 A$ Q
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)
      ~% f& e( G+ i) [- x
    : o( C2 E$ B- e: o& G5 \自变量和因变量

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

    4 T# k' E! D( I1 g! h
    # independent variables
    " l; R$ l8 w. T" m3 kx = df.drop('diagnosis',axis=1)0 l, s' r3 g3 T) ^; p& e8 ]
    #dependent variables
    - M# U6 N% K7 Ty = df.diagnosis
    2 h; P. i( L& N; j$ \ 处理分类值9 r% X' Y3 w+ d8 b2 d9 E1 s4 [) q
    当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
    ( {7 g2 c1 W" r' P5 l) e6 {
    1 L2 S7 b# c% f3 O. Nfrom sklearn.preprocessing import LabelEncoder9 d+ V- Q8 j; y0 H/ f3 D9 S6 X
    #creating the object
    & g2 U) \+ C) f3 Llb = LabelEncoder()$ g/ _$ }0 d. V  L, v- x
    y = lb.fit_transform(y)
    - ~$ u+ q7 }+ {9 I
    - v( W/ B4 m5 G+ R+ ~& m+ b拆分数据( w5 G4 G. A+ ~; E5 v6 d' r: @
    现在是时候将数据拆分为训练和测试部分了:) u! [) O! ?) q5 \

    - a# @& |. V! }* F  `: D5 pfrom sklearn.model_selection import train_test_split9 U. |1 {$ j" ]0 ^) `' E# X' L; V
    xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    3 _. I/ K0 u3 w7 _( B7 R, Y+ _& U& G4 Y9 l$ d7 Z) J
    缩放数据
    0 a4 z3 |  R# c: W& {$ [) G. k4 R3 P当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
    1 j! y# ^0 j- b! B( l; m
    3 }  J6 ^7 R& [$ v' ~* O" u对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
    " S4 Q" N7 a4 L9 n1 O, ]; J8 f8 E0 B1 H- x1 J
    #importing StandardScaler, S. x3 b7 n. H9 K( Y) i
    from sklearn.preprocessing import StandardScaler
    / Z# A' C& {' B$ b: i$ |#creating object6 N) X! H/ |8 E0 I: D. S: Z; E7 M1 k& ?
    sc = StandardScaler()
    , L! Y! v  M1 Uxtrain = sc.fit_transform(xtrain)! r' N" G- p, {# X, m
    xtest = sc.transform(xtest)9 @9 }0 U1 c4 ]$ E& F* x& b. u: g1 w

    5 G" d- H  O5 A. d4 H从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:& U+ X8 v6 Q2 s* g& w% ]
    ! S6 g& h' X$ N6 X1 T# z. Z
    #importing keras5 X- ~+ o9 D) Y9 x( [
    import keras
    - [9 H& R' J# D1 x  s; d4 E#importing sequential module
    / {! A3 f+ K6 E" efrom keras.models import Sequential& K, M7 v5 y4 o! Q9 t/ }4 @3 l
    # import dense module for hidden layers7 l! a( M; D, x0 F
    from keras.layers import Dense/ ^7 D6 n5 e) p- u2 ~5 @
    #importing activation functions
    $ E* ]$ ]2 F8 I2 Qfrom keras.layers import LeakyReLU,PReLU,ELU
    $ N, X! c1 l/ ~9 m$ dfrom keras.layers import Dropout, Q+ w* D9 k% J

    2 F* \3 t; a# D# A! \8 M, [- g创建层5 f/ w2 }% C: L* ~. i
    导入这些库后,我们创建了三种类型的层:% @/ t% a7 Z) U1 Y
    8 c3 H' O/ S: _
    输入层
    2 v9 P7 X4 z- ]3 X; ?
    9 C4 j! t9 O. b& ~9 R! O$ t" M隐藏层
    5 S1 t- i8 F* [9 A: v8 V/ Y, j- D0 m2 k2 S, Z" p8 ], q
    输出层
    % s( b* U$ \  I5 h0 Y( t
    * J$ ]% f$ i* [% N首先,我们创建模型:) c( x; A) X" j3 A# t
    . z: E5 L8 g: _
    #creating model- l7 Y  |( D7 V4 I4 j3 e( w4 m
    classifier = Sequential()
    4 {' Q- K5 M& D' E( u
    8 {2 S! F4 y* f# i* D; ^  E; |Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
    4 e8 i' {. e& S
    3 g+ ]: o1 V+ \& ?) M8 W% ?, X现在我们创建神经网络的层:/ H3 y, U7 D0 R* k7 j

    2 }" s  A2 P- h+ @; M3 w#first hidden layer; Q1 m6 D, o! X( m; w# I
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))+ j; q- b+ D9 ^! z( \- [5 o
    #second hidden layer
    " I9 s0 e- |4 Jclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
    ) q& H8 s. B) _/ u7 I, q2 [7 [# P# last layer or output layer3 T& C# P3 d- U( m
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
    0 @" r! a% C+ n8 _: O( E5 a. A. `8 a# W
    在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    6 k: t5 C( R0 x/ y3 o9 d: C! _! \! u3 r  V8 P
    第一个参数是输出节点
    $ y  B- j* l! p4 R+ p# D# ?
    / \' k4 d" |7 Z  _; M; @- H第二个是内核权重矩阵的初始化器
    / m4 R$ z- A/ ^" I  p! m
    / t/ _( X1 v7 ~( j0 d! `第三个是激活函数
    6 Z" X: n) ~" k6 h
    0 z$ j. \' t0 T: O! w  V最后一个参数是输入节点或独立特征的数量。; Z# u8 W, H# c% b. Y) u) v
    4 U& l: S$ S* B! W9 ~& Z" |8 f2 w
    执行此代码后,我们使用以下方法对其进行总结:. e% W0 C! @* H
    #taking summary of layers
    ; }% b* }3 A% a& R" `4 q2 P# bclassifier.summary()
    : p2 I+ k5 r: e 3 t" T/ E3 E) K, A% G; f
    & F, b, W6 P0 t
    编译人工神经网络/ V6 D7 E" K: Q- g: ?& q! b+ B
    现在我们用优化器编译我们的模型:
    ' f6 M- c' ?6 I5 K  k+ k3 w; ?9 [, }1 v* Z% n: i5 P: b
    #compiling the ANN
    # i$ H4 C  }" W( m  mclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])4 U1 X# @# T' C3 [$ Q
    1 f  v( U; `8 z; P' j/ R
    将 ANN 拟合到训练数据中$ z5 q2 ^0 d5 n' s, [- ^/ f
    编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:1 ?2 D) y  {2 c& M$ [
    ) F5 h- K! T3 q" _+ ]
    #fitting the ANN to the training set
    $ d* a& `& t  ~+ h% Cmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
    # r) q2 ^& Z% ~# Q; I3 j, ^2 t " {" t9 |& E8 v7 v* I

    4 W+ w) i! W+ F. h% _' hit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。" G  |3 |3 d2 l/ h8 U! a; r- ]
    & v4 E7 O% w8 v& p
    在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
    ) ]0 j, v: C/ h5 A' A% b
    9 y5 Q& }' w) b3 d8 C7 S4 W#now testing for Test data+ \$ }! E1 u+ J( w, K
    y_pred = classifier.predict(test)
    , S) n' A  s- r) w* k3 Q* _
    ) _: |0 E" @" V  Q0 `在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    4 l4 {; ]$ E+ i( J/ E& C0 Q9 z2 Q/ \( D9 E# C6 o
    #converting values4 K8 m* i0 L, E+ l7 l% F  F) k+ f
    y_pred = (y_pred>0.5)$ S$ ^' V9 n% Q* w' p9 U
    print(y_pred)0 O' ^2 k( u/ H) f( o0 ]
    3 Q# M8 S) r6 \3 [$ z

    ; N4 ~9 K8 f( }1 i) c
    : ^3 Y6 ^' S3 {' G1 A分数和混淆矩阵  K& y9 e7 H; w6 r- e6 }
    现在我们检查混淆矩阵和预测值的分数。
    2 m# \4 T7 ]% r1 X( Y. W
    : x+ x& [9 ~) @1 T) w0 |1 G6 e% d0 Xfrom sklearn.metrics import confusion_matrix
    & v2 [( Q$ s! ]: S( _( n$ s- L7 Y: Kfrom sklearn.metrics import accuracy_score, M* u8 Q7 r4 \' f
    cm = confusion_matrix(ytest,y_pred)
    2 \) ^. l2 ^5 B4 a7 R( L* wscore = accuracy_score(ytest,y_pred)
    3 ^9 ~/ V  A' hprint(cm)
    / A" f0 \; a1 o2 C2 [; W" W' a3 ^, i8 m8 Pprint('score is:',score)/ Z7 q" S/ c* K  p6 Q. l" H0 H

    1 M5 N! W+ T- V- {. f+ w8 C输出:+ C! ~% B9 o; l# X- _
    ! q. x7 g) P4 ]/ d: x
    0 r0 |( s7 e1 ?4 ^. b! ]

    4 O7 a  L3 a8 F3 |可视化混淆矩阵
    % o; p  D. I) x1 W  O  w$ V在这里,我们可视化预测值的混淆矩阵- A/ L; |- T/ b& p
    - a& |  _" b$ b( H0 B4 o
    # creating heatmap of comfussion matrix6 ]- b1 [' `5 K& f0 l) b
    plt.figure(figsize=[14,7])
    $ [: A8 s' b% t( t7 z/ ]6 }sb.heatmap(cm,annot=True)
    9 Y: a/ m7 d2 n/ x! {plt.show()
    & Q  D/ A) s- X1 ]
    & Z9 p5 Y# Z( b' b7 U, u* Q
    . W4 _  A2 d& ~$ D, P
    + p: r$ t4 ^7 P; f2 o# r  ?, n可视化数据历史; W1 ?0 [9 v- T3 U0 ~1 j2 ]( H# b
    现在我们可视化每个时期的损失和准确性。1 p% F: R% L  A6 T* e1 |

    : L! R" d; `1 ]0 Q. r; C' b# list all data in history' a  W2 O7 V% T7 B' }" d
    print(model.history.keys())
    0 G$ Y  j* p9 ?. g2 k. y# summarize history for accuracy, J4 |0 o+ @, t$ V  l# ^' D6 F1 O
    plt.plot(model.history['accuracy'])
    2 m1 j0 N. W9 R# P6 H# Lplt.title('model accuracy')3 P# j3 Y$ U& X  B7 o
    plt.ylabel('accuracy')
    0 e) i/ f* ~7 mplt.xlabel('epoch')
    - r! M' ^1 S& k7 G+ V. w* v+ Splt.legend(['train', 'test'], loc='upper left')4 [$ C5 \" I  @: I- M' j
    plt.show()& E5 a% L& Y# w8 C7 B
    ' l6 F; M" J& D
    ; ]0 O  i6 p2 Q' C) c% a' V9 l$ p4 ]
    8 M9 D) ~8 P8 x) o1 d- m0 x2 Q
    0 U! }* c, V% F: o& O; ~9 h- J; l
    # summarize history for loss
    , x- e1 S3 ]/ x" J; o7 Q, iplt.plot(model.history['loss'])/ T) J, p" U, P5 b
    plt.title('model loss'). d4 p2 m, o' e' W
    plt.ylabel('loss')! J  \4 O0 R, k; E
    plt.xlabel('epoch')5 x0 q5 y2 @4 G2 j: q3 ^
    plt.legend(['train', 'test'], loc='upper left')
    : e5 G4 ?: ?7 S4 z# Splt.show()
    8 e( Y- _* q  _' G% G9 {- ~
    * p% B  C" E% _) d. `' p/ G8 q2 t9 @$ t$ D) [
    ! C4 d, q$ }0 {2 h+ R
    保存模型

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

    • , L, `( d) G# }
      - p( p4 \4 [% v  E. E
      #saving the model
      " v; I9 a& T  U+ G0 \9 S+ V2 q
      + P% ~, M: d: s' k6 q9 v
    • * c8 ?/ }2 v1 X/ u

      - C$ ^$ k0 v- H! w4 q- s1 Vclassifier.save('File_name.h5')
      9 u* W# P( A( C' O1 V: {0 |3 C

      . R+ O, f& T% b- T! m: z  x1 \
    • 3 g0 a9 w; r# R- T5 R- U+ V

      : k. J0 P) {) R5 o, o9 q3 `+ g

    , ~, ^: u9 o0 f% x1 X+ W+ p- a8 u
    * l5 X. A! S5 y3 q  W; Z5 _/ s
    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-5-25 18:00 , Processed in 0.408788 second(s), 51 queries .

    回顶部