QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络8 u. i# ~+ M9 R( b. O; r
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。  J' |( k2 n  e& H' B! i
    * c- Q4 x4 L$ Q( j5 {9 L
    大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。* R  H3 V* ?) e) b
    : T( t+ t5 l* i; C- R( Z: L1 l4 T
    它由三层组成,分别是:' ]4 H; n% ^9 C

    1 J; L  z- H! e, Z输入层
    1 C( q0 Y9 b  G2 O( H# S
    " |9 V4 P& e  v. }% C. j% B1 v隐藏层! N( S  l( d* @; I7 i1 X
    + i& U" y: ]9 p( w7 ^* j* B/ q
    输出层4 i3 p9 \% n' n' Y, o- h/ v: D
    1 c+ @) x+ ]0 a' }% Y+ P( ]
    & q. S* E0 |. j
    使用乳腺癌数据集创建ANN2 J0 W: v4 g5 |4 Q
    现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。
    # E  ]  c* P# \* Y5 i) M9 E+ U4 j# a8 J" r- J1 I3 x
    首先,我们采用乳腺癌的数据集,然后继续前进。
    ; t% j6 L& J# t, {6 @6 A5 K: P3 [9 p) t
    乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
    7 [" @' {" C& T5 y* d  c0 y2 k6 t
    0 O# X& z$ ]& B' V/ b下载数据集后,我们将导入所需的重要库。
    1 b$ U4 R$ U8 y1 W. r
    * R- C! e: O7 G' Y. z, N' m导入库* a) D5 k; C0 j! ~4 f  s  ?
    #import pandas' H- A2 j5 y% w) u# _
    import pandas as pd6 S3 j6 R) ~2 X3 ?8 T7 D  J
    #import numpy
    . }5 Q: R. [) r' S3 c7 q  ximport numpy as np
    8 ~. J& ^& v" H, Z# N4 B# Himport matplotlib.pyplot as plt
    " ?; }. W6 Z% Z9 [; w5 f( }import seaborn as sb, q: a6 m* V7 Y7 n% u+ e" X. ?: V, z
    这里我们导入了 pandas、NumPy 和一些可视化库。
    # o8 n) u: G4 S$ a  ^8 v% v: V

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

    3 f% G6 b! }8 W* `: z8 ~& C
    df = pd.read_csv('Breast_cancer.csv')
    8 ~* R5 H7 x# k2 e; X8 ^' [- V- `& @df
    , r1 [/ n4 M1 X" ~- @   N( D/ b; V& y( Y
    ' G6 q* p+ Z. T- f3 a( l  M
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
    3 _( P2 k# f6 K; ]8 p- b. o3 B
    # A- h$ r- E8 W7 N2 ]# counting values of variables in 'diagnosis'0 s1 T( h% {3 ^) M8 e% N# r
    df['diagnosis'].value_counts()
    6 \# ~" p. x$ k , i* D( M9 k4 i, r9 f! M) [2 h
    0 {' r' {; k/ U. t4 v# k& z# R6 [( m. o9 P

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

    可视化值计数: @, t% Q' o# ?# w4 t( b9 `
    plt.figure(figsize=[17,9])* m0 b+ A! F; G' @5 l
    sb.countplot(df['diagnosis'].value_counts())
    ; X: P: v" a, u) T2 ^+ X/ qplt.show()
    4 K5 e. l" J3 x; {' N
    $ I) D/ t: I7 b) P8 H" w& o
    0 y  S" v% ^6 p) V* e8 ^空值

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

    3 @) p/ u0 m* @! f  `/ m8 d' v$ x
    df.isnull().sum()
    - q8 T) Q) c! b5 V" T/ m: B$ @ 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。
    2 ^- L) ~! C- x4 l% p# {! c6 ]7 \( a8 ~" i1 q
    #droping feature
    # |  C; A1 K- H1 A4 N5 tdf.drop(['Unnamed: 32','id'],axis=1,inplace=True): `# m/ L. {" y" c
    1 U; P- R9 w4 {# p/ d3 J/ ?& u! G
    自变量和因变量

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


    ( R  m/ o3 [3 `# independent variables
    7 v& w2 }0 T. t0 ?: tx = df.drop('diagnosis',axis=1); z8 s# d) T1 ?9 p1 a3 K! m3 P
    #dependent variables
    , J0 u% L$ _* w. e9 n/ @* dy = df.diagnosis- \$ A% Y& |, J- s; S7 r
    处理分类值
      K: L6 }' ~( H' c, i) q当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。+ ]  U% x4 @$ ?9 D* C, f3 H  j, N

    : u: M% J, |& K2 Qfrom sklearn.preprocessing import LabelEncoder
    4 T& }$ w3 F4 ^2 Y+ M; [#creating the object0 B, @3 z+ t0 M$ X4 a& L0 V1 q
    lb = LabelEncoder()" w. `- U' v5 |
    y = lb.fit_transform(y)  Y9 X) I) @  z9 R) m
    + x- _! S+ y2 C, b6 Y& }7 ]
    拆分数据
    5 y  T  d' h1 b现在是时候将数据拆分为训练和测试部分了:# f6 E* c( W, e

    * A  G) j. Z% Y' p1 \! Ifrom sklearn.model_selection import train_test_split
    7 S3 F2 C& H0 u: n' ]/ Jxtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    5 F2 |/ H5 h# B' Y) L2 r3 Q( d0 V/ A: ?
    缩放数据# u% L2 c- J2 M1 |6 Y% J6 c
    当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。' i; f; n3 b6 p
    # Q" d( }' o* |  l
    对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
    9 Z; u" S& x! Q! n$ f" y/ D# v( O- J* s" ^- w
    #importing StandardScaler
      H4 ^2 C1 y% a* ifrom sklearn.preprocessing import StandardScaler
    " ]2 W6 i1 n3 u! D# ^#creating object
    ) b: j( Y$ \1 ]2 q( J. P4 _sc = StandardScaler()
    ( R) E8 B! ~% y8 b+ u  ]xtrain = sc.fit_transform(xtrain)  R1 R9 s: z/ j, Q4 C! q
    xtest = sc.transform(xtest)" T% y3 j, |9 m2 _% U0 {+ [
    + D" |# `- v' `, R% Y
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
    3 f5 ], ?- P9 j* c
    ) F( l0 @& Q! }/ w+ X; d! J* B9 m" r; i#importing keras# p, b0 C+ V4 ~( q2 Z
    import keras4 W1 V* ^, Y, X1 g- i, [
    #importing sequential module
    % f  ?- ^& |- J/ ~: |: Ifrom keras.models import Sequential
    9 ~& ^9 ~1 Y( U# import dense module for hidden layers
    ( F: }3 k5 i2 [/ W5 Cfrom keras.layers import Dense* v# r3 h1 X" y$ j. Y* i/ G" ^$ ^
    #importing activation functions/ [  l7 b( v) [4 u* [+ J
    from keras.layers import LeakyReLU,PReLU,ELU
    - A' [  @" J: F5 R( f: r5 Pfrom keras.layers import Dropout3 ?& v* C7 \6 U; [; M& p$ w  y

    ; r% e+ d9 p: N创建层
    2 a- H$ }. R0 }! t8 T. f导入这些库后,我们创建了三种类型的层:, O8 u' J7 z, R0 M

    3 W  R' }! Z: s) r1 q' y& e9 G输入层
    8 g- j% v5 C, |( l8 @' \5 {! [8 u
    隐藏层8 M6 b- M$ I8 ~4 D

    . z, Y6 ]( f1 G) k" C' R6 x4 N- E输出层! |$ N1 `3 X0 a. S! [' \6 ^
    , D; B6 I5 V$ }0 d+ l) ~0 m
    首先,我们创建模型:" H. c3 H) A  h% h8 X. Y: q) V

    3 M# D! _0 T; C% \$ q! x9 G#creating model( H" _, M8 C2 j) P! f
    classifier = Sequential()
    # `% G+ X6 b5 U- D( S7 v$ `# B6 p7 \; U: u/ g8 v1 a
    Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。' c# K8 i; I+ L; j& |

    % \) Z8 Q9 N! {/ ~) i# T* I7 D* O% Z现在我们创建神经网络的层:
    + G! \! [3 f# f5 a# u3 v2 ?
    ! |6 j( H: a# q6 ?8 G' h#first hidden layer
    - x( ?( v/ Q( \3 G  A5 H) yclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))& j3 V" n6 x: W  b8 ?
    #second hidden layer
    ' @; {2 x+ [1 v0 g8 Nclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))! Q/ t3 w" i. n& ^1 z$ ~
    # last layer or output layer" u  i' f1 Z- w( z! i) A; v
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
    6 X* b. e8 |( B& \+ {
    + W2 A9 z6 n0 g2 I+ \! ^/ l2 o8 |在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    ! d4 l0 R9 g! t0 h
    , l( G7 u* @% V1 x第一个参数是输出节点
    0 n& ?. Q1 S  }4 D6 K. d8 m4 t* |6 Z: `6 y9 i! {0 \
    第二个是内核权重矩阵的初始化器# f4 t5 D: ~% z: I
    * I9 x- @/ r$ A: V: o
    第三个是激活函数! ^0 K5 |/ z. H/ b- K9 H  o
    8 A2 ^. t. H# ~$ Z
    最后一个参数是输入节点或独立特征的数量。
    * ?9 u3 ~; T6 I7 u4 N
    ; h2 j7 J( N( J执行此代码后,我们使用以下方法对其进行总结:
    ; R; X% `9 j5 a9 x8 T# K4 J  I#taking summary of layers/ m0 G4 b9 {' g6 c- m" q) X+ b
    classifier.summary()4 g# [* [9 L5 W( s
    : b" @( f5 R* T

    # P( c6 }4 `  j$ S4 A8 D2 o编译人工神经网络
    ' I5 t% F$ I0 q8 z现在我们用优化器编译我们的模型:
    ! T- \2 {. a) p9 {9 ^/ }" R6 C, b) U! U1 S* Y" i
    #compiling the ANN: k9 O9 _8 q  t
    classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])& b- H. i% g' L3 p2 P
    * J& M! `7 E0 b; a" v1 ]8 U
    将 ANN 拟合到训练数据中
    # a, z  J; @* v& X- B" n! \. h1 q7 L编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
    0 S" S( o7 J, b4 L1 W: ~& x$ a7 V2 k3 }
    #fitting the ANN to the training set
    * i/ @# V- u. Z8 D  X$ Y" q+ i: Qmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100), y2 W7 e% O  ]- X. {- F
    1 K2 {0 }/ ?: z; v& ?: F) R+ t

    / U5 H+ _  k, `4 ?it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。& m2 D% ^0 W5 E8 o/ _: h

    ) F+ P9 j3 L( T. o) A/ [* u4 i% d在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
    : l% F4 y: D% F
    9 `5 o! N. ^" B) N) o0 m#now testing for Test data
    8 f& a# d+ x2 r) y) ny_pred = classifier.predict(test)5 W8 W1 W: a  y
    : L5 ]- {4 |  }; g8 O
    在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    " ?% r: Z. J# |1 V5 {6 z
      Z) ^& v  X, V4 ~3 [0 B' c#converting values
    * H# t; c9 z$ x0 z. ^, Fy_pred = (y_pred>0.5)
    ; X& j* u; s2 q. o. G3 n9 aprint(y_pred)
    ' ^  o5 E, y$ k6 m6 B( W
    5 [8 W& j6 M1 c: D( W  U4 }! S. I. S( g& l9 e( g
    ) E* X1 L3 m  v6 C8 @7 E1 a
    分数和混淆矩阵
    6 _' p4 q$ e8 o; e现在我们检查混淆矩阵和预测值的分数。
    1 T# ?; q: @. I
    7 M* n: z2 C; n) A  Ufrom sklearn.metrics import confusion_matrix. t% k; \) N8 d  Z" V* c7 _3 z
    from sklearn.metrics import accuracy_score
      Y# l4 X7 `% s% P  K  vcm = confusion_matrix(ytest,y_pred)( y. [; @# C+ d9 I: Q
    score = accuracy_score(ytest,y_pred)
    / ~3 R8 O" E; b) x' j) d2 Uprint(cm)
    ; {8 b: i; S- x! K- Eprint('score is:',score)+ x5 n) a4 w) p

      v6 \! ], q: d# u7 d7 [2 h输出:
    5 l# I* C# I. @$ s6 z1 n! R: D! N0 L& P* j

    ; m. P3 u8 s2 Z4 O2 U
    * ^# a# J" U& r* q; B可视化混淆矩阵
    " ]9 m6 J5 A1 J/ w- j. f9 \. F在这里,我们可视化预测值的混淆矩阵0 J. t' k: N7 `8 Y: a7 |
    + C! w" {: [# @! J9 C& ?0 _
    # creating heatmap of comfussion matrix
    % }; v' H4 j* w6 l' U0 Q$ \plt.figure(figsize=[14,7])
    2 E- U! j% i8 A% K; p3 Msb.heatmap(cm,annot=True)2 V: R; N. ~, o( W5 M7 r$ t: }
    plt.show()9 [* C5 ^+ P" N' L# E- l$ e8 K) r: b

    # z3 H4 N  C. b- U9 X
    " |) R6 X3 h9 u$ v* P# ]6 H
    1 g+ a/ [  u6 g0 L  j8 s- Z可视化数据历史
    3 l% k) ~8 Q8 f, {+ h2 b现在我们可视化每个时期的损失和准确性。+ m- }8 z. P, G1 Z. x

    # L+ l1 a( R, x& G0 A7 X9 R8 t# list all data in history
    2 [% Q% i( N, n% T, f) J& R' Vprint(model.history.keys())/ s- S, q" Q, R" u# v( ~) o: s$ E
    # summarize history for accuracy5 V8 v- l+ W- F4 t) _. n& C0 x
    plt.plot(model.history['accuracy'])
      a$ Q3 O# v  w, q- v2 pplt.title('model accuracy')6 P, D' T' X; q
    plt.ylabel('accuracy')1 q- Q1 \4 |' W# o7 t" F
    plt.xlabel('epoch')
    6 G- a1 n6 {* W% k' b- F( aplt.legend(['train', 'test'], loc='upper left')
    3 `# V6 a! ~4 O" Zplt.show()4 L" w9 h5 N/ G% m, z4 j9 F
    7 Q; c2 y% i& q! q1 x3 p. [
    1 m9 }  {- n$ P( L+ C# b4 m
    6 R% E+ b4 l' R8 x
    # ]( U) B$ L3 y( v- Z: e
    # summarize history for loss! ^& R/ W0 w6 J. {, ~  i- t
    plt.plot(model.history['loss'])
    $ @8 W- `8 M7 ~3 I; \9 j0 ?plt.title('model loss')- L2 C" P: z6 X2 Q6 O- ?5 O
    plt.ylabel('loss')) A- v) W$ a; m# d8 Q" I- m* l0 m
    plt.xlabel('epoch')
    ! i4 j' ~% X  \) v+ Xplt.legend(['train', 'test'], loc='upper left')
    ( G7 |3 v3 G& h9 kplt.show()
    6 ~6 v2 z& m  Y4 L$ {! u2 }3 x/ Z% {8 o- H

    + b2 M7 Q7 p. a! p& X
    # p, ?; g8 Q7 U  s' K保存模型

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


    • / a/ X+ Y; i3 P! \0 q

      # d3 _2 m3 X" B  h3 A#saving the model7 f# J% \* {6 B1 T
      ! g( X. C) [& j7 w# t  V4 F$ L5 U
    • - B- c4 J* `+ n* b, i& K
      * y$ f* i1 T( Y# h1 n# L
      classifier.save('File_name.h5')
      - t  l4 T% D; W+ L, P
      * l, B* u! a( X- y4 A& Z
    • - s( U7 F: c! }

      . l/ Y( c1 h+ t7 L  k9 X
    ! h6 L& I+ |2 s  ^- S
    9 ^7 ]/ F% O. M2 I$ G
    : C' c$ A( J' E  P# r, M; B
    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 10:23 , Processed in 0.754980 second(s), 51 queries .

    回顶部