QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络
    ; m1 W/ y2 A! j3 l顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
    2 ~/ q% P, R( E+ Y; Y, k
    , i2 F* E9 `6 y7 W2 ?: y' o; Z3 ~大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。2 t5 j# S3 n, }' W$ N

    . @% U3 U/ M; J它由三层组成,分别是:
    ! N$ y! M8 G; F8 v
    # h1 m  G, m1 z, m输入层/ w" u+ \0 Y( `
    7 d2 {( k7 b7 a4 ?4 e. L; P
    隐藏层
    5 B- L- g: C! N" F1 Z
    & x6 }, h! B1 M输出层: U. M0 P( z2 u/ h+ P9 W* _2 f

    2 O! m# v3 s8 _7 m
    ! s* F7 c5 R" N0 ?4 G) J使用乳腺癌数据集创建ANN
    6 z8 N  r  w; P% `3 e现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。
    - m8 l; B+ D& }/ G0 p
    2 |, r5 [. n4 w1 V0 f首先,我们采用乳腺癌的数据集,然后继续前进。+ r- g* f8 V: V: a; C. y
    3 S+ O) q" K( x
    乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data& p' m: _# n& |. f# {1 d" M2 r
    6 z$ \' t3 I( x) g% s3 a9 i" @8 v
    下载数据集后,我们将导入所需的重要库。
    ( F( o+ m" j2 o7 a6 j( P0 y6 t( S: X8 U
    导入库
    , u4 M) J( s1 M: z3 k$ Z8 o( A#import pandas
    4 {- |' r' ^3 l" P8 M; o+ ]& [import pandas as pd
    , I3 g: ]' q3 G" I1 @! X! K7 q6 c#import numpy1 W( H; t6 [2 \; A/ U
    import numpy as np
    - ~3 l* M! E4 v1 N7 q9 nimport matplotlib.pyplot as plt
    4 x- ^/ B) ^! b7 S; K4 R  I' Bimport seaborn as sb
    & C, y. \# F: p1 M; p/ O 这里我们导入了 pandas、NumPy 和一些可视化库。1 m5 C/ b' w" X) @

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


    " ?8 n" V$ ~5 K: I) |1 udf = pd.read_csv('Breast_cancer.csv')
    0 e; q# B3 s' |% M" mdf
    6 i* ]7 U0 I, U
    ( }- T, M/ _* x8 u
    4 [' ~2 p$ o. L( ^5 s在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:- [2 f$ Z- {5 [# B& F( s0 \

    ' ], x2 E# g2 O4 f( A4 y8 w$ y# counting values of variables in 'diagnosis'$ w1 J6 l: P; j  G1 i
    df['diagnosis'].value_counts()* I- t& S! M; R: u
    8 z, Y- O( L% r  S2 g' U7 Y( l
    ' u9 Y5 d9 Z. P0 T

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

    可视化值计数
    , L1 ?5 @& ]& E. a$ H1 Fplt.figure(figsize=[17,9])7 M5 p; c8 n+ J& m
    sb.countplot(df['diagnosis'].value_counts())
    2 F. L0 L* v9 b& qplt.show()+ b$ [4 G8 b+ r& L0 `  q
    " k: Z( ?' U2 k# j1 s: J

    , r1 Q  V, U- A空值

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

    9 J# d: I- Y, i& H( r
    df.isnull().sum()% Q3 a% Q" E6 q1 ?
    执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。
    4 E8 z& ?- H/ |: c5 \( d
    - N" \, z" v  _  w8 m#droping feature' q% h% K6 e  A+ q6 H
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)& D+ ]; D4 [* k& X4 J
    0 W9 D! L2 z, L3 O$ S- O
    自变量和因变量

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


    ) y+ Q7 E* e) F" O" H# independent variables
    & Y0 e6 I& D4 S7 qx = df.drop('diagnosis',axis=1)
    / U; a( W* e  I) V4 a. ?#dependent variables) I" ]# v3 M1 d
    y = df.diagnosis
    7 d" n! m; \# Q4 `; Q6 h 处理分类值
      ?: c7 e1 y1 u; ?当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。$ @$ Z. B: M! d! a6 C

    - K. B* w5 K) Ffrom sklearn.preprocessing import LabelEncoder
    . y  ?& h8 T# W, n#creating the object
    7 Y* V+ i- t5 \0 P* c' h! Elb = LabelEncoder()5 ~* x% t0 k/ h7 U! ?$ Q
    y = lb.fit_transform(y)
    2 S" c6 o9 Z- E* |% Z; X; W0 |$ P+ w& {6 F$ c4 k
    拆分数据. @  a! M; T* C8 w! J1 x# ]6 L
    现在是时候将数据拆分为训练和测试部分了:* w4 U. \5 `$ b( K. X* |3 L2 Y8 K/ k7 O, d
    8 A6 @* J, ]* `' a; G
    from sklearn.model_selection import train_test_split. k7 J# t. B9 `$ `2 k- J8 X
    xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)4 D) ?8 j1 L* v* l

    ; n2 l) p+ c4 l! p0 `! D# {* B: p缩放数据
    7 e9 U1 E6 M0 P" k2 t当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
    6 ^6 `# a! q) U  W* N. q) l5 k; s
    : f/ H$ m" P% T0 O' e4 J$ B对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:
    8 N0 ]- k* n- l
    2 ~/ \8 F: j% b8 W0 p#importing StandardScaler: R0 d% D! q& P# f
    from sklearn.preprocessing import StandardScaler
      @( N) `( l/ I' Y0 u#creating object
    8 b7 X! ]# k1 {/ j/ `3 R5 \3 Msc = StandardScaler()/ x: P/ h4 q  Z' w8 b7 E
    xtrain = sc.fit_transform(xtrain)
    # k7 m+ v3 ^$ pxtest = sc.transform(xtest)
    5 t2 t: F' G2 `+ B2 k8 |: z9 o% Z8 u  d* }4 O$ S  g
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:4 |& {& b' T/ m- v
    4 \" U- }! [# G/ ]  |0 m+ ?7 `
    #importing keras
    6 n6 c* T8 V( x6 H7 p) K$ Uimport keras
    9 T" J1 H2 [# X/ k& M9 ?#importing sequential module
    5 R$ R( y/ A. `: i' `5 ^' _' {from keras.models import Sequential9 o2 W7 h; Y# f! G# d9 f7 ]
    # import dense module for hidden layers
    . Z1 a5 L$ Z5 z( `, A4 ~from keras.layers import Dense
    # h! i7 ~2 X# Q* U#importing activation functions
    ; l& ?. ^1 E0 efrom keras.layers import LeakyReLU,PReLU,ELU) j2 p5 e1 D3 S+ o4 A
    from keras.layers import Dropout$ G7 y$ F1 ?* _8 g! _! e

    & ^7 M3 r. ~; X创建层
    0 s$ H" L" j6 f6 j+ L0 `8 X3 W导入这些库后,我们创建了三种类型的层:5 I& d$ E" G1 A2 T% ^

    : s' T# I4 Q2 a8 w, i输入层/ T: z  J1 p# k0 Y  g" n5 R

    ! @1 p  A% v2 [0 ~7 H& A2 ~隐藏层/ S, s3 v( V" k# u
    - D5 ^. ^3 J& u
    输出层4 `. F4 S3 \$ U1 a% O8 z) R. L

    8 t0 e3 `: j5 t: i" ^) w- i首先,我们创建模型:
    : S* \9 n/ j" f+ f$ \- N- ?7 V" e& I' F4 f
    #creating model) D% I# S+ j) V: d  J. s& Q
    classifier = Sequential()
    2 g' u: h) @, s( |# U
    , P3 S1 o6 P8 zSequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。2 _% k7 ~% h' _( M& u, E

    $ C' ?" A$ u7 W# A; {现在我们创建神经网络的层:8 a* ?- L# r; C9 Y7 W5 }) I

    : h& H. L7 j7 ?; u/ W#first hidden layer
    0 `" ]: b4 r" @3 o2 pclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))
    : m8 C+ ^  @( x; c#second hidden layer- u9 z* o! j: v, r
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))8 f1 c! u5 z8 ]+ i; C$ {
    # last layer or output layer. j; G& w, h5 E  d" i; N! W+ u% H
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))5 v& P7 ?+ T: o1 j0 T

    $ j6 @* |1 g4 ~# N在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。3 ^" E& o- U5 v
    $ [  c* L, ~( J# M, e. g: c  }$ I- l
    第一个参数是输出节点
    " g: n' {% d0 a/ c' Z* p% f4 u( S: Q% _6 Q7 }
    第二个是内核权重矩阵的初始化器+ u8 w  D& w4 D! f& H% a4 h1 \

    . ]. N$ N6 v/ N& _, F第三个是激活函数
    % K2 P9 B; h9 n! R; `5 V/ Q
    : J% @! u- N: f0 U最后一个参数是输入节点或独立特征的数量。# s% {5 ]8 j4 G: }/ K0 z

    2 p1 o( J6 J! V执行此代码后,我们使用以下方法对其进行总结:& G! O2 _8 T. l! ~
    #taking summary of layers
    " N" B5 @. h- E6 }- [. }  T# a% c3 Bclassifier.summary()
    ' \  d$ Z7 m7 |! Q
    : M/ L! Q6 [( [! D- k# r/ }( v6 q' V; a% O& L+ f8 ?$ y
    编译人工神经网络
      [4 w/ U  H3 L1 W* h+ u: U现在我们用优化器编译我们的模型:& J  ~( e( c7 C- x- n

    5 n( }# J8 E+ R" p8 v#compiling the ANN
    2 ^. ?8 M  J( A9 J. w+ s% K8 aclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    * L5 J- T; [3 G3 V/ M6 i! j; L6 }7 b4 O# A; J( E
    将 ANN 拟合到训练数据中- a8 n4 c4 j: O5 g
    编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
    . ?# q* b) b$ A. Z" t. m6 K! Y% P0 A+ T& \& |) V% q) s/ \
    #fitting the ANN to the training set- y% y) P( H, ]- R
    model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)% A0 L! c8 [- B- }) W: o& V& W2 k

      K9 K& t% j/ e, P/ [- o, `
    ' b* A1 b, W  \8 ?- ~7 tit()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    # x9 g' R1 ?3 j9 N0 H2 C8 n5 \
    9 `( U8 T; g$ G1 a/ @- Q& a* Q在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:# C7 t- N1 Q6 n. W' v0 x- @
    2 m. b* ]$ l5 h& r: \
    #now testing for Test data
    2 a: |" \" ^* ^2 ky_pred = classifier.predict(test)( W9 R( v% ?4 w. E

    ) B; a7 M  |8 D7 _0 o6 S* |. u在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    ) c1 |! Y: c$ u8 y2 T
    + m3 W( c8 P6 _4 S9 {" e% R#converting values
    ; p6 o6 v6 C  F% M- m+ i( ^y_pred = (y_pred>0.5)
    + k6 ^7 F$ Q) P6 j* O5 fprint(y_pred)
    5 g: }8 ~* Y7 H) V9 O  t- x1 Q0 V& b* s& G; Q* e

    " X" m% d: Z$ B: @/ O" p3 z) S: h$ \/ d
    分数和混淆矩阵; n; A* P; g4 R8 Z
    现在我们检查混淆矩阵和预测值的分数。
    9 k' t7 n* \# e" o0 L* `* v; n; {4 `& w% `1 A) }
    from sklearn.metrics import confusion_matrix
    0 q$ |1 g+ g$ r0 G4 A( {from sklearn.metrics import accuracy_score
    ( I1 k" ^4 x2 x. }% Dcm = confusion_matrix(ytest,y_pred)
    , [. u) F6 X: r1 }6 iscore = accuracy_score(ytest,y_pred)
    1 T/ m# F# W& j( q; Eprint(cm)! y6 a) h, h: K
    print('score is:',score)' k; L& S0 [8 \- C* S/ s

    5 \- g& v/ H. T2 l9 R输出:3 }/ w) L- u/ s- a

    # Q6 [8 p0 a  v$ b, V
    3 r( \) M& l# Y9 M2 d# S3 F( W. Y5 u) k/ B6 R& o
    可视化混淆矩阵
    - q" R) e' z, e0 g# e+ N# z1 F在这里,我们可视化预测值的混淆矩阵
    4 U+ h& T$ b- {' u/ b4 K1 D6 f7 B4 q$ B3 P
    # creating heatmap of comfussion matrix
    9 ^- f( |0 ?1 e& z+ Nplt.figure(figsize=[14,7])' X* T+ S3 V$ L6 ?' G: W
    sb.heatmap(cm,annot=True)
    7 N0 `) o" B1 S4 Eplt.show()
    - C. K: V) n, B, l1 Q; L% s
    - t: |- v  N# V5 ^  |
    5 D. c. E. Y' i, g# p. N  m0 M: n+ _, Q0 o. n, {) V
    可视化数据历史' q5 o3 b2 J* ]% u* n5 J
    现在我们可视化每个时期的损失和准确性。
    . ]) W) l: J+ h9 B- |' q( y, a
    : k7 g( z" ?; z$ R3 b. Z# list all data in history; p; u1 h. f2 V- l2 C8 _' C
    print(model.history.keys())% S+ }1 ~3 {5 f' s: Y2 S
    # summarize history for accuracy
    % \. P; }+ M. Xplt.plot(model.history['accuracy'])
    ; t$ h# J8 ~4 W9 Y. Xplt.title('model accuracy')
    ) h3 |. `: W. ^7 X5 q3 {plt.ylabel('accuracy')
      \" D7 y1 n. Wplt.xlabel('epoch')' n* y" t/ Y4 R2 b6 r& P8 w
    plt.legend(['train', 'test'], loc='upper left')8 i( C3 \' \) `0 x1 o, r$ \& e7 a
    plt.show(). I  K2 D; y% m/ Y& M. f

    1 U: U" N8 N7 f; A
    ( X5 ]- w2 \+ w9 B) k: p+ |
    / J; O: W. k; Y! ^2 ^# ?' A( t- _0 j/ H. f! Y" M- }
    # summarize history for loss) @5 i3 l9 M0 x& L
    plt.plot(model.history['loss'])
    3 p  m' [+ H+ f( l+ w# uplt.title('model loss'). i0 M* `1 |0 q& b# G
    plt.ylabel('loss')1 z1 H) x4 {2 x
    plt.xlabel('epoch'); |, x1 l$ L" o) {
    plt.legend(['train', 'test'], loc='upper left')4 J% Z+ Y8 r+ w0 H
    plt.show(): H, U: e# `( \8 f6 ?* `' l5 A

    & t6 g/ @9 S/ O" M
    2 X" P* |9 c/ V$ [4 C1 a9 ?: ?) x7 z2 {
    保存模型

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

    • . Q( V* K3 E& k+ t6 y3 s  c

      . j1 g3 ^4 b. N* ]  S1 y6 T4 z#saving the model
        ]# Z$ y& v9 x: {2 R+ T6 V; w( t

      8 {: O& X6 F; }" `
    • $ P$ `" I8 M' @% x. y( J. O
      8 _6 t9 Q# V( o+ |& q  j3 k
      classifier.save('File_name.h5')+ V# L- v! _4 s9 r* A
      # `/ V- `8 \' I" h5 P5 U
    • % X/ @, |4 N9 O4 D% ~
      ; C' d- |" J, o( c* D4 u& i9 S* A
    : c; S. M& E" ~9 {

    : v. B2 H: U$ t; G( ~: s% f2 E
    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-7-10 17:40 , Processed in 0.411408 second(s), 50 queries .

    回顶部