QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络
    " L8 M: K  _, f' b顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。' L* K( e. ], Q" d8 p9 I

    : \0 l# b. j# z; _' {/ F; V% r大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
    ) y, a9 z+ b( L6 J( v7 ~& C0 z$ i) F  E7 ]$ B* d2 c9 h4 R/ M- o0 T
    它由三层组成,分别是:: z" l% g9 H! e
    $ [2 d  j" A4 }* v+ i% L% |2 \
    输入层
    % N# t2 S2 U( E' l7 K. Q0 M1 w/ o/ c) a# u( b
    隐藏层$ ]$ _2 Q! V% c5 m

      G% q6 S2 r2 r3 Q输出层
    % d5 h( V, J. \. g" W4 V. S8 k. [4 B# Z' Y0 o6 z
    7 i+ C- d5 z0 B2 r- H% W+ f
    使用乳腺癌数据集创建ANN
    : b+ ]1 D4 ]2 H! A9 Y/ D. L- O现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。
    6 ?1 v% ]$ Y5 T( b8 B/ i! }" o$ P- X$ P7 ^0 Z
    首先,我们采用乳腺癌的数据集,然后继续前进。8 l! G+ e: V4 A
    ! `* _+ ~9 a6 t+ i# E( b% Z. H
    乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data5 F: d! z2 }" }( i4 X5 v
    ' x4 @, _6 D, Y, A" K
    下载数据集后,我们将导入所需的重要库。
    6 ^, ?* \& s# D; k3 H7 X2 K5 J* M  k' |" A( L* j& Y* l
    导入库
    2 \- s# ?+ F* w5 p* N3 W' R- y. L) x#import pandas
    8 \4 p$ L1 m6 K0 P; N: \# bimport pandas as pd3 |+ ?4 V) U% @) w6 v: Y
    #import numpy
    / Z) V0 }1 L. P3 s# L" ?import numpy as np  U- p$ L2 I. [; g0 X3 B
    import matplotlib.pyplot as plt
    * v: i1 u; s" q: qimport seaborn as sb" {( N# ?" ^% R3 j" e
    这里我们导入了 pandas、NumPy 和一些可视化库。2 b) n$ J; M2 F# C

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


    9 L2 L0 o/ |9 {$ V# K, [( A! c" B6 zdf = pd.read_csv('Breast_cancer.csv')
    9 s- F5 ~+ q- a5 n7 Rdf% b! ?/ z; o4 D, D/ l

    ! C- H) o5 A1 z$ {: M# J; m5 _7 B, q9 e" w- X1 W& g
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:) Z- r0 D) X: Z9 ]
    ) v8 s2 D8 _1 f
    # counting values of variables in 'diagnosis'
    ' @, C5 g/ z$ `- @' n* |2 O) ]+ l# ndf['diagnosis'].value_counts()
    2 n; x9 x: X$ w" v
    & U5 `" |: q6 h9 z& Z+ K
    : g( W5 L5 G1 @0 n$ Z/ ^

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

    可视化值计数
    $ R1 V4 u- [) [9 I9 bplt.figure(figsize=[17,9])4 l: y& d: `4 n( P( j3 N" {; r
    sb.countplot(df['diagnosis'].value_counts())+ B6 S! @7 I: u! S. I
    plt.show()
    " K/ I$ c2 S# T% J$ W 0 ~0 }, F0 }8 j  M! O7 M

    $ l$ p. f0 M) K空值

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

    ; b. g4 d1 P! K5 ?) b0 C$ K
    df.isnull().sum()2 }/ R& O5 u. }& f
    执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。
    ; k9 z9 @! j6 I7 L+ G9 Z7 k$ D# z5 Z
    #droping feature2 ]+ @8 o" o6 b. Y4 P6 ^# t
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)$ H  j4 t1 G5 @
    - C) X7 O- {( I' Z+ F! j
    自变量和因变量

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


    7 p) n% q" ?9 X! S/ a, N# independent variables
    & f  A) @+ X) X5 s3 h  ]x = df.drop('diagnosis',axis=1)
    4 r3 m/ L2 D- u0 Q+ `% \+ S/ R#dependent variables! v' m5 r) L* ]9 N- s
    y = df.diagnosis, ~2 g, e  f& P: N1 v
    处理分类值
    0 x# \8 {8 l1 C: r' q1 t当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
    $ t. C1 K+ b* h( _' A
    9 u4 R* k1 v% [: E# Pfrom sklearn.preprocessing import LabelEncoder
    9 P0 H" c1 b6 J& u  K" N#creating the object
    7 V1 Y' ~1 m7 _6 q9 W/ Rlb = LabelEncoder()
    9 A" x# g* n/ O0 S, l8 my = lb.fit_transform(y)
    . F0 h' i3 D: I0 V, A4 j! {1 {
    - d( U$ y' o/ ^  ^' T: t拆分数据) L# T) w) O8 y, ?* |; t2 u
    现在是时候将数据拆分为训练和测试部分了:
    1 P- b  ?6 P6 s$ K) g# z# A$ G: L! G; I0 d& j6 A1 V* p6 c, [
    from sklearn.model_selection import train_test_split
    1 Q9 f  g. Q/ \5 gxtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)! B1 l3 ?$ o% m$ L4 X: ?  j) H
    % ^& w' k& {# F1 p5 A) V3 d
    缩放数据
    / Q) |3 H# I7 K6 O  W8 Y# }! {当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。% h9 y2 w/ X- j; i5 s  X3 u0 a) r

    4 R! y3 l% G5 O: ?. X8 z对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
    4 V/ T" I3 Z4 b2 z  C+ C
    4 A. m9 N2 T1 Q. _. t, d#importing StandardScaler
    6 t9 ~- p' t- G+ Nfrom sklearn.preprocessing import StandardScaler
    8 ~9 w( z9 K7 h4 g" R- [/ ^- p0 ]#creating object
    * _* f5 N2 q2 `" }6 ]sc = StandardScaler()
    % e/ [; B& g, w4 M; Hxtrain = sc.fit_transform(xtrain)& p! E. J% }2 T8 u
    xtest = sc.transform(xtest)- G4 u8 @  h) k- J8 b# E% f  e8 K
    # u( A2 o* @. s3 I0 k+ l
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
      z: P) G( R( U6 u
    ' M8 p+ I5 X4 d! D; M#importing keras" u- {8 M( @( W6 d
    import keras  [# A3 I+ _1 x3 k3 _( L
    #importing sequential module
    - ^7 U4 r  w8 V; K1 Cfrom keras.models import Sequential
    # J: B% V) m: F8 u$ g2 W; A+ q2 O# import dense module for hidden layers
    6 o, }+ [' Q' g; `5 t+ K  Qfrom keras.layers import Dense* Y- J1 _9 b4 v& t3 I: Z1 M7 ^
    #importing activation functions6 i1 d8 A% d" f8 x5 u) B
    from keras.layers import LeakyReLU,PReLU,ELU
    + l$ n) ~& q: S1 c2 J5 b) L: h& gfrom keras.layers import Dropout  j! J) v# k/ r1 h) J, X; l
    3 j* z+ [" z4 R, |4 v
    创建层0 A+ _# U% j* L( _5 ?+ _; _  T
    导入这些库后,我们创建了三种类型的层:
    4 Q8 \1 @# ^( w7 q% ]) G! Q4 m" X8 f/ |* W) ?0 N
    输入层
    * w0 Y' h; u# s5 w" F
    ) n. _6 B; Y, c# k! ?隐藏层
    ( B/ m8 D3 o* D: A3 r# v1 L
    4 m+ ?, O. C: |5 ~' U0 m8 P输出层
    ) L. r8 n1 Y& L1 i" f' l- o; z- V
    / j" P: ~4 v) i1 F( C首先,我们创建模型:
    ' v; e9 c) y& ?& U4 [3 v1 |( I! \- o6 ^. q4 w4 n3 s( f* T
    #creating model- Y/ k, A9 [) ]5 z6 i
    classifier = Sequential(). y( z& ~7 i4 |% b  D
    ! a( W7 x5 J# H1 N& U0 o" u
    Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
    5 j4 E3 W  r& u" T. o1 B6 z& }! o! P
    现在我们创建神经网络的层:
    0 j5 i: T6 C+ }; x+ n: P, Q1 D% I8 J$ `+ [
    #first hidden layer; R* j* r8 e" h$ M/ c$ c
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))
    ( C. i0 }; W! Z: M8 V#second hidden layer
    / V7 b2 d4 Z- i' W8 E+ aclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu')), d: B/ v( I- ?8 w7 }
    # last layer or output layer* ~+ X" a7 ]3 a( V2 f3 L2 a
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
    . o9 f9 c( c5 }( C; L
    - S" O; D2 C0 R# w. S在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。$ c' M& p9 z# q: Y. B

    4 n; J8 B/ S9 O9 W第一个参数是输出节点
    + `$ |% G- C5 p& e9 }; s
    / V! y' `/ h; L: `' K2 K第二个是内核权重矩阵的初始化器2 ]& t7 w3 I! j
    1 P# p) U: `; K% z
    第三个是激活函数
      w+ T8 c6 s2 @7 i( E6 K# h
    * I2 J7 s& B* P- }" q5 P5 o9 l, `# P最后一个参数是输入节点或独立特征的数量。: o% |+ m! R) t* Q% s7 ]& I
    & G, x( R5 u5 R
    执行此代码后,我们使用以下方法对其进行总结:
    $ `" }, M1 F# w$ X# ]7 Z#taking summary of layers
    2 x9 d, o+ C7 _9 Vclassifier.summary()
    ; R" y. S- `0 [: @& d# R2 T4 ` 3 P) L" K$ s- b2 M/ T$ n' u1 J9 Z

    6 d  @  x4 n" i" h; [编译人工神经网络4 T+ b6 _( P* r& ?9 p: D5 P% k
    现在我们用优化器编译我们的模型:) {0 {3 W, y5 H, \% s9 o, m* k& g
    % n$ w7 m: J2 l: q1 x
    #compiling the ANN! z/ Y- |9 U0 W  m! X
    classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])  e' C. j! ]' A. |

      L+ ~2 u, @4 Z将 ANN 拟合到训练数据中
    9 Y% F, V+ y/ A3 L! b编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:% q$ Z; T: r0 Y8 E
    , a: n3 ~- l7 h0 |7 \; {6 [; s
    #fitting the ANN to the training set1 F* M* r: m- _) }( E2 `4 j
    model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
    9 {% Y' {3 e! y. G, R% x+ S+ f
    3 p  e+ N' {- X4 Q. q$ H2 g) i0 u# I! q. C3 F
    it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    4 k8 f9 Y6 b' W1 ^* H+ W. k  v) g+ j: c; P4 l
    在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
      W8 v( t* P$ E$ G5 J. W* ]1 l, _/ w  a2 D2 b! U( g
    #now testing for Test data2 Q6 K- d# @0 y5 l! f+ `, M; R
    y_pred = classifier.predict(test)( n7 c" O3 b; S6 ^9 [6 f$ h4 W
    % o7 j6 C3 y7 \, e" J, J
    在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    # L( p: {# U, `5 Q
    8 U* \' B5 k0 [7 f, h$ K#converting values. \: c+ N3 @8 K+ R& E5 ^
    y_pred = (y_pred>0.5)
    3 E. ~8 d6 u0 d0 t- e. g9 aprint(y_pred)
      U* P8 g. H8 _4 N8 ?5 K$ Q' }$ @) e; F0 J- c0 R
    9 z! L! }1 A4 W' r3 h8 E/ z
    : h* i5 C# a/ \5 S* C7 S$ o' G
    分数和混淆矩阵
    4 E+ H, O5 m6 I& c# y' F现在我们检查混淆矩阵和预测值的分数。7 |- {0 {3 I1 C
    ) c& I0 V- A5 ~! Y' s# k- \
    from sklearn.metrics import confusion_matrix
    9 ~3 a" U& ~* [7 T+ H' J5 Cfrom sklearn.metrics import accuracy_score
    / j" [( J2 c; k7 u% A' w. Rcm = confusion_matrix(ytest,y_pred)% ~, Z& s0 ]& V; E- \' u, X4 R7 V
    score = accuracy_score(ytest,y_pred)- h$ s- }( Q/ p; l2 i
    print(cm). G' v/ a8 o5 H
    print('score is:',score)& X! D4 A3 d. s% w6 n- W3 x  q
    ; ^, ?# i# K% Z1 j
    输出:/ ~. @- T7 l5 K  V$ Q% ^
    ; X  Y( A) H! a2 U6 J

    / ~6 L8 \6 F; d* n- n+ g/ M9 `5 F
    ( a$ F, A8 A! X可视化混淆矩阵
    4 [% ?4 }6 \) _+ `在这里,我们可视化预测值的混淆矩阵
    " p/ o& w) p% E1 F  A- _1 M  j, @! H- T% v$ ?
    # creating heatmap of comfussion matrix: s; }5 H- y/ ?. A
    plt.figure(figsize=[14,7])% _( f* i8 b0 y) s2 }2 [+ X# C2 g
    sb.heatmap(cm,annot=True)5 G7 e# O& U# \+ k. g* [
    plt.show()+ ?4 X( ?! J3 O5 j) R1 O
    ; P0 }7 }0 Y) ~
    0 X1 a7 ~" W4 [. d

    ' O, u  f, S( F, s9 O, m5 c. @  Y可视化数据历史
    - m; s, I5 L' g现在我们可视化每个时期的损失和准确性。
    1 \* V7 W7 B& k3 A6 e' ~2 l( ~! f8 p6 N! P
    # list all data in history
    " a9 \$ V0 x7 vprint(model.history.keys()). p( [9 k# T. E  {$ n0 e
    # summarize history for accuracy
    . J9 l; Y- ]0 wplt.plot(model.history['accuracy'])
    2 j" {7 y/ P. R# E! W; C( wplt.title('model accuracy')
    3 T* }& ~! V: ?$ |5 y% v8 lplt.ylabel('accuracy')
      {% t" V+ ?/ Nplt.xlabel('epoch')  E7 F; \3 V, o
    plt.legend(['train', 'test'], loc='upper left')1 G" I7 a% ]+ O, n# D7 s
    plt.show()
      m; C+ _+ M+ i3 v" V2 L0 P1 G$ O* z& H

    0 x; T5 v/ g3 x
    8 n4 ]- \# T5 d+ S
    # ~% G4 s8 t& u( I& \/ i9 n# summarize history for loss0 c  D9 N3 J9 T, y5 S
    plt.plot(model.history['loss'])
    1 d; f  p# N6 a- cplt.title('model loss')0 m7 ]7 [; s9 T  `8 X: v, R' U
    plt.ylabel('loss')% ~" K2 a3 N; J3 b* o% r* ~7 d  N' v4 F2 I
    plt.xlabel('epoch')
    5 K, \8 {% }& ~  r# Eplt.legend(['train', 'test'], loc='upper left')
    & F: e6 N/ R( y, Qplt.show()/ l+ [/ K5 U: x5 k# ^2 m
    0 `; ^0 Z/ ]& U5 I8 ~! e9 K
    # F; q! t- r  g5 d
    - I: M) N! c& u; A0 |5 l' o
    保存模型

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


    • 0 c5 i) m  G; ^! U7 A' L

      : K1 ?+ M! v7 i7 w$ a" }#saving the model6 m! @% Y' D' @

      ' n" G- K7 W' \& G" N2 }
    • $ n! v# t. J6 i0 c/ b, M$ z( d3 G9 ^

      8 c# t  T6 {3 c9 ~classifier.save('File_name.h5')
      5 L7 ~5 P2 R8 \
      # R/ w, u9 Y' N6 D) [( Z& m" X3 ?
    • 0 N$ V1 M/ C* [, R
      5 b# [' W/ x" W( k
    7 w' A. Z5 z0 _; P9 M& C

      Q" @" v& |0 c/ p: Z7 E; ^
    * k7 u8 S7 \; j* b/ F* R/ h& c
    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-6-11 15:18 , Processed in 0.569140 second(s), 50 queries .

    回顶部