QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络
    5 K& ?' W9 p3 o+ Z5 n8 K: b+ ^顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。1 ~& N, @: U$ f0 H1 n6 b
    6 S9 c, J- d% _! m% p/ d' S, J: d
    大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。
    : Z, [# j4 a4 Q
    ! A) p* V& T' c3 v- i它由三层组成,分别是:
    4 ~$ k: }! I8 W" U$ W- E. o! {' [+ {! d- @
    输入层( y5 ?- W! {# a5 V  J7 A
    4 ~' u' ^4 X- R( q
    隐藏层
    3 x6 d. L; o4 [% ^/ r* X+ _
    0 ]; I5 p8 h& l' b& O- r8 S输出层
    . [, x- ^1 B2 [1 X+ ?5 n4 f4 L7 M1 s/ @. x. g, w% H

    : f- v) }& K& V( y  r) i3 N使用乳腺癌数据集创建ANN
    ! U0 y. H/ F3 [5 t2 {8 x! ?$ ~. _现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。3 x* D$ `4 \& t4 \- y1 W

    # `. Z: s: \% L- V: J首先,我们采用乳腺癌的数据集,然后继续前进。
    0 l3 C, z6 ^7 t! s* H. l* E5 `+ o
    6 d. R  l2 f7 }+ f( d/ p( G乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data3 g9 q% L* ~0 M; g
    & K. R# b! F6 S$ o' `0 E5 `. x
    下载数据集后,我们将导入所需的重要库。
    1 z; x" R0 p& y# E
    % k8 b/ f- A+ ]7 A. \5 Z1 b导入库; y, ]1 }, F+ _% }$ e+ A
    #import pandas% O( E8 j; s: f2 B* u3 R
    import pandas as pd
    - b( C3 v! G: ~( G7 n. q, j6 {#import numpy
    3 l7 \! X/ d# L+ ]( D- Ximport numpy as np
    1 U( n3 y3 i+ a# u. yimport matplotlib.pyplot as plt) F8 G3 l) O( p% v8 j
    import seaborn as sb
    " r- e. o  |! t( \) r$ _" G 这里我们导入了 pandas、NumPy 和一些可视化库。
      V6 ]: w/ L7 Q$ s6 m, k

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


    : e) G7 l# M  l/ r3 Odf = pd.read_csv('Breast_cancer.csv')( ~1 R, A& |4 ~% I5 u$ H
    df( X3 X- @; J" j" k) i

    4 X3 I' N2 @1 D; l1 C0 j; O: x( h' h9 S$ {/ G; b+ t# L
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:4 ]  F$ D" T, A! b. ?

    . Z9 u/ n$ W. \; r' @2 Z# counting values of variables in 'diagnosis'
    ' G  S/ e4 Q- }0 j& K7 z0 ?& [2 Ndf['diagnosis'].value_counts()/ }& v% p/ ]1 K3 C3 c1 g9 e, {

    9 m0 a/ q# N& p% {( I" Y9 ~1 I4 _7 @) _

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

    可视化值计数3 ?* S5 @, x# [% D: o
    plt.figure(figsize=[17,9])
    2 j& g: N) Y7 a. g0 ysb.countplot(df['diagnosis'].value_counts())# J9 [. Y7 F# D/ W6 Y* W6 @
    plt.show()& x# T6 m( m" K# B! |! H. x1 }

    - M1 V" A' ?$ d3 `# a' l7 z) w1 P2 g# h
    空值

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

    $ V' j- ?9 y3 L0 [- Z
    df.isnull().sum()9 y. Y6 L. N- D8 O
    执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。
    + H% a9 h( F- B; L3 O; k% f" |/ B
    #droping feature* Q0 A2 X% H8 E0 O/ h4 d
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)! d2 F- Y2 i- x; W
    0 Q4 C) P2 Y# D
    自变量和因变量

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


    : Y% m+ M3 A4 {1 ?) ]9 q0 Q  Z8 |5 ]# independent variables
    4 a/ x% J8 A) f% i3 V3 ?x = df.drop('diagnosis',axis=1)
    ) T' g: o; a( Z' k$ R5 a$ f9 z#dependent variables
    & G1 J  _& R$ Y9 f9 `% \) my = df.diagnosis1 m5 _/ p: @! _; r6 E' j
    处理分类值. |7 N6 }7 C0 `* }
    当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
    ! V- w, W* a( _; e9 d5 W2 Q3 P7 `% C( b* {7 l1 {  o
    from sklearn.preprocessing import LabelEncoder2 O7 ?" s# H% O* t- W
    #creating the object# V* F( J) R/ ]
    lb = LabelEncoder()
    ' p# o( b0 i  zy = lb.fit_transform(y)
    1 W$ {7 e4 j7 f5 D! Q# b
    2 a, K6 l- ~/ u. T1 s3 K  {1 d拆分数据
    # _: T1 k& i* C现在是时候将数据拆分为训练和测试部分了:
    - c/ H$ ?* y& W! L& `  O
    ' W, I5 S& u5 o$ jfrom sklearn.model_selection import train_test_split
    9 p% H5 U  Q6 I5 S! U8 C$ q) Extrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)
    3 p6 a. g! b' G" r4 r) T7 ?9 }. q3 d. Z" X2 O* x  U
    缩放数据
    ) L% k+ @; c9 [当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。
    * |" b/ q7 @$ U. a6 e4 |$ R6 d2 E, q" N2 t3 ^; p- E& O
    对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:2 H9 ]; D, ?7 \! `& I1 g2 r1 @
    3 g! e8 n! D9 j$ C) J
    #importing StandardScaler0 Z. \, U- A) n
    from sklearn.preprocessing import StandardScaler
    + `1 M+ U1 O/ i! j' ^# N* o#creating object& O% V0 ?( `/ M! e* G# Q
    sc = StandardScaler()
    ' N: [" |# N/ txtrain = sc.fit_transform(xtrain)& X# a* p7 p7 [. I6 D, a
    xtest = sc.transform(xtest)# g: F7 Y! L  y$ P

    * K2 Q7 W$ g- v) O. O从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:/ _5 l0 w, g# J; G

    * z+ f$ K7 Q1 ^& I# ]#importing keras& F  D9 |: m9 G- P* K
    import keras
    * Y0 o2 f6 l* `+ u4 |#importing sequential module& \& k% q5 x7 E( w! z0 f
    from keras.models import Sequential
    ( k# |# |& g- r  N1 W2 `# import dense module for hidden layers
    0 m6 |5 ^' Z) T' x  Z. pfrom keras.layers import Dense
    ! b) w  p! T. X" W2 }. t3 F#importing activation functions
    - o! N3 G* v7 W& bfrom keras.layers import LeakyReLU,PReLU,ELU$ h$ o, G5 n: c6 C# f
    from keras.layers import Dropout
    / g( A1 o- Y2 X# r1 V0 @1 j
    " `# G/ }5 V7 O$ A创建层* A0 n; C0 s0 l* b
    导入这些库后,我们创建了三种类型的层:
    + m( P/ N3 e; p$ B2 c7 @7 W& H# M# c' z
    输入层
    9 W( h' T: \" B+ z& ]' G+ D, E7 w- f) c+ N3 c
    隐藏层* ]& a% \& {+ S& u9 p7 v+ z
    - h* o: H" l4 k+ ~
    输出层
    9 ?, n' B3 l% \. U( D
    4 t6 i4 [2 ^0 H/ E# `0 V! Z首先,我们创建模型:  w  W1 b( n8 {1 [' e
    % O3 l9 `! ^4 Y6 |+ C8 b. C
    #creating model/ F6 C. |8 b& w. T- I
    classifier = Sequential(): A' l' R# E% j( c% n
    + V4 y7 G5 f0 e
    Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
    2 j5 p4 Q- }' m, a' y$ d2 D- P3 Y- c
    现在我们创建神经网络的层:
    , e# j) X+ I' }, |0 E* v) ~0 \7 a/ t  v  W" N, ]  |  h3 i2 P
    #first hidden layer5 G) d7 s4 a! k6 t# ~5 w1 I4 n
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30)). N9 Q% [# J7 P* B9 H! l6 H. t4 c
    #second hidden layer
    % c$ y, h" Z& o) P1 m8 s1 zclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))' b5 x+ T3 ]& e- x3 q
    # last layer or output layer2 e" f+ D+ [, g/ m
    classifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid'))0 U! Q& m% h3 F4 V
    # x7 m4 }* o, j" N
    在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    2 Y# Q% i3 C  s+ C) R' [! e( E+ }% c$ }) \4 c! L% [" l
    第一个参数是输出节点1 C+ r' g8 {& v8 ]9 V1 n7 u
    1 G; V$ B+ s" R
    第二个是内核权重矩阵的初始化器/ L$ B1 |: V/ z9 s; C8 U* l
    . k. O' e$ J3 v
    第三个是激活函数
    ! Y! v# g! g8 K3 @, q9 O0 h* U" G
    ' A9 i1 S% }3 l. l$ O! v最后一个参数是输入节点或独立特征的数量。- d: d; h" U, E, b  x

    ' G+ [0 ]7 L( B' J  ~执行此代码后,我们使用以下方法对其进行总结:* `1 H4 f' ^! X; f1 d; n
    #taking summary of layers6 X9 ?  G* W! W8 F6 Q
    classifier.summary()
    5 v5 g3 p# {7 X( K2 \
    ; K! y& n5 K' p1 R- ]- H1 L' K. |( K, J% T1 ^
    编译人工神经网络
    * I# T( N, l, O4 ^* ]! z现在我们用优化器编译我们的模型:
    : {0 w0 @3 u' ?9 e. g; n  m0 }+ c" g2 d: B
    #compiling the ANN; c( _& `  x2 U7 h; F# d6 Y  b, _- ~
    classifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    / H- B# w+ Y8 @3 m
    " J+ s1 h' i0 a! V1 m! c3 D6 k将 ANN 拟合到训练数据中' R) \$ ?, L6 C$ A, i6 P* S9 ^: |$ ~
    编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
    4 ^3 U; h/ K6 u+ w
    5 s& ]- m' J$ m8 o #fitting the ANN to the training set
    5 Y+ J9 h! O- F4 R" B. a$ y3 wmodel = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
    3 M. s4 K# k- L, @ ) W/ V  w3 x6 \! N) K

    5 A& Z: ~$ Q! _2 u! y8 T7 I% _it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    + ?# ?, V9 I2 [! Z# T# d- j* J  X  V% s7 ~5 n% D5 m5 p
    在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:7 G. f# Y0 Z/ i: R

    : N  ^9 \& l) y#now testing for Test data3 ^7 U1 r' z9 {" ^
    y_pred = classifier.predict(test), B, f* l0 k8 ]& {# Z5 c: l

    / W( B: {2 E% e/ w7 }5 @* P8 d在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    : b7 n. a; g/ v1 ]6 ]
    & c7 ^, M& P9 q% S: S4 H! `. h#converting values. {) s4 d! A+ e* B: Y
    y_pred = (y_pred>0.5)
    0 ]6 o5 k/ i# H1 S. x- g3 [, V* d6 bprint(y_pred)  G* f' |. F$ m

    8 X: |0 j4 U) u8 N( ?2 y2 j) S$ r( |* N+ b: E( [/ c
    6 k5 {- W$ o4 \9 e% ]  u! r6 f  ?
    分数和混淆矩阵3 ^1 L1 p! O2 N; o  ]5 V+ W+ w
    现在我们检查混淆矩阵和预测值的分数。8 g& M$ W. m3 T4 r- j" i' }
    . N: |' E3 r4 N, n5 M
    from sklearn.metrics import confusion_matrix0 \% z7 C7 y- T* [
    from sklearn.metrics import accuracy_score8 R- G( _2 ?0 B! ]3 ]! I* E
    cm = confusion_matrix(ytest,y_pred)! T  C9 I4 N: s7 R
    score = accuracy_score(ytest,y_pred)
    " T+ T% X! ~# k8 v. L$ Sprint(cm)
    3 M4 f7 P- {. U6 }print('score is:',score)
    # i" k9 r  E: u* v5 J) h
    - Z# d( f8 ^( X4 k! B& a输出:
    $ g6 H* e% v- A: n8 r1 J/ ]% Q# W1 \2 X, R+ r0 q
    / ^' m# c6 f: E+ {  o; y4 D

    8 s1 B) g: C* C) u6 S) @- W! B8 x可视化混淆矩阵; ~- r2 ?2 @$ J- a4 M9 E1 U
    在这里,我们可视化预测值的混淆矩阵
    1 W& {! d" m! N5 j: T& f- K3 {9 z3 ~  x5 v  ^2 t+ Q) K1 C2 B
    # creating heatmap of comfussion matrix
    ( p: s( ]4 t7 K- ^# Z6 _% c! cplt.figure(figsize=[14,7])$ `7 d, l# I( R& F
    sb.heatmap(cm,annot=True)2 V% B" a7 S0 E1 R
    plt.show()6 _6 s. f6 o# a

    6 X- Z7 g# P5 Y2 L( _
    0 g; N. R1 G% J1 _5 g+ P4 O: W% c( a5 W* n" F
    可视化数据历史$ D4 k5 w5 J7 O; }$ E
    现在我们可视化每个时期的损失和准确性。# u" e. e9 G3 C$ N7 U6 e

    6 E' n. G1 i+ l% Z# list all data in history
    - |, D7 I' J% V; q3 j  Sprint(model.history.keys())
    1 M, x8 T" H, C. s# summarize history for accuracy
    , U4 @9 m1 L1 O1 i1 _' ?" M( _& mplt.plot(model.history['accuracy'])
    " ~0 C% ~' y- a5 u0 |& e0 Aplt.title('model accuracy')
    * n9 E- F: c- x1 Pplt.ylabel('accuracy')/ S' ~7 @3 B) M2 |. B6 r6 M
    plt.xlabel('epoch')& K2 j) h: u/ w1 s6 ~1 x
    plt.legend(['train', 'test'], loc='upper left')1 s! n$ ~8 i: E- k; \% p
    plt.show()' D4 v/ U8 w9 ^

    / F" m- O5 b* W/ J! h& ?9 B1 n, ]1 ]: n+ y2 n
    6 Q3 D3 U3 Y& R0 S& r# l0 Q4 `( i0 ?$ M
    , ~% ^1 R; s4 p4 s. T# G- I6 E
    # summarize history for loss- t2 `  w/ B9 B5 W4 W/ G
    plt.plot(model.history['loss'])$ j0 S" y/ u, F
    plt.title('model loss')9 H1 a/ R2 l3 K0 C& b
    plt.ylabel('loss')
    / T7 V9 `# }7 Uplt.xlabel('epoch')
    + A# j) U4 a7 \plt.legend(['train', 'test'], loc='upper left')7 B' F& X& X, L7 O1 s) b/ K
    plt.show()4 ~0 j5 ~5 l5 M# V' Y' D+ j% v8 q: g5 g

      V- A; y& e" Q( l; N3 P; H2 T$ i5 z" ]: u: Z. T' p
    0 ~/ [, h' n/ I' K& q0 D
    保存模型

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

    • 5 ^# l3 `! d( _3 O3 ?& g8 s. C
      " f6 h, k" t0 Q1 U
      #saving the model
      7 n  Z6 {$ d; l
      7 t5 D  L; a# r& K
    • 7 P  q# F$ ?% V8 M1 l
      $ _3 V3 P7 k7 O2 T) d
      classifier.save('File_name.h5')
      ) W2 \& j2 [+ o, v

      , d, w3 l' u4 N( _

    • * Q& C1 ~" _+ Y' a/ g3 n. z1 }  H6 `" k7 [  w' }4 J, `% x

    2 m3 o) w8 }, c, y9 V2 s7 v- t% d! ?: P; s: Q4 x
    + a+ r+ Y" L( p, j
    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-4-27 03:02 , Processed in 0.314289 second(s), 51 queries .

    回顶部