QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络
    + X. T$ F  Z3 p9 H" n3 F, V顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。7 ^% E& ^  a, x
    % K. f- k# M7 _& ]0 r+ u
    大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。( l' j$ |) M4 v; s+ K
    . H! F  N( E: a7 |4 [
    它由三层组成,分别是:9 R0 t. F5 P( X0 y! d

    $ }5 S- A: l: Y输入层
    4 |8 H% A  ?3 M4 q0 |0 p, o0 {+ N1 S
    隐藏层
    . h; o6 U- T8 W0 |! R: P5 D; z' j! c( X7 f, \" P
    输出层7 \7 Y* o! G) C4 o. I
    6 U' g) q6 _0 D9 [$ A
    , O) U. |% e2 {. w2 M
    使用乳腺癌数据集创建ANN, m& m1 j0 P1 I) S  Y2 R
    现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。: p+ ?* P/ L3 [8 C" k  x$ ]
    : ^% A8 L% d& C) S* s
    首先,我们采用乳腺癌的数据集,然后继续前进。
    . F2 z( a) P/ N' _
    - [4 h7 w3 Q* C2 ]* F( p- f乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data
    8 W# v. J# P5 l1 b3 }- m; L+ }. x- V" S2 ?* z" f
    下载数据集后,我们将导入所需的重要库。  M7 R5 O! a  d) N0 Y% _. w. T! h$ ~

    " ?7 Y; s! `/ r' r: @9 y4 X# j导入库/ @! F# X9 p6 r7 F$ x4 I6 U9 A
    #import pandas$ K+ U; x+ e5 s% y, X, \8 E
    import pandas as pd
    9 J; K, Y7 D9 e1 c% s% ]- X#import numpy
    . l3 n$ w+ L& H' u5 Limport numpy as np, E& c- R/ V" x+ n' O) H
    import matplotlib.pyplot as plt. W" {. W% ~5 e6 B2 w8 E
    import seaborn as sb* M& p6 J5 A3 D# L9 m
    这里我们导入了 pandas、NumPy 和一些可视化库。7 @7 p$ r; Z* M5 W, M

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


    - u; `- |& J# Kdf = pd.read_csv('Breast_cancer.csv')
    $ w+ A  e. I5 L/ c0 t8 ^df
    " b* R7 k0 _% K0 }) R9 _ % _4 m' h1 e# @! e, I( N
    ! X5 N! @- X/ o* h* N- Z% ^
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
    $ \) c' ?; x  a% c% W
    6 E7 a" d- m5 ]7 B+ W: X# counting values of variables in 'diagnosis'! ~* E- @, Q( ]2 z
    df['diagnosis'].value_counts()
    , ]9 Q, X0 E7 n5 P) G
    7 l8 U1 `# l9 ~$ N" \
    / r# t5 o& U; c- @$ Y4 g1 N

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

    可视化值计数
    * _3 \% q4 N2 V/ d8 W4 v! Xplt.figure(figsize=[17,9])0 ]9 x% I3 \7 ]* A
    sb.countplot(df['diagnosis'].value_counts())  b4 q1 \. F5 _2 N4 {
    plt.show()
    , y. e* p9 Y% f& j7 N $ E9 n1 @2 E% j* I3 Y- G: N) N$ A2 ]
    ! T' M; l* @# N) _' E  x7 C! [! M8 \
    空值

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


    0 g8 ?& {; |; x4 n5 ndf.isnull().sum()0 m7 U: |1 d# P" b* {
    执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。! E: G8 j8 y6 ~2 A8 ?" n) b, H! D$ _
    $ a) ]" |0 y6 @. G
    #droping feature: M: h  G+ v+ j5 O- y
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)
      k5 W3 P+ |& i& T# \
    : l) r  N8 \6 f$ U$ M2 D8 I% j自变量和因变量

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


    - B. x$ i! m4 B& f# independent variables
    # p1 V; S% N7 ?5 s' B8 ?. px = df.drop('diagnosis',axis=1)
    1 x- G7 c6 ^' K* B- j#dependent variables
    7 @9 a7 U% X7 r* w$ C8 yy = df.diagnosis, x8 W" a# Y" n$ I
    处理分类值8 Z2 c. y& Z$ M9 }# y' U
    当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。4 g; j% ~2 [% A; d

    . K7 E! e' y6 V# f. _/ mfrom sklearn.preprocessing import LabelEncoder
    ) Q4 [, ]2 ^  }! q, F# E7 H# d#creating the object) E7 }0 m4 ~1 X2 U) a8 c+ m4 f6 M
    lb = LabelEncoder()1 q% R( `: N8 Y6 K% R, ~+ C4 t4 m& U
    y = lb.fit_transform(y)
    * s* N, Q( Y6 ?$ u# j0 k( R0 C$ i$ O
    0 N4 o/ h9 a- H拆分数据
      {4 v- R9 W: A* ~0 D' k现在是时候将数据拆分为训练和测试部分了:
    1 S. S; b) F6 p' H# `9 L% L- c) o% |, [
    from sklearn.model_selection import train_test_split+ S* j! h! B' p
    xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    ( B) P' e2 F6 A5 I% Z1 O* F% ~( c$ g0 o7 R! ?4 V% C8 {
    缩放数据1 k$ I. C; e* `# K) Z8 o) b5 Z
    当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
    3 E# q5 y, e# _8 t3 i) T- s) f% S2 z" ?6 n
    对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:) L7 K; u, E0 p

    % |! s9 b3 N; C+ @& y6 l  C#importing StandardScaler" I! P7 A/ y+ C2 X; N
    from sklearn.preprocessing import StandardScaler/ f" R- _6 f* q
    #creating object/ j: }/ s" T2 r
    sc = StandardScaler()
    0 \! Z/ L7 g2 p1 hxtrain = sc.fit_transform(xtrain)
    6 M) E! F$ M$ N9 C, Y1 \  x+ Z8 Fxtest = sc.transform(xtest); H* x0 J& d: J: v
    4 [  L+ T8 e% t8 G& o  v% B
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:1 s$ V5 s  C7 ?
    # Q7 c3 b, ~8 ]. l4 c
    #importing keras% Q" \! @. n* n
    import keras
    4 [5 z  ?, V" f6 b! R4 v#importing sequential module% ^3 I: T+ |& w5 o1 S
    from keras.models import Sequential
    * T2 h0 m, q7 x9 H) D- h# import dense module for hidden layers! q2 Y8 n4 l) I( i" a4 l8 Q
    from keras.layers import Dense( M5 a$ j/ }  @4 A1 H+ K7 j4 _1 M
    #importing activation functions
    . V, V0 h6 y! V! P! X' Z. O$ Ifrom keras.layers import LeakyReLU,PReLU,ELU
    1 [0 t0 y2 K) Cfrom keras.layers import Dropout
    ' X0 {2 z4 k- ^% |' C. J5 a, L& z% Z' O) B% Y
    创建层
    $ x+ {; I: ?5 v& {& R导入这些库后,我们创建了三种类型的层:
    . l  n# G2 V0 h7 Q0 d
    - ~: E! ?: D* v2 [输入层9 G: I% _. [! [" m
    0 i) V0 w: V) h- n- e/ G- U# X
    隐藏层
    $ l- K, l8 @3 D: I
    ( F; j( p& e5 A输出层" e- V  w0 O" b, Z0 x. k+ ~
    + W7 ?% x9 h3 i3 f1 B
    首先,我们创建模型:
    ; g7 ?- d! ~3 {: Y  F8 G. u
    ( y. S* ], b" G; `4 b0 d#creating model" X1 w7 U& f8 x. g6 o! s" d" V
    classifier = Sequential()
    $ w8 x1 S) H; [, _0 l
    . c  f$ |% h7 uSequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。  H, F6 w  a* T3 P- z  R

    / g) S- I! H  m' H) S现在我们创建神经网络的层:# @- S7 W0 F" L. i  I! Y; b

    6 `( V+ ]" s/ b  p  O0 H1 f. x#first hidden layer
    / t" Z0 r3 U5 m; Bclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30)); G$ r  X6 K) `& E
    #second hidden layer! Y& J9 G3 _2 N" r
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))% V4 A+ d, W% s4 G2 s
    # last layer or output layer* }1 P9 J9 y7 s) [
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))
    1 W4 q1 l; R* t6 \, F3 e# G6 ]0 |$ E4 A- j# I5 |: X
    在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
      z: e+ v8 I! Y$ `3 F! t4 D: `8 ^  M1 u8 b
    第一个参数是输出节点
    2 z# [5 P" e( U2 s# d
    & l% ~9 n$ x1 y1 |; R$ R第二个是内核权重矩阵的初始化器
    " g2 w% G& C! E; D8 X, s4 S  P' `- M# u8 u: p# p# O7 I% }1 T: V
    第三个是激活函数. S$ R3 x' X6 _
    4 p% f  J* t  m9 j
    最后一个参数是输入节点或独立特征的数量。. y) h/ W; K$ J" p

    5 P9 o1 f8 C! {* O& }执行此代码后,我们使用以下方法对其进行总结:2 q! b+ ]4 d3 J8 t3 Q0 e5 w! j+ K
    #taking summary of layers- D3 {" U) M7 M' E$ p0 y
    classifier.summary()
    - a1 |; V  Q( [  Q8 F
    5 w( s! n/ z: i% |' t  \# R0 ^2 I7 ]6 \
    编译人工神经网络: p3 Y2 f/ z. G8 Z
    现在我们用优化器编译我们的模型:+ O$ H6 N* m2 A5 v# ?, N+ G1 G& N) a

    : {& S7 k$ U6 [#compiling the ANN6 f" V6 j' _* E/ W* D' e. l, C
    classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    9 w  a: i2 d/ n& n3 k) ]; C+ J+ l- c# m. T* p3 A. V5 a0 C
    将 ANN 拟合到训练数据中" _; Q* [8 u! Q% p3 X
    编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:" N8 c; A5 S9 n: s1 L  {1 q

    7 w! e* o6 e- ^ #fitting the ANN to the training set- e. ]  J# ]; F$ X) z  M
    model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)+ E6 @- Z: D2 ^+ {

    8 D8 t, Y5 q7 G+ c' R: n
      ~4 y! P/ m, W, n9 T8 }it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    ' V! Z2 h) I7 y1 ~, n1 y8 V$ G4 l* m& d
    在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:
    $ w3 z- k( x- {, H" ~& x( k% _$ J7 X2 y1 X6 \
    #now testing for Test data
    5 R" D% f/ c  Q* x/ p6 c" }y_pred = classifier.predict(test)
    , r, |0 M% F5 P# k6 w$ k# w& a; ^# K4 \
    在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    1 @4 M2 _. B3 a# |. y: Q
    # `1 E* c8 g/ G' R% X#converting values
    ! D7 r$ O" [/ H3 g6 Qy_pred = (y_pred>0.5)& k' C$ W* V, e- x2 T. P6 H+ ?: t8 ?
    print(y_pred)
    5 r5 N% }% g% Y0 c4 [/ f8 O) C% E0 e- o

      j. i: k0 b6 i
    ) n9 V$ D0 {, l/ H分数和混淆矩阵& E. T3 z8 N: A) q
    现在我们检查混淆矩阵和预测值的分数。
    : z( `/ W4 f1 T$ e' u/ D! X5 w2 u
    from sklearn.metrics import confusion_matrix7 Q, \) D. G# `* J3 ]2 `/ X# D( ^
    from sklearn.metrics import accuracy_score
    & I7 S- r7 h8 F$ n' q- ^cm = confusion_matrix(ytest,y_pred)
    3 |6 k% A( _9 h, q6 j; G- ascore = accuracy_score(ytest,y_pred)  N- X6 w7 l4 t9 R  C3 s  k
    print(cm)
    , B$ }6 ]: W! s6 T9 A" J/ Mprint('score is:',score)' O( e  D& ^" t, R+ ?

    / Z1 R. s# s- a% H输出:
    $ N/ a) Y: |( C, C' @! S$ @
    / g, N+ x4 i& J9 i
    $ T! w5 Y/ r8 z+ W. b; m- L9 w1 z4 C: c# i0 {4 {. m, [
    可视化混淆矩阵
    + u. h8 \; M; [* j+ k) C在这里,我们可视化预测值的混淆矩阵
    4 R  y, q2 m; ~5 a: f( o
      `6 O' |' j. C( r) t" y. y" t# creating heatmap of comfussion matrix1 g* k1 h* g7 A4 G
    plt.figure(figsize=[14,7])
    # c* i6 `/ ?4 ~' @" ?* r% Csb.heatmap(cm,annot=True)
    2 c, `) j) s1 G7 L& S$ Kplt.show()
    8 U, e6 u  u3 A* H5 c( p
    5 x: o- r4 T, E! X! J
    , T7 _% {% r2 S) e/ m
    5 Q+ y. _0 ]/ i, J0 \0 Z% D1 _' g可视化数据历史! ?- Q0 y/ \8 f7 V7 ?+ Z
    现在我们可视化每个时期的损失和准确性。
    : ]! r8 }" M( l& x7 l% O3 P8 R6 I$ p
    # list all data in history
    . i) O- a8 g$ T) |+ T/ n: w* mprint(model.history.keys())
    % q  ~7 R% {$ \6 B: k# summarize history for accuracy
    : J  q- b3 q: a5 [- B6 X$ a8 b4 i- nplt.plot(model.history['accuracy'])
    ; @" ~1 m, [/ f1 M: uplt.title('model accuracy')
    $ E; i+ A' O7 e2 ?; Wplt.ylabel('accuracy')
      C' d" A$ [; R1 J- y! {& |! y+ ?plt.xlabel('epoch')
      H2 {! R" N- w9 {0 [plt.legend(['train', 'test'], loc='upper left'). ?: l, i  h, ~8 v( r7 o
    plt.show()
    , k" C; p  P* f
    8 `; `3 }6 T4 B" t: o! K
    % X  o) i6 M( L, q; p' F1 J" F6 C# f& D$ p- V. u+ {/ L- r. T

    9 O1 ~4 ^2 M$ d, |5 ]. ]4 p9 z8 [# summarize history for loss
    ) P  I; d" S. S) v& S. y/ Y& yplt.plot(model.history['loss'])
      r: s+ Q* V* w' b/ G' Cplt.title('model loss')
    7 x2 @( ^9 g9 E1 G( ]( V' B2 iplt.ylabel('loss')- V9 W5 o$ W0 U' `% N# y
    plt.xlabel('epoch')* X$ f) P5 T$ t" m0 r. k
    plt.legend(['train', 'test'], loc='upper left')& J  E. T* |& [  _" M
    plt.show()& u' r! o) w; A4 H: E9 L1 ?- c

    3 D; r3 i% |# k! L1 m; i. c
    - k' M0 ~7 _5 P% h7 P; X# [4 A. x- O1 t! g; ?! [& W8 t
    保存模型

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

    • 0 ~( x4 w/ `. I+ d

      : H! d) ]! k: ]3 Z- j1 K! U#saving the model
      * j7 E! V; l6 C" m' M

      / k7 h1 @$ @% c9 d# A

    • * O3 a+ L& u. i4 n$ k

      - u7 T! u0 x' M+ Cclassifier.save('File_name.h5')
      ! s6 Q, W% ^; x) g6 ?

      ) H" F: \+ D) U& M  V

    • 8 l4 Y1 c! \" ?9 A! _
      3 U+ f2 `. r/ T* ~
    ( s9 B, w' Y; @5 j9 A

    ' ?. D+ K# `' F+ v# C
    ' R: V  }" z: X
    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-10-10 03:23 , Processed in 0.548537 second(s), 51 queries .

    回顶部