QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络% A, z6 n! h! K& E
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
    " M; Y- \7 s0 m1 ~- Z' w, z7 q6 S' w0 ]! [4 n8 m* T
    大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
    ; K% |2 j: p$ C8 X7 T9 g
    " t% A+ r6 l4 R' A它由三层组成,分别是:
    6 u, f5 ?5 Z6 ?) l* \+ u- p  ~6 [6 u( P8 P1 F- q- P2 a, j" n
    输入层" c% o, Z8 U4 H
    0 x9 o. v" z7 @& o/ |' b! I/ M* u
    隐藏层
    - i& w9 Q+ V6 Q6 C  O) G8 a" e4 v& c9 z1 L! s: c
    输出层% _# D' k/ M3 C9 _$ q, {

    4 n) e. v- y) ^0 z6 L1 p
    . j0 E3 h- e& I- i. k" }6 h使用乳腺癌数据集创建ANN6 R( z+ T, d9 s: }  a" d
    现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。) i- l$ t5 L! O+ U1 E- n& K
    ( O0 E: q. _2 L' U4 M- S
    首先,我们采用乳腺癌的数据集,然后继续前进。
    & r" T7 e( a' v0 X8 ?2 c' y% d' ]( {& p
    乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data- E+ b# h3 d+ a* Y8 j( F& t
    3 n$ b7 Z& l# i" R, A0 _' C
    下载数据集后,我们将导入所需的重要库。
    7 b' Y; ?' |) @. ]* O- y$ \2 L0 P) p* \
    导入库
    8 s& h/ @- I* B8 l! C* u- c) A#import pandas
    2 ?2 d4 U+ l) k9 \import pandas as pd
    3 ?+ q& n+ A" J2 `1 u, ~#import numpy0 d, V1 h* B' Q7 x: |8 P( `
    import numpy as np% z  j0 p) e; T0 v3 F
    import matplotlib.pyplot as plt
    4 u" {0 s5 I2 Cimport seaborn as sb, P+ j' H6 X; b9 w. n8 V5 O( q2 s
    这里我们导入了 pandas、NumPy 和一些可视化库。. I! n1 m1 N  D4 c. {8 x

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


    8 e/ B  u, N$ F( c( L5 H$ @df = pd.read_csv('Breast_cancer.csv')* O- |) c9 X9 N0 h- Y- u
    df
    0 G9 w$ ~" j; W0 f. b1 f6 h' b8 ~ % i" U4 H; d! O" j/ l8 M" t
    ) {/ _5 O8 Y- a2 T! D" n: A
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
    ; t* ]# w; _1 L% |% D
    / s: e3 E1 N- g& Y3 @# counting values of variables in 'diagnosis'
    + }2 K8 D8 x6 L9 I/ {; c! w, |df['diagnosis'].value_counts()
    / C$ ~! e2 d8 H, N5 L3 l
    0 f1 d3 h' V4 t$ y3 h, i  V* W1 `8 L# V
    $ q! C* K# {' d+ r! n( V

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

    可视化值计数
    % D. c7 A/ ~6 F9 T* P7 _0 bplt.figure(figsize=[17,9])
    * |" N+ t  T2 H7 G9 Psb.countplot(df['diagnosis'].value_counts())- |$ q# D% l) U1 ^+ x- A/ i2 j$ `
    plt.show()7 e+ O0 k" s. b
    ) n9 Y9 \0 B) C, [& G4 z

    9 g1 D8 ?. A" |1 x; k6 H/ i空值

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

    % B8 d" @7 K6 G" r7 V8 B
    df.isnull().sum()
    9 e/ x3 U& b& G' N# a3 E 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。) j% u8 x- v0 ?
    $ r5 {4 ~. c$ ]# `. ~4 F3 z
    #droping feature7 s3 L! s8 X4 O( s5 C! ?8 n! |
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)( k* E: `* ~2 d- j! d

    9 g: V9 r  Z/ c- V5 B5 r/ Q自变量和因变量

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


    6 `4 V3 r& I  S. Y# independent variables8 @, }' a* a2 _3 R
    x = df.drop('diagnosis',axis=1)5 S  f5 H9 a) {9 ?" ~
    #dependent variables
    * ~+ d/ @3 \# v& Py = df.diagnosis: ~1 t, o$ p& T* ?$ U4 X, |2 P6 M
    处理分类值
    8 r* E3 Q4 z  P8 x. u' _; B当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
    3 {% e' y4 P2 L  {
    / p$ [. F  m9 M" E# ufrom sklearn.preprocessing import LabelEncoder9 Z* Y' U$ P  o
    #creating the object$ u# B: u. B  @! V; V) ], H
    lb = LabelEncoder()
    7 i" r& h$ w0 _# s/ ~& c5 V. \y = lb.fit_transform(y)
    5 ]" m1 p  }' L4 ~: }$ C+ @9 D0 N8 \
    拆分数据
    7 R& T3 C. U+ c, j. V现在是时候将数据拆分为训练和测试部分了:2 D$ \. v$ v$ M# B7 ^$ h

    ) j$ @9 E+ A/ Zfrom sklearn.model_selection import train_test_split9 K7 H' \3 F- B/ Z: h( Z! b  G% E
    xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)6 ?; R1 e' w3 r. E, \; k& l, g9 P

    - o  e' q% S: @  `缩放数据9 B0 B. f7 Y0 K* A% p( x0 O
    当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
    : Z& g- }  u; {1 `! U2 a8 Y! Q8 a# b* }* s4 w. e
    对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
    $ i, p) E2 A) c5 u; _4 P, Y3 I7 e) y" M6 ^- I7 |6 Z! U) e. F
    #importing StandardScaler3 a- m0 h2 w% [9 y4 {
    from sklearn.preprocessing import StandardScaler
    ( F  @6 {! R+ B) I( h#creating object
    , v  l' V* M2 lsc = StandardScaler()% R+ \2 I4 D- k- U  M' K
    xtrain = sc.fit_transform(xtrain)1 ^7 ~1 d; E9 w3 |! x' O& I6 H
    xtest = sc.transform(xtest)5 t6 L5 m& j/ n3 W+ @8 P; d* V

    7 ^  C! |3 g" E  b( j+ Z6 R7 p从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:& c7 I" K# f" ^
    6 v, _6 S  U8 k7 {9 a, F' P# E
    #importing keras
    3 J9 y7 q0 E- gimport keras/ _' h) m5 w4 q8 C/ C0 e+ f  u; w
    #importing sequential module
    1 C! T5 N6 ]+ z3 n  kfrom keras.models import Sequential6 C5 E2 ~4 @. L  ?+ [# B; r+ j
    # import dense module for hidden layers
    5 ]9 l- t- v' \/ Z1 {% y: ]9 jfrom keras.layers import Dense, N, A' O: [7 I. `- R' ?
    #importing activation functions
    : E& i( l0 @: x- e4 B9 Z; c  nfrom keras.layers import LeakyReLU,PReLU,ELU4 [9 o9 H/ r! k; h" k, g6 H
    from keras.layers import Dropout; k- s' ]. Q' x# D4 t5 N& N' E

    . b3 _$ c% |  n' E创建层5 Q+ Q: V) w$ P0 j: f, `6 \0 [
    导入这些库后,我们创建了三种类型的层:* p8 f" G( r! J5 @$ o6 R

    : U) g$ l6 C5 F, D7 J9 e; z; l& Y输入层+ l. l- O' {" U* Z0 f& f( k7 `  ~

    % E$ n6 O+ S( a) ]% N隐藏层+ L+ ^1 |. ~( t1 E
    8 o1 C1 ~$ P  k3 \$ \
    输出层9 `, d7 K& U' p! d8 H7 e( _
    2 z4 s/ `, x5 u5 @( Z
    首先,我们创建模型:( f: m; x+ Q' A" ?1 w/ ?7 k

    ' F  C: j" C" @, ~7 s4 l#creating model
    8 Q# V6 a$ c+ q' a) V3 P' k  ^+ mclassifier = Sequential()
    ; {# r: m; T4 R! ~3 E, @6 O3 e4 o& s: e0 ^4 b. N
    Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。8 I9 B; x/ s( h
    ! F+ L$ h2 @' S) |0 N7 {9 T6 ^
    现在我们创建神经网络的层:
    & K) t1 S0 @7 d. \; T" ~3 ]+ B, C/ u) |' e9 g. p7 T5 M
    #first hidden layer
    ' i3 k8 b5 W; ]# D% j% ?6 N! o( gclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30)), ]9 t. l, c& Y
    #second hidden layer
    . ~% ~0 G' l- `+ o' T7 S0 E# xclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
    9 l4 Y3 z( W: h) M# last layer or output layer" Z, N4 q, |6 s; z. I. |4 D, \
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))5 e' z# N1 d+ n7 ~5 V
    1 c/ M* L4 Q1 }. V' l$ B4 c3 E
    在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。7 t& ]9 X8 x: T7 H! [% l- E

      Y# S! ]/ @* O  F/ U3 o. |- p第一个参数是输出节点
    " ?1 x1 i* p, E
    * m& b. i0 b9 L. J第二个是内核权重矩阵的初始化器9 |: L2 F  \/ {" X: N: H

    - C) z" z, h0 A5 M第三个是激活函数+ o+ K9 ]" ^2 U

    , g8 n2 W, S$ B2 ?9 g6 G最后一个参数是输入节点或独立特征的数量。' U3 |1 n* U& R1 I% x" I
    $ v1 [3 R$ I. g+ f$ l
    执行此代码后,我们使用以下方法对其进行总结:7 d' j! A; }1 W- c
    #taking summary of layers
    6 I' [# U2 i) w+ iclassifier.summary()  S9 U# Q  Z( u0 h/ E  K

    9 a+ r( B# U8 h3 @
    : e! m% Q% ^, g3 I$ n编译人工神经网络
    + s: r7 [# V) o. [7 \0 A现在我们用优化器编译我们的模型:- x* y& k2 L; D

    5 R* v5 A  r6 ~: b. }#compiling the ANN4 J& L' w( m! l
    classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    0 _- c9 C: b/ K6 o+ \/ l7 Y( r* d' \) `* _6 m5 U
    将 ANN 拟合到训练数据中" P) v: P/ S) ]% R2 F2 @3 u5 j
    编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
    " s3 f- k! o! p2 j: H9 e- ?5 P4 S; R. p' q
    #fitting the ANN to the training set
      _- d& J1 I! vmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
    # b" ]* Y3 y% L( g4 T: w6 v 7 B9 }1 I: ?: O' d9 [* z
    % T' E/ n: E. ?" j& ^& I! g% O2 `/ v
    it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    ; k6 ^9 Q6 ?" t5 I% Y2 h- v& z5 Z) K3 O$ C/ t
    在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
    . t# y& V- a, ~  _; @6 @9 M/ F0 r; O- Y+ |
    #now testing for Test data7 e9 J" S7 H* l1 r
    y_pred = classifier.predict(test)
    ; B7 c1 H  j7 y, p, p1 V
    : o* d# s. j8 n" ?在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    : @! H$ w' g, b2 T7 h" ~9 F3 m6 u2 d, q: A- K+ m3 U5 d
    #converting values
    6 n- P1 t) |3 my_pred = (y_pred>0.5)6 e+ Q9 ~% ]/ t2 [1 s2 m
    print(y_pred)2 |8 I. H2 n. o8 N; l
    # y+ X# _' J  c" K
    8 |' W$ l# I0 C4 ?. @: m

    1 b3 |  e- Z8 U0 O- \( [分数和混淆矩阵) Z( W' t7 _- Q% O' M5 P8 z
    现在我们检查混淆矩阵和预测值的分数。
    9 k/ Y) D1 K+ z: b) F. g* V
    ' H% T+ D! C7 o! B! y3 @0 Lfrom sklearn.metrics import confusion_matrix# M( U3 i4 ?- C' R+ u
    from sklearn.metrics import accuracy_score
    5 F/ z) _, V- t- z! C6 Jcm = confusion_matrix(ytest,y_pred)
    / r! B1 a7 U) [, Z; Yscore = accuracy_score(ytest,y_pred)$ v0 z2 j  A; ~4 _7 W- H
    print(cm)
    % l7 P/ Q( _) d. [) {  g  Kprint('score is:',score)5 q& K: _, x  U$ W; |+ i% C

    + N$ A0 D6 G3 J2 L4 Y& [( ^输出:: d- [$ f& A% R6 l: B: W3 a+ w
    7 G' h/ `* u% |" J7 m+ E; q

    + U+ n3 R+ r3 ?; v. n5 D1 f; _6 M
    $ O$ u% \$ ]6 V% J: `可视化混淆矩阵0 {) a8 K# d4 _, S% d
    在这里,我们可视化预测值的混淆矩阵
    1 K! i1 r" N0 ~- r0 g, K' u; i2 L+ b4 z
    # creating heatmap of comfussion matrix
    ) A  M2 ~# s2 z; D5 tplt.figure(figsize=[14,7])  ^; a. _" @! N9 X: U+ @
    sb.heatmap(cm,annot=True)
    ! Z! m. w3 Y0 X& H+ gplt.show()
    * v7 [& N$ f5 E1 a! n, b, L3 j7 L0 K2 |  B$ h
    2 k, B. i/ g* F: T" M$ F0 v
    6 q0 N# l2 T5 q% g1 l6 F
    可视化数据历史
    * g! `5 Y1 A% v/ s: R9 P% D5 K+ N; J现在我们可视化每个时期的损失和准确性。
    / v8 z8 ~1 a1 e+ k3 q/ X- u
    + ^" M, t) E. Q# list all data in history
    ) f4 ?; D( b, H9 h8 Cprint(model.history.keys())
    / {, T0 L, h4 l8 N# summarize history for accuracy4 y/ L7 R! H0 O; r, _4 d
    plt.plot(model.history['accuracy'])- s( d) V5 r; L# F3 M2 Q
    plt.title('model accuracy')
    8 c3 c# m$ z3 [% X4 `plt.ylabel('accuracy')
    ! D4 t" o; D' \; oplt.xlabel('epoch')
    8 A2 H/ S7 I* }, ?; W' Wplt.legend(['train', 'test'], loc='upper left'): y1 |* ]( Z5 ]: Z
    plt.show()
    ( R3 }7 G' F9 Y* |! B
    8 W' E' U4 ?& d7 [% {! }2 e8 I+ l9 z! h# F
    3 S& N4 d( I/ z$ \% U! U& y- X
    ( S( {3 q/ o$ i( Q, `
    # summarize history for loss
    " J# p! Y. X1 J1 `1 Bplt.plot(model.history['loss'])% w" q* B! T8 ^
    plt.title('model loss')
    3 l7 J& p1 Q4 U4 Uplt.ylabel('loss')! p* `/ i; o2 ]* F
    plt.xlabel('epoch')
    % m3 r" T7 B/ Yplt.legend(['train', 'test'], loc='upper left')# _+ l0 A7 R+ a# `
    plt.show()
    5 w/ v$ a3 I8 r2 H9 G
    : @+ \/ V5 u( k4 K5 i( i7 Z$ U
    3 o% E) x3 R; |& b
    * g4 c6 M: ^; U: \1 O1 g6 b保存模型

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


    • 2 e7 t) z# O% [& h+ T& T
      : ~; V/ R, Y' Y! Q
      #saving the model; y6 i! B/ G4 b9 N& K5 z

      6 @: i% d+ {, X- Q

    • ' g' R( ^/ b8 B: }  q3 `3 [
      5 i0 {: U* ~6 l! Z! ]" }) U: H: D
      classifier.save('File_name.h5')
      / p+ Q6 ^: c  |& O: y  X7 O6 x9 [+ x
      6 d( N: s2 T( c" }
    • , l8 L3 `5 v$ R
      # t7 v( Y/ t9 F/ F$ P% O
    " z" A2 L9 r/ l& W

    8 Y1 n; j3 a% k3 k, C! g2 X" m( Y3 S, V4 |& ?/ T& e/ H' d
    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-4-25 03:23 , Processed in 3.679488 second(s), 51 queries .

    回顶部