QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络
    0 Q* n" y5 @+ r& P8 y# _5 Q顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
    * W) H2 |! [1 X1 g- b7 ?( L
    + b4 @# ~  \9 ^大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
    0 H1 h! u8 D1 i8 }( [8 ~" R
    ; q+ Q2 A9 G2 d# V$ T* P; |它由三层组成,分别是:" V* \" p+ J/ `  |7 r' V" X

    - X  {; ]7 a- C4 A1 p: ~' g输入层
    : o: e9 {& _- Z3 H% ]/ f
    ) \4 K: w3 h' q0 I7 G隐藏层& P% b& g& Z' `

    4 [) l/ D2 J% y: S: E: z6 L) c输出层
    9 J9 v! O. W* k0 W  [+ E0 V  [( F0 h' @

    - l* I0 Q1 ^3 _使用乳腺癌数据集创建ANN3 ^- J' R+ W' h% L$ p+ e- V- R
    现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。
    . ^% r1 \6 R% o. D; R# y; J4 ]0 Q9 i
    首先,我们采用乳腺癌的数据集,然后继续前进。" t* @1 d$ R# _6 P% q+ x5 u& r
    " d( M! i' j; u+ E- Z( l% T- N# A
    乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data( y6 U1 f7 c# N0 i5 U

    3 ]) X- P5 ]; }1 R3 R下载数据集后,我们将导入所需的重要库。
    & Q" Z: {! N6 W: D# I) h' W) K2 K0 Y
    导入库
    / A8 f2 O+ f6 v# L6 T0 r+ x4 U#import pandas
    . W, l* P* ?6 h% a1 V( A* fimport pandas as pd
    9 x- z5 {3 j, U+ ]( H5 i#import numpy
    5 G& X8 }! g" E: o0 Pimport numpy as np+ G2 V6 u3 ]8 i6 `
    import matplotlib.pyplot as plt
    0 G6 X8 v. C' K( F& [; z7 qimport seaborn as sb
    * K( N5 B. E7 I4 j1 w7 f/ ? 这里我们导入了 pandas、NumPy 和一些可视化库。
    ) r2 q# H8 {6 N# C& r

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


    5 r2 K: j7 C* W$ V0 Bdf = pd.read_csv('Breast_cancer.csv')
    2 ]6 k: A+ Y6 q7 |, idf
    ; }, E6 p" J1 u3 l  @
    6 ^- I) X4 j6 f; f% W7 g! D- z2 ]( h2 g( x6 V) E# ~
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
      c) G7 |2 C1 u8 _% U1 B& v
    / d' Z* u/ u+ l5 J/ P: f6 I0 p# counting values of variables in 'diagnosis'
    / o5 f# T$ H9 Z) b) pdf['diagnosis'].value_counts()2 i. f0 D. g2 D
    ; I9 `- F4 z2 [5 @4 p$ W

    ) R. w+ X) d8 k4 x1 W! G8 y

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

    可视化值计数, j5 M% d4 I. e; A; A$ Q3 s2 W/ V( }/ {
    plt.figure(figsize=[17,9])
    0 L; M& F) M$ p5 O3 u6 O7 Gsb.countplot(df['diagnosis'].value_counts()). `7 o3 P% A1 Q! I
    plt.show()
    ) v4 O6 B! W1 e
    / w9 k; P& Y* Y* x3 I
    , D( M6 k; d: Z/ H4 U空值

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

    ( d6 a! {' }5 h% E& O  N
    df.isnull().sum(). \8 R& S. W9 B5 O( n7 R) S
    执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。  ^- z8 t" Q( L) q, }

    7 T- Z  K- c$ L$ H8 \- {#droping feature' j0 U( n* W( ?
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)9 A2 m3 |: u; w8 i% @
    & D; K+ `, p% I% b8 K; a. O
    自变量和因变量

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


    $ n- l8 Y. g; \( I  |# independent variables
    # ]: J; w/ Y4 S& v( V  D/ hx = df.drop('diagnosis',axis=1)# W) A) P& q" Y' I$ z+ Q8 ~
    #dependent variables
    2 M$ J2 S  a5 yy = df.diagnosis
    : m2 h, s- q+ c! t; k0 H6 W& \! ^ 处理分类值6 i3 A- j& j, R. U  ?
    当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。- a8 Y$ v# W: s" Y3 V- K

    4 s8 G* G2 I) t; Dfrom sklearn.preprocessing import LabelEncoder# }5 _# n, i9 X9 a& @% z( h
    #creating the object
    7 I* Y  P  Y3 u8 Q! L6 ^2 r1 c/ U+ u; D( jlb = LabelEncoder()0 b  |/ k6 V9 a( d
    y = lb.fit_transform(y)
    # i2 U  _% Y  k* K2 k* z( w% f  G( J% t& J3 K
    拆分数据
    3 B3 x. I3 q6 o- G# H' d现在是时候将数据拆分为训练和测试部分了:2 h, k" I% _) Z' c* n# Q  f
    0 q, y4 K0 I, Z2 }9 @' w
    from sklearn.model_selection import train_test_split
    ! N3 |  ~2 Y2 o, ^% r. ~xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    8 f7 q  c9 `# |% V) x( S' `5 `2 X' j. M3 k9 v6 U
    缩放数据
    . a/ g- o( V1 Q* w) T9 z8 j/ M9 v! B8 C当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
    ( d6 u% t6 f4 l8 |
    7 Z5 h" N' ]$ h0 m" h% ]. i3 P5 p对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
    : d  `/ U2 L! j4 D
    . o9 W* A0 S9 i4 E6 W#importing StandardScaler
    % q7 `+ Z; L4 s) o8 Rfrom sklearn.preprocessing import StandardScaler: N6 E# X* E4 P3 D  |! e
    #creating object0 z* I- _+ `" _& _3 b
    sc = StandardScaler()  f3 a3 f1 ]1 e
    xtrain = sc.fit_transform(xtrain)
    ! N/ W8 d) d& F% n1 T9 n# l# ]xtest = sc.transform(xtest)
    + N* G$ w9 u5 P/ m6 m6 b$ d7 w" [! t( p; S: \& ]
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
      P) ^1 f3 W/ w
    ' `% s$ B3 i1 q! G#importing keras
    7 `+ w8 }4 k7 H3 i2 ^+ Iimport keras
    % g7 m1 o+ o& j  o% A#importing sequential module
    ( Y# O8 w. _8 t9 K; |  G& Mfrom keras.models import Sequential7 m5 A9 _6 [( E) u! m- \7 T
    # import dense module for hidden layers
    . L: }3 C: `  |  M. Ifrom keras.layers import Dense
    , t4 ]0 H" I/ Z7 p* t#importing activation functions# M. }: B0 U/ d9 Z. B6 g/ z
    from keras.layers import LeakyReLU,PReLU,ELU
    ( H/ |7 I4 E- Gfrom keras.layers import Dropout
    3 m$ T5 d* {4 l" z' t( O( i4 N5 s' t1 z8 U1 N8 e+ o2 g3 Y- p% `
    创建层  I# n1 v2 E4 J% C/ ]
    导入这些库后,我们创建了三种类型的层:
    3 ~( I; r3 d5 ]+ f4 q! u# ?- p$ f! R0 i$ P
    输入层
    ! D  F( h. s: {% ^6 Z: F
    / R! P) R2 b& V4 G% B! v: E3 G隐藏层, S' a, j! u/ u% ]% ~3 f+ s
    4 v: ^# V- f2 E% K
    输出层
    1 F! Z* O. }) N5 R7 A0 I( ]$ u, X9 e1 {9 [/ f9 Q7 G. Y  I
    首先,我们创建模型:; g: D# m" }, F$ d' H; A3 G

    1 K0 X, J1 g7 i6 R$ ?2 j8 m#creating model
    - x+ |2 O) ], O9 e1 M( X8 \1 zclassifier = Sequential()
    ' H4 @- r$ R% D( a) V: x8 }, g  J; l( {* }- E" q
    Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
    / h( U+ I3 ^/ c: L: j% K
    1 o  @' `) [$ V现在我们创建神经网络的层:
    . x/ d8 D/ ^1 x3 x: N0 J* @8 g; o
    0 L7 M$ ?" s- _( [#first hidden layer0 A- i/ D4 f: h5 e
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))! W& w1 ^, g' ?5 s
    #second hidden layer& x4 Y" h  ?: z
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
    * I* b. i1 C" p" e4 P# last layer or output layer
    6 |$ w. j6 v6 }0 _, C, F; j3 \classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))) ^9 I, O6 J: B' K2 U9 q6 w/ `4 U

    ! f/ ^3 ^0 M* U4 Q& V6 B在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    9 @& y; @2 `0 S/ t1 S9 F9 {7 A2 b6 y9 U) Q+ X
    第一个参数是输出节点& I1 N) I, m- Z2 ?
    . k- V+ m, v4 d. y' W
    第二个是内核权重矩阵的初始化器6 ?; Y' L( ?( ?+ l. J" N, ?( j
    3 }$ c& ^8 L) i8 n; [, L
    第三个是激活函数
    - p& z" P7 ~  M/ t8 ?4 C4 s) e  N/ z' r3 y2 O# j& A
    最后一个参数是输入节点或独立特征的数量。4 Y6 U) b" M8 {9 H. g+ {) O  G6 ^
    3 o$ ~( l* X4 i
    执行此代码后,我们使用以下方法对其进行总结:+ G  l, k; K% D
    #taking summary of layers# @. k, k$ Y9 C2 l& a4 i
    classifier.summary()
    % C% [7 c. m# y; R & o  e  C6 c  N* g4 p
    2 S) S+ l4 ]( D' v* m- d
    编译人工神经网络" t& X3 _) A/ L# e6 t' G2 j" l
    现在我们用优化器编译我们的模型:
    # ?8 t$ e' V# \, I7 Y8 g& \6 N: l4 b! Z8 [" R4 \: D
    #compiling the ANN, l8 U( k' U; O& G4 ~% U
    classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy']). x% d1 E) C! j" p, p# _0 C
    : \0 \7 m3 C; {/ ]& J$ F/ a( M. @1 [
    将 ANN 拟合到训练数据中
    + i- ^- ?! X' t) H- M编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:6 R8 ^2 |& }8 C

    5 p% _  h! Q/ L) M #fitting the ANN to the training set
    8 U5 r# W& j  Nmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)- {- s0 d0 U, T& o4 E

    5 F4 Y4 X) W! a3 z
    ' _! }9 z/ c, O# i$ xit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。- V9 N6 O. I  ^2 l$ @

    + x" y' W0 E. k! n在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
    ! `$ d) I" ~. b  V  a  j3 j) S. a$ ?
    $ K  F7 o( q* R. Y" z+ {, h#now testing for Test data6 Z9 ^" h  ]5 F! q
    y_pred = classifier.predict(test), v; t5 g, g4 E. x/ y
    : H5 K6 Y# t1 P9 X/ b7 v- B
    在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    ( q) H: f+ Y4 X% s- j# [7 k5 T: F
    : j7 X, q( s7 U, e4 \- d8 c. x- T#converting values
    ) p$ |/ i: h3 F% _$ ]$ j( Ry_pred = (y_pred>0.5)& N( D3 M+ ~5 Q" n. J" W" g" |
    print(y_pred)+ f# A4 e# |# B
    3 `, G# c4 n. _; u. R9 r2 L6 J

      l: i" k- \3 \; E
    " X; e" U( m5 p6 R2 S" V8 c% Y分数和混淆矩阵
    6 Y! W$ z& m" j3 ]' o. S现在我们检查混淆矩阵和预测值的分数。! `9 ]. C8 W( f3 T$ A' B+ p
    ! |" }' W- U( G- u( I" R$ x. n
    from sklearn.metrics import confusion_matrix6 H$ u, |9 q' O  ^/ @
    from sklearn.metrics import accuracy_score
    3 ~' H& }: w: F6 R% ]) e( U& @cm = confusion_matrix(ytest,y_pred)
    ( n' S, |2 p  Q3 B9 y2 u0 G# A" Bscore = accuracy_score(ytest,y_pred)$ o6 b' S! t2 ]/ I8 X
    print(cm)& H% i3 C, ^$ ~. n) [
    print('score is:',score)
    % [& P$ b4 w  x( Q; r: G3 @
    " a/ h( P* S' w% ^& A! J1 y输出:
    6 @4 _0 F' k& u' C9 F" j" U% E. g; U: c5 z4 T% ]
    + ?8 _' M! u; z& |/ X

    ) Q0 ]/ F$ F1 Z& q# o5 d可视化混淆矩阵' A) B5 l% ~1 J7 u% y: ?( z
    在这里,我们可视化预测值的混淆矩阵
    0 z% B, P7 L- P; w& y  u6 o
    ( L; E1 i3 N1 s( H: u) s' R  ?# creating heatmap of comfussion matrix
    0 Q* n1 w* x/ I4 X8 Tplt.figure(figsize=[14,7])! ~3 P! |6 G0 j2 m
    sb.heatmap(cm,annot=True)2 u# e! D. f- k6 ]
    plt.show()
    3 I0 E7 T$ g4 ^: ^; Y. O% t9 u8 y& t1 t  a
    / ?( Z$ T7 u' v; u6 E
    * \2 X  m+ a& N% C1 S% R, h) M9 c
    可视化数据历史
    1 O" i- K  n" E1 y& I现在我们可视化每个时期的损失和准确性。0 E; U+ r7 }# ~

    . n( L6 y$ B% X3 b! O4 w! G# list all data in history
    4 Y# Y9 U( R' sprint(model.history.keys())
    & |4 x- a6 S& s5 ]" B# summarize history for accuracy
    ' a2 J3 L) Y3 dplt.plot(model.history['accuracy'])
    * L! \3 C. B, S+ A" Qplt.title('model accuracy'). \4 g/ `5 d9 x. `1 t6 n5 o
    plt.ylabel('accuracy')( ^% z7 E. Y4 M7 U% G; K
    plt.xlabel('epoch')/ ]! `4 ]" E3 x0 A
    plt.legend(['train', 'test'], loc='upper left')! X9 u! z8 b7 v% q  S
    plt.show()
    4 a& Y4 J' x; k; Z) m0 J, x& F; b; y$ y4 |! ]1 d: {- X1 F

    / l5 r8 \3 j7 `0 M) w
    4 R8 z6 k& @- ]* I3 b
      X7 ]; c) E6 Y  H. O) n0 @: @# summarize history for loss, q) L9 t! r5 w6 F8 [
    plt.plot(model.history['loss'])& ^, ]6 X" j- Q( {/ m: i9 L/ w, J( H! r: k
    plt.title('model loss')
    : \; P4 I1 A3 fplt.ylabel('loss')% g3 l) F' i" J% c- n& l5 k
    plt.xlabel('epoch')# h, _2 u& w7 B) x& D1 v
    plt.legend(['train', 'test'], loc='upper left'), C- W& Y2 J0 {8 n! v4 n: f$ e
    plt.show()# J- H- S( F/ K5 ~1 X& l! N1 d
    , R& i/ f  Y3 u9 h
    6 R* T3 z& u( c6 _

    / K$ J' a3 f4 Y9 Q1 L, ^* T保存模型

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


    • ) t2 o6 Z5 J; ^$ X
      / t  G3 I8 C% [" W5 o. @0 x6 U
      #saving the model
      2 R0 ^1 |' H8 \" Y+ C5 H8 s

      ( ]3 t  q, C; @: T! q' ^# N% U

    • & |3 Z1 @- s# b  f( ~7 N( w# ^
      & i1 z& G# R5 ?0 H
      classifier.save('File_name.h5')
      7 H! F% U# r' y4 i& b
      , m( N$ J% m, o* i1 z
    • 0 Z4 ]2 ]* ~! R9 `  i$ k6 j- n

      # c: n0 h# O. }% b) c
    . E0 A: Q$ x% q3 z8 i' |. \7 \
    " E/ |. X  `* C! r2 W6 m

    + G7 g: r1 l8 @" 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 16:22 , Processed in 0.857704 second(s), 51 queries .

    回顶部