QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络% Z3 L8 H0 r. F
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。2 B  F5 P0 b5 C
    3 Q% b4 J3 {: l6 C7 b/ a
    大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
    4 W! y3 c6 q% o4 d" q! S* ?3 ]0 b! W* N1 }
    它由三层组成,分别是:
    ; D! m- z/ `7 `, X, h: ^; @) s8 I% C% N
    输入层0 I, N4 x+ a/ Q( @% g

    * C2 W% \$ G0 y' l4 T& q隐藏层
    ) i& m* T9 C3 G* A6 q- T0 z) p) K) [% s$ Y
    输出层. @4 B- l; C) `+ S# {

    ! t6 Z" U4 S7 q7 u% A* J6 t9 r# N/ l/ D
    使用乳腺癌数据集创建ANN
    / g0 H  Z: \5 L$ Q9 Q+ M" l, X现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。3 z; ?6 s/ `7 D& n; D0 U
    ' i) l" ]' A4 u; m" e7 [
    首先,我们采用乳腺癌的数据集,然后继续前进。3 p7 r. p0 i, L4 d$ l! D
    : [8 }% u- C8 p, [' v
    乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
    * Y3 X+ ^+ \7 y
    0 g' O4 a& X! y6 s下载数据集后,我们将导入所需的重要库。
    : X7 M( ^; j, t; H" o) ]; K; ]. f6 A$ g
    导入库
    , `' t/ L+ W5 M3 T# l2 q% d#import pandas/ d9 w# l/ x# N2 V! O
    import pandas as pd
      S0 r% S/ r# h5 J#import numpy( w& p. Y. H( z
    import numpy as np4 [% q. Z3 G3 B1 W( ^' i: {
    import matplotlib.pyplot as plt
      g- }% ]9 ~) N- E1 oimport seaborn as sb" S+ x% Q3 T) J! I& d" n
    这里我们导入了 pandas、NumPy 和一些可视化库。, O) d  a% t  E- B' k

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

    3 P8 c: H7 ]' I# k
    df = pd.read_csv('Breast_cancer.csv')$ i$ `1 Z9 C5 x3 b" d! q
    df' ]3 q  j; J" C
    , f, [" w0 |2 t8 P7 P0 j$ C

    " W. K- k/ A% A( n2 X; w) [在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:! s* o. {6 k8 U
    + i* r2 ?/ b# j. L) q( F
    # counting values of variables in 'diagnosis'
    6 S( g& @9 {2 N! Z6 c* k2 M4 ~df['diagnosis'].value_counts()& P' f" w; X/ g+ l* }2 J- r8 l! H  a$ C; `
    3 ~4 e5 j8 A, L. W

    % O$ `2 U% n0 s) @% x1 k

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

    可视化值计数# f* o, }% i  m# t
    plt.figure(figsize=[17,9])) [: f1 b* ~+ }  m$ n7 I8 O
    sb.countplot(df['diagnosis'].value_counts())+ v4 G# M  W: _% b8 U# S1 N
    plt.show()
    / p4 j5 ~0 k5 J1 Q( g  O 9 \+ y) |3 e& _$ c9 o% k: F; Z% _

    7 w  n5 E+ |7 I- y. ^+ m4 v' }' I空值

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

    3 {  X. K# u6 \" E5 n5 h
    df.isnull().sum()
    & o8 F4 c9 r: z: r: p4 ]1 U$ L3 T; | 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。" I, H$ [% |! G' w  a3 p, ?

    : G8 D4 r0 C0 p2 w4 m* Y) w, U* q#droping feature# d8 p/ N' C) A& F5 Q3 Q
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)8 V$ ]! j/ ?( Y/ {# ?9 I
    ! h, `( R; i2 K9 N# n
    自变量和因变量

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

    4 g: M" l1 c5 M- b
    # independent variables; ~  I" Y  q7 `
    x = df.drop('diagnosis',axis=1). H0 s0 W8 V7 V- q, N5 {& O
    #dependent variables
    6 x  C5 N. W: N  l, k. N0 S& [y = df.diagnosis7 {+ A4 L, {/ d$ Z0 _5 E
    处理分类值
    # H  c. y  b! J, w1 l" W; N当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
    6 u# h6 V0 j. g& Q1 d& I
    $ \, _% ^, h1 G, e+ R5 Y6 Ifrom sklearn.preprocessing import LabelEncoder9 l' D3 h: ]) j0 I5 i3 |5 O
    #creating the object
    9 V( C" k8 M6 M9 A/ H' clb = LabelEncoder()- i5 N2 j3 j- M
    y = lb.fit_transform(y)
    ; Y/ d- Y" B) \2 K1 ~6 p2 W  G0 a$ T8 O
    拆分数据
    - p& W8 h3 Y+ q* z% D现在是时候将数据拆分为训练和测试部分了:3 K# _1 _' z- L
    " M- O" q. \/ Z1 h9 C4 E; t
    from sklearn.model_selection import train_test_split! f/ v: B! Z: g3 c
    xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    : ?) F0 W" z7 _1 c" L! o9 c8 _" P6 |4 w* p* t3 x" C3 P& f1 G# h
    缩放数据
    7 o+ h4 x4 p- g* ~" \' ^当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。* |7 X. |* d5 l! s& e" C. i' H  Y

    3 I3 V) v6 l; s& o对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
    1 w! ?  `8 [$ i% H' K
    , _1 ?1 \$ X% x7 O+ e# s#importing StandardScaler
    + y. Y& b+ e* J* j+ Nfrom sklearn.preprocessing import StandardScaler, i' ?# q+ X2 M' C7 N
    #creating object6 |. O# i3 K8 m
    sc = StandardScaler(). ?9 z) e9 I* h6 a
    xtrain = sc.fit_transform(xtrain)2 h0 }+ D) z' n8 T) P8 }% T
    xtest = sc.transform(xtest)! k4 N! L: I4 _8 |7 t' K" A

    . S3 }/ [% M" T8 W) _4 i0 J从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:* X- A+ [/ ^9 Z) n( _1 O2 \1 `
    ! ?: ~  S/ ^$ i- N, M4 V
    #importing keras
    ! m( S. }& }# K& d4 ?! |8 V( B. R2 Timport keras  J$ S+ |6 I2 D$ z1 R
    #importing sequential module; o. u/ O% ^& E* u
    from keras.models import Sequential" v% F7 p( e  i: c# w
    # import dense module for hidden layers
    6 V6 _( R9 T& S/ T) W$ w8 Qfrom keras.layers import Dense
    4 E9 {5 G1 E6 `4 P$ {5 l4 ~; P#importing activation functions! R' o) Y! B% P+ s% r# U8 ]
    from keras.layers import LeakyReLU,PReLU,ELU3 `" A5 B& J- |* g3 Q- ?
    from keras.layers import Dropout' N4 d: ~5 f4 w" f6 F

    3 n& c2 L) H$ `创建层0 M, s, c/ L. h1 ~
    导入这些库后,我们创建了三种类型的层:
    2 k) O; z/ ?$ X- x9 u7 B3 ~7 q/ n
    5 U& r2 M; T' c- `& s; b* d; h输入层% @4 w! x5 s0 @( @3 i

    ) _2 v- F* R4 ~' x1 s, S, g3 @隐藏层
    ) v5 p% w8 L5 U( x
    + Z. i; [; s0 `' {输出层
    * u) [( a3 ?8 k# U/ u/ Z% h3 w3 g& a! M( V. W/ y. W* e
    首先,我们创建模型:
    5 j. u2 h" Q  l3 N: B% W
    * ^- `2 [# ?7 q1 s/ W0 M, [#creating model; }9 T) w% ^+ D; Z6 x% |
    classifier = Sequential()
    ( X5 r8 d( f3 V! h* w3 f& H
    9 G* c! c$ t1 Y; l9 ySequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
    : }! O4 ?' i1 N2 C4 R4 f3 o# j8 c5 C2 `) Z/ Y& L& o3 U; @
    现在我们创建神经网络的层:  m7 T9 T0 i: o; l* }! e

    ; t) K' n6 a+ c$ h& b: r* N#first hidden layer
      s6 B. w4 [3 ]2 z; Rclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30)); U+ R1 P' m/ S% r/ j
    #second hidden layer
    ) T  Y- I  H, {) o, j! Kclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
    : T. l9 B, @3 f3 D# U# last layer or output layer" x# n7 j' e5 e* q4 N( ~
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))* ~" h/ {4 p# o" m5 j' j: p

    % v  u$ g4 C  Z+ c! L5 l在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    * O' s/ F- {/ Q( H2 j/ N* Q
    ) M2 p) K+ Z) d8 u5 P4 L第一个参数是输出节点4 f( W+ l4 i5 f9 {" F0 t8 y

    8 H( t4 |  t% n: D" I7 m第二个是内核权重矩阵的初始化器
    6 ]+ o, b) A# \" s' [" j2 Z! n- _( c) d
    第三个是激活函数
    + R# m# b7 p( S2 w( F: W
      c' L6 H; i$ h9 O6 `& T) p* C最后一个参数是输入节点或独立特征的数量。' s; l* v6 m; S, ?0 S% g* T
    / h, R% c" K5 M7 c- I  [5 x' R
    执行此代码后,我们使用以下方法对其进行总结:2 M8 c" N1 Z( _
    #taking summary of layers
    / ~: U/ C8 L- v& Eclassifier.summary()8 y$ n4 D4 c+ ?8 p- L
    ; v2 Y- y4 L2 S- d$ S9 [" {0 W

    , n- J7 d) H5 Z+ E3 r. D, _编译人工神经网络
    - T0 E' }7 A) O6 j现在我们用优化器编译我们的模型:' G) ^. K: d0 T  r

    * A* V# u) t4 O7 A#compiling the ANN
    3 W6 m% [5 Z( ]! J( q* M- P- n; pclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])' y% P0 H4 ?  H$ {9 o# J* q
    ! l" I' @# o  I, e4 u' `
    将 ANN 拟合到训练数据中
    5 a2 L% i* {# L* r! z$ L0 m& X- u编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
    3 A( |( [2 N" n) ?+ i! N; F" [- E0 c
    #fitting the ANN to the training set' g9 q. ^  O  q. b
    model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
    8 V# s% H5 Q# \0 q9 b . m( y! i6 ?8 F2 D8 r

    ' @+ \. ^* r0 V: Q2 nit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    : s) R6 K7 d3 z- B  w. L6 m3 I# c/ A2 w" p
    在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
    & v: O7 Z3 W% W* X0 S: B
    ! W/ _3 D6 E* Y0 a; b3 h% p, U. B) i#now testing for Test data
    5 V; \+ F# A1 y5 d  n: d! ky_pred = classifier.predict(test)
    9 n. y5 Z+ O: Z2 x  z/ J6 ?( }( f. X- p. }
    在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。3 I# n7 F( H6 p9 a

    2 O; L+ @# B4 [3 Y8 Q- m# ^#converting values
    & H, i# v8 l! i2 ?y_pred = (y_pred>0.5)( ?" Q# A9 p6 Y9 x
    print(y_pred)! `( q* ?8 Q/ ^' ]* A, D0 q( A
    0 p- T/ @8 \* I' N$ n/ i  F, |' A
    & m+ O) z3 [* J+ ^

    ) Z* s/ e. I. E! c0 D& p- x分数和混淆矩阵
    5 v7 j; D3 r6 f现在我们检查混淆矩阵和预测值的分数。* E' O; x& \0 i% Z- [8 n
    * X% `4 c* X8 [" ?2 Y8 r
    from sklearn.metrics import confusion_matrix
    ( o9 Q. I1 }$ g! d( ffrom sklearn.metrics import accuracy_score" T) [& @$ ~; N, h
    cm = confusion_matrix(ytest,y_pred)/ P; G0 h( J3 R, v+ E
    score = accuracy_score(ytest,y_pred)
    ' L3 b; @7 L7 Bprint(cm)
    * P5 v. ^+ c) W* W8 ^print('score is:',score)
    4 S- V2 B3 y& i/ ^! K* K, O
    8 z) q- N, B0 _0 j" e% F' \输出:
    : A) _: l' W! `7 f1 Y  R4 J2 {! |! ?1 W$ _. l1 J1 W

    3 |2 H3 v1 y; V" z" e* R
    . h: E, J9 f( w+ G/ q. ]6 l可视化混淆矩阵
    0 i8 b3 \  }0 \7 h8 w: z在这里,我们可视化预测值的混淆矩阵
    7 O% J0 o: M! q6 G, t) Y" D- w/ y6 c6 ~' n
    + k: j9 w- x. u+ v7 U( z' r# creating heatmap of comfussion matrix' @" m' M' ~8 t
    plt.figure(figsize=[14,7])0 V4 e8 o2 A& ^' w3 ]( r$ {
    sb.heatmap(cm,annot=True)
    4 T6 B& F3 p+ _. d; ]' c" X: [7 Cplt.show()
    ; T1 @8 w/ B* x) ]$ ]+ p: E! S7 h/ W& E: [0 R* U6 j3 {6 L

    $ G1 S. }! I/ ]9 g: f  I& m
    9 t+ L# @! Y' c# [, |可视化数据历史
    ( ~( A% U( w3 s$ s! `  \现在我们可视化每个时期的损失和准确性。
    ' m# W; A9 K! w, {
    % Z- S- L5 D) o/ o6 R# _2 L, E$ _# list all data in history
    2 k6 W1 U+ g! c% f4 cprint(model.history.keys())6 a$ Y+ c/ y; |6 h
    # summarize history for accuracy2 {" j! M2 A+ Z5 v
    plt.plot(model.history['accuracy']), ^  H8 L/ N" j3 U$ h6 U
    plt.title('model accuracy')
    ! K7 F% [* l* V7 R# z8 T9 ^: cplt.ylabel('accuracy')3 }6 D; x) R. _" A4 z: M
    plt.xlabel('epoch'). K3 @4 ~8 ^2 a. ^  G% b& V
    plt.legend(['train', 'test'], loc='upper left')
    " O! P7 ?, ?$ e% d- C6 M9 iplt.show()- y2 e, L( L: I
      Y( \) g1 m" R- H
    , o2 R7 G. X/ V$ r( i  _

    & ]) l6 T2 s' L
    ( s' w- k0 A4 ^1 d2 v# summarize history for loss
    4 L& q# r6 N; q0 _7 Jplt.plot(model.history['loss'])
      v! w, ^8 c9 Y9 V! dplt.title('model loss'); Z& L) A% v9 `
    plt.ylabel('loss')
    9 ]; V. v; C: yplt.xlabel('epoch')3 K$ p. h2 K3 ~  {
    plt.legend(['train', 'test'], loc='upper left')
    & C4 r) w) t7 g+ M# b+ a3 k  U9 Splt.show()
    % f' j2 v6 Y' H" I# G
    . x  k% w' A2 P$ y- u' S( g6 k
    $ |! E# H. k, U0 \+ z; ?
    7 m8 @- U' t7 h, ]$ a7 L" x$ a保存模型

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


    • & b$ Z/ r7 h$ C5 E
      . c3 m5 Q5 S8 p( `- i& n0 X' F
      #saving the model' U% A0 ?$ u& O1 l: U8 B  v

      & J. `4 |) J( x$ s

    • 7 x( w6 k# i2 l, s
      9 M! |" o: y2 `" P. t! b/ [# r
      classifier.save('File_name.h5')8 n- K, `% L5 t& b& y
      $ d$ @4 i* \4 L) y

    • 8 t! I1 }  r5 e4 O4 P8 D, v6 w8 d5 m9 h' O
    4 ^7 M4 N8 Y9 f3 S" K

    , d1 r3 B6 h5 ~1 X
    , P# ^) T3 \; R0 G! S, I2 \
    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-24 22:37 , Processed in 0.497826 second(s), 51 queries .

    回顶部