QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络& _9 {3 t" g* e7 l1 n+ |
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
    " x# q' Q1 w9 @- T7 W- |$ [# p! F5 w% @9 g" c# b- u  x) j& d
    大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
    ' n  b$ T3 }4 {/ t- S. p1 q3 j6 W
    % b* V# G% V4 `  K$ L% C  U8 D- w它由三层组成,分别是:2 ?4 r7 K" r2 I9 E

    , l5 O/ i; W2 D" F1 e" @输入层
    ; W! K; R. [# [2 T0 P) W; c3 P2 S3 g
    隐藏层$ c8 K: A9 U# J$ x/ _. x
    / g( ?# z9 {9 A  H2 ~5 |1 H, E
    输出层$ @, P3 c+ X" P
    0 a" ]! z! s- ~3 N+ v7 T# A( E

    3 c) ~4 \5 E# D& n5 r# l使用乳腺癌数据集创建ANN
    7 ]/ t+ I5 y: Y( `0 a现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。
    0 y! b" R% E3 \% {8 {1 n2 c7 A/ T9 N4 m) _" F6 Z& l6 g- @- F
    首先,我们采用乳腺癌的数据集,然后继续前进。8 o0 d7 r9 O4 I8 f( M

    6 u0 w$ P+ I: \乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data6 y1 ^3 J, }' @- U1 N
    8 e: ^' Q6 _% H0 u! M
    下载数据集后,我们将导入所需的重要库。
    / D4 }, n  G! R1 T8 v2 W4 p* n( _1 s( B! Q$ W# z$ w
    导入库
    9 n. b/ L) G' a#import pandas
    0 k8 P* ^+ K  A7 @3 y; uimport pandas as pd
    # t6 S) z- y. L0 B#import numpy
    7 ?* y; y- k) v' @4 b, I, Pimport numpy as np/ O  n0 C0 }( g8 x4 M$ u
    import matplotlib.pyplot as plt2 @. y2 z1 a9 s. v$ C2 k$ v0 a
    import seaborn as sb
    2 U- ~) S# P4 }: h 这里我们导入了 pandas、NumPy 和一些可视化库。
    ( L& V" o. U0 \( \6 G: {/ ~

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

    ! N. r, \' R, K
    df = pd.read_csv('Breast_cancer.csv')
    - S0 Y# s+ J5 p& a! [3 gdf
    8 d) f3 @4 h  X
    7 ?$ o7 D4 }. k6 e6 L  S1 n0 [) h! _& S, c% X2 S
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:: e4 U1 t% p# [0 i
    / }1 u8 f: s3 y5 z: f/ Y
    # counting values of variables in 'diagnosis'
    - Q3 B5 T% t% I+ T+ a% Udf['diagnosis'].value_counts()2 j8 u0 z. P. R( Q5 |6 O

    2 K! w. f, Y2 V. F' i0 n
    ! M  P( N3 E9 W7 e5 G

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

    可视化值计数
    ( l( L2 _0 U" gplt.figure(figsize=[17,9])
    ; ?. v- F. B, w; T$ `* B$ Isb.countplot(df['diagnosis'].value_counts())
    % z8 l2 G/ o8 Xplt.show()0 p2 g/ W* u+ X4 p; Y, [
    , O8 ^! m! E# n4 |+ a& i. n
    2 G' ^- x* Z8 B5 G
    空值

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

    4 s" u) i5 K8 R8 X
    df.isnull().sum()
    ( I2 B- r4 `! G/ N8 r+ s* n 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。
    : S6 K# \+ u! [1 H0 H+ p6 C8 Z
    #droping feature% ~( s& P4 f: Q
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)$ U; z9 a" P) Z4 ~

    ; Q+ ]& g& R4 N5 V0 a自变量和因变量

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

    4 d3 M' j* |0 J# p! B
    # independent variables9 _5 X4 e- |$ u9 z! z8 d: W8 v3 ?
    x = df.drop('diagnosis',axis=1)
    1 N/ w: X4 ?3 R: p$ J, m; |4 S#dependent variables
    : P* f3 E6 N5 i0 p$ Hy = df.diagnosis
    6 y9 I7 Z- o4 h: D 处理分类值" s' b8 Y1 c  {1 I  A8 \! s
    当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。2 O. I5 a9 f! S4 `
    & |8 t4 f7 E7 A, W. }% Q
    from sklearn.preprocessing import LabelEncoder) E$ P$ v1 v- L- n6 y& o$ D' B, U
    #creating the object: E0 Z) P3 e2 Q" Z
    lb = LabelEncoder()# `/ s' X1 b( p0 q$ }6 ]' N
    y = lb.fit_transform(y)
    ) f& z% W4 V. z$ b  v- D. C9 |% F/ T7 W
    拆分数据- t8 K+ X; u- m$ |* i  S5 y
    现在是时候将数据拆分为训练和测试部分了:
    1 Y; w# f& z- W9 v% S; L
    ! |1 W/ u! l3 Q- t1 a$ t$ Ofrom sklearn.model_selection import train_test_split
    . R8 c; N7 M5 ]7 M' k0 w! [6 gxtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    4 u9 R% |6 S: T4 d& O$ m/ j' A7 W% Q& `; Q
    缩放数据- G9 I) x) K8 `+ X  ]- X; u- q! |$ [
    当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。* Q+ w) K: I- E

    6 m* b# N  m) R" j对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
    . o; K# e. A* P
    - \# Z6 H, o: m$ ]% w#importing StandardScaler
    ) J, L& y1 w) [" D! G7 d( bfrom sklearn.preprocessing import StandardScaler7 p$ H5 S- h7 y; L6 {" K9 Q5 W4 \
    #creating object
    & l' q8 S5 w7 l7 Z' [& ?; nsc = StandardScaler()
    : T; R6 M2 E# Pxtrain = sc.fit_transform(xtrain)
    2 w. m& s: z0 C3 vxtest = sc.transform(xtest)/ @+ W+ a3 _( O2 T  m2 ?+ U6 Q0 v
    7 ?' u* t0 }# K/ S3 c
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:( f- m5 l% V2 K0 d0 d# ~5 P
    & ]( `' L% @: ]6 o$ g5 ?. C7 Q+ X
    #importing keras
    3 E( }4 T: ^2 \  B; E% S8 F5 N2 P* j1 U+ oimport keras
    / E+ `( @9 }$ q2 \4 D#importing sequential module
    % u; h0 j$ Q; Q! O% ]from keras.models import Sequential
    & S: k6 i: m4 |3 J4 K+ }# import dense module for hidden layers
    ! T% E, d, f+ W% i4 U1 Hfrom keras.layers import Dense
    ; M% _% A6 v5 t' b#importing activation functions
    ' }  x- v" P" n; Z. nfrom keras.layers import LeakyReLU,PReLU,ELU
    1 F, W5 {6 b( l! e, Z% efrom keras.layers import Dropout! @5 v5 j0 k8 Q, F8 O, b/ s

    5 S3 {2 R  c9 C/ {2 R. I/ o0 D$ ]创建层* a+ E9 s9 J# D+ |  w
    导入这些库后,我们创建了三种类型的层:2 ~& {. \* }, n' N

    1 j$ |2 {: e0 V8 x/ w输入层: R4 c$ k+ K1 l, m! f7 Z" p5 z% t

    # [* w5 w# v  [/ X2 M! _隐藏层
    7 Y" [$ r- K; }: H' P  N: C' ~9 _
    % A5 \, R  j  u4 q" }+ M' M! ?& K- o5 u输出层
    - S- S/ E7 `' V! V* p0 d+ p7 o: W
    首先,我们创建模型:
    1 K. y/ I0 F, R
    - d3 x; u8 R- r2 p8 m#creating model
    1 @: x  x4 `) X7 Z1 T* F, O! ]7 {classifier = Sequential()% G0 W# ^' @: N9 k' ?  J
    : ~9 j/ W# A! T: t/ S2 }2 o
    Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。5 J3 y$ _2 X! n  W

    & q) y* i3 o: Z$ C, W现在我们创建神经网络的层:. z7 u: h/ h0 `
    9 C2 b' }6 Q, \2 W& k' g; t
    #first hidden layer" Y; A) m) w' f
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))+ |: {" a/ y/ r9 a
    #second hidden layer
    ! ^3 s- z' U$ G1 v% M; O6 u5 Hclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))
    ! @" r+ T: Z" A' f) n0 B  t  R# last layer or output layer4 f$ D! O5 ^2 w
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
    8 D0 ^. C# }% h( _9 z6 Y) D4 \, N- _+ H! q' k
    在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    " l" l& A  a8 @* r+ a
    ( c7 n1 G! u7 g5 O$ V6 @& U第一个参数是输出节点
    * [/ ?( j0 E3 e  \. G
    ) {: V. A/ p1 {" V% K第二个是内核权重矩阵的初始化器$ m2 r% _. o7 v5 f( x; z
    ; i; F9 Z( t, D" a
    第三个是激活函数+ k1 k; b) t: C) L- I
    2 {6 @' V$ q' D
    最后一个参数是输入节点或独立特征的数量。
    9 R: _$ s9 h! V( h- c" s6 R& S( |+ }4 ?! I* E. b. @
    执行此代码后,我们使用以下方法对其进行总结:
    9 o: L* M4 d; M+ w! E! h#taking summary of layers
    . @, C" B. G5 ]% U) o5 wclassifier.summary()
    9 G# S4 G0 g7 H& a/ G% p5 G / [9 ]; E" O$ B$ U

    * x* V! v3 W( Q: \9 t' i编译人工神经网络4 B* \' \9 n) Z! |8 `9 @" R3 {0 S
    现在我们用优化器编译我们的模型:
    - I( D; H. r. m4 D! h2 R7 z: b- ?$ p& Z
    #compiling the ANN
    7 [( @4 n8 v% |% Sclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    " @  z( k/ E  r! [% V" H( {6 ~" d  Q/ @1 N
    将 ANN 拟合到训练数据中
    $ _, z( j* n' t" n* E! |. [9 `编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
    / e' D- o5 ?; ~, ^3 m! ^. l9 a) b7 b1 \+ S: R" i/ v0 ?6 _
    #fitting the ANN to the training set0 h- g+ c# H6 ^8 J7 O+ V" g! A( F
    model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)  w" `' G* D3 B+ ~: h8 U

    / Z; C* [: _, M) m5 j0 `' ~: i7 D# k& d- z' Z
    it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    + O0 b' t$ G+ X
    ' E2 d2 k6 D1 E; D% P6 g在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:6 S# y) ?  ], s
    1 X8 I) m4 P$ K9 A0 B' Y  c
    #now testing for Test data% w1 @" A- }7 V+ g% g& U: i
    y_pred = classifier.predict(test)4 d- ~% b! g* i) q4 E

    2 u6 R. j5 ~& }( l; c+ b在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。. C  K! E* u$ L  T% w
    $ T8 G% [% J( Q
    #converting values$ \7 R- a- O2 H1 }% n- |
    y_pred = (y_pred>0.5)
    6 Q7 G5 z% o9 q; Jprint(y_pred)
    ! |" @, j8 g) G' w: @0 `$ H1 `- }5 r5 a
    % d" @7 E: L  b  t( A: r

    3 ^4 o4 Z2 _9 j" M& r. V; s+ Q9 T分数和混淆矩阵
    4 L$ k, P( R7 K" B1 }! W  C现在我们检查混淆矩阵和预测值的分数。
    # f1 K$ ]5 V, F  f& K
    ' R. z1 l. F# J1 @, N% yfrom sklearn.metrics import confusion_matrix' ]( [$ |2 I' q& \5 Y6 k+ O, \3 s
    from sklearn.metrics import accuracy_score
    ) o; ?1 {5 r& U8 }3 K- G4 D0 ncm = confusion_matrix(ytest,y_pred)  f6 }: l8 {* Z& i7 z' {. {
    score = accuracy_score(ytest,y_pred)1 N  z& I4 o  O+ l9 h2 F* e. {) l
    print(cm)
    9 K0 s2 h  t6 X% A' Tprint('score is:',score)
    ! @+ d3 k& ^* ~5 A% \7 _( i9 }6 K5 ?1 {5 ~" x
    输出:) \0 Q+ k" ^9 `# ]+ {1 W
    0 M7 s; V) ?* H+ Q0 u

      f; g  @2 X. E7 Z6 D. S( E7 m8 `  m2 W; H; X$ n* N' n( W8 i
    可视化混淆矩阵1 l8 m5 y& N% _7 z
    在这里,我们可视化预测值的混淆矩阵
    . C" b4 i( G. ?% I& W  F
    + Z, C0 P6 ~! A0 H# creating heatmap of comfussion matrix9 c/ }* U; _2 A2 N0 ^2 x/ B% J
    plt.figure(figsize=[14,7])
    ( u1 d" L! u$ C/ \sb.heatmap(cm,annot=True)
    ( @0 ?* k# C; t' k% X- xplt.show()
    " ~2 v4 f3 ?9 T7 w" i8 E  d9 i4 d7 P

    & P. v3 V; f5 p2 Q3 a5 n
    ' Q0 m* g  k- U3 x  s( e可视化数据历史
    9 d5 i% u: ~1 }& z( \: `3 r2 i# Y- C现在我们可视化每个时期的损失和准确性。
    8 Y' ?" f$ q3 B, f( z4 q9 K1 }, R, ?: I0 A, H# \1 u0 G
    # list all data in history
    - ~0 C$ y# ^6 uprint(model.history.keys())
    + c8 w/ a# j6 O+ @# summarize history for accuracy
    8 U8 |% f! [" X/ kplt.plot(model.history['accuracy'])+ P! _$ _' |- R& H( `) D6 V1 }3 Z
    plt.title('model accuracy')0 o& E8 c# T4 b, u' a
    plt.ylabel('accuracy')1 |* F/ t* M2 c7 s- A
    plt.xlabel('epoch')
    " ^# b3 @' f0 s/ k; ~. jplt.legend(['train', 'test'], loc='upper left')+ f( E+ E# ?" p$ y$ p% [8 ?
    plt.show()% X4 a* n, H: u8 d
    , t0 p( b# W- o; M! u

    . T2 k( O0 \7 q7 u, u2 y& ^& b" ^/ p4 D# `/ o8 m' o
    , K7 ?8 ~1 \$ V3 \' V1 B8 X7 P/ k
    # summarize history for loss
    . ?7 S6 X8 L7 l, A2 U* Rplt.plot(model.history['loss'])4 l$ P" n0 R4 a, a$ u
    plt.title('model loss')
    , C3 s' O8 Y: R" E/ A9 N6 E4 Fplt.ylabel('loss')
    " C, M- Q! b% m+ W$ g/ z' bplt.xlabel('epoch'); c- x0 T1 t( U4 [( a+ X) S
    plt.legend(['train', 'test'], loc='upper left')
    : z3 [" V6 U' i2 c5 W& N% m( I" Aplt.show()# R, h/ D# a* t  {' o' H9 J7 ^7 I$ N
    * ]+ B' ^! ^) t5 \7 c( ~. v* j

    ! Z; `3 i8 E; U7 @- ]$ w6 n2 o! m% Z6 f; A
    保存模型

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

    • $ h. F* R1 _2 Z3 ^% o
      0 ^7 e) b! S3 S: [( e1 L
      #saving the model
      ; ^, @7 y0 ^9 r3 X7 ~

      3 s% U9 m7 r. g$ n! V5 C2 h* Z

    • " l# j6 B$ a4 d# p$ M

      8 z1 S+ O3 [$ \8 x/ L& i, g' ]classifier.save('File_name.h5')! B2 A% [! K$ h; c
      % _3 E. A& q$ s1 f( h1 U! s
    • 0 K. ~/ w1 e4 f2 X0 f

      6 q; `& u4 P2 `

    # A+ a9 _" G8 S1 U4 G0 {0 e+ k/ [
    ! j7 x5 x' n8 e% 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-6-10 18:57 , Processed in 0.464606 second(s), 50 queries .

    回顶部