QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-15 17:10 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    使用乳腺癌数据集的人工神经网络人工神经网络. o7 M+ C- `" y; t% Y
    顾名思义,人工神经网络,就是人工神经元的网络。它指的是模仿大脑的生物启发模型。可以说,构建人脑结构的通常是基于生物神经网络的计算网络。
    ) }2 t* j6 V1 Y* F
    2 e- ]  ?1 N( `2 m6 e大家都知道,在我们的大脑中,神经元是相互连接和传递数据的过程。它类似于人脑神经元之间相互连接,神经网络由大量人工神经元组成,称为按层顺序排列的单元。具有各层神经元并形成一个完整的网络。这些神经元被称为节点。$ y8 R: ?8 J. T

    ( a& R: W' _3 C. s7 g, q1 C, h( e它由三层组成,分别是:5 f1 h% \. ]+ j/ o& A

    2 r9 m7 |$ D" a7 `输入层1 w) u% k& z1 L2 z* Y! n

    , _1 N5 @  |. B隐藏层3 z+ a0 N# o4 `. k

    9 ~# F) O* P) y: d# O& g3 V/ E% ?输出层7 ~7 ?' w+ T- F$ {% l

    4 R. F5 n$ v# [" f7 v! Y! r& F( E; |1 u0 `2 ]( h6 }. ~7 s- P% J
    使用乳腺癌数据集创建ANN0 a' c) H8 Q2 ]0 e6 v
    现在我们进入我们的主题,这里我们将采用数据集,然后创建人工神经网络并对诊断进行分类。* D5 U2 ~) A! l% ?( j

    3 f& Z' s% X9 m! k6 L, y& [首先,我们采用乳腺癌的数据集,然后继续前进。
    1 s' W  e0 w' \( f/ F
    " H; a" q( O; w乳腺癌数据集:https://www.kaggle.com/uciml/breast-cancer-wisconsin-data0 {' C' C, {( E) u, X, N9 h
    " I6 q% L4 [$ K+ ]- t9 D
    下载数据集后,我们将导入所需的重要库。
    1 M. F; X) k  F; W: Z4 j! W& j$ w& H
    导入库& W+ {2 H# J0 Y1 V4 {6 t  s
    #import pandas9 s# @; z5 x2 J! ~* K* S/ \
    import pandas as pd
    3 D" J. r9 R1 N5 k) ~. C#import numpy
    6 e! l1 ?, D; {import numpy as np
    8 c& V5 C. ]6 L% v( @import matplotlib.pyplot as plt& u* k* a! Y+ p0 q
    import seaborn as sb/ n) S1 v9 X  R7 L
    这里我们导入了 pandas、NumPy 和一些可视化库。
    # |6 t+ Y! ?/ ~; i

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


    " G7 o$ i. R: X+ z" h) Q) m: [df = pd.read_csv('Breast_cancer.csv')
    . u% d; L' }/ M  z. A' ^! d& Gdf
    5 _* X. m2 Y1 N2 t  y: W4 u% X3 }
    ! t0 h: B  y* U  d) S5 \' ^9 Y0 P" W; G4 J7 _  E
    在此数据集中,我们指向**“diagnosis”**特征列,因此我们使用 Pandas 检查该列的值计数:
    5 p5 O2 @! D$ _! Q1 w
    7 i  T+ u* P4 I( u# counting values of variables in 'diagnosis'1 `' z9 C7 ]3 O2 X& m
    df['diagnosis'].value_counts()
    0 o& x2 }5 a' K- R
    " k; h' A4 h# G$ d5 F
    / s9 R$ @: g$ v- R

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

    可视化值计数
    ; w% o% k& _& Kplt.figure(figsize=[17,9])
    0 u+ [, s  N. v  isb.countplot(df['diagnosis'].value_counts())+ I+ e3 J4 `6 {+ f4 C
    plt.show()
    ! F* ?8 i, M5 v   {( E4 z; I/ }9 x3 H

    6 G9 V; D3 U* \1 w$ G* X; h# e) B1 N9 B空值

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


    . M) i8 U+ I8 l8 a; Q6 r6 P$ Rdf.isnull().sum()
    : ]: x# A, A. Z, F- t7 l 执行程序后,我们得出结论,特征名称“Unnamed:32”包含所有空值,因此我们删除该列。  b* c" W. G' C' T6 C

    # e: G/ N% P* e* R#droping feature$ i/ S. _* ]5 G: B- o
    df.drop(['Unnamed: 32','id'],axis=1,inplace=True)/ C1 V% ~) y  O' Z
    2 R, f# y" i% R; ^; t. W
    自变量和因变量

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


    2 v0 T# ^" |' }$ t& N/ ]: ~4 z# independent variables, }+ b1 h5 ~. A* m, X
    x = df.drop('diagnosis',axis=1)
    / o2 F/ ^: D: b+ r. t" g#dependent variables$ W4 S$ @, z( V  [; Q# ]( I. o# E+ U
    y = df.diagnosis
    1 S0 |' F5 p8 t" e4 c+ r 处理分类值* v0 B- r2 M/ d& j! M, r- E
    当我们打印因变量y 时,我们看到其中包含分类数据,我们必须将分类数据转换为二进制格式以进行进一步处理,因此我们使用 Scikit learn Label Encoder 对分类数据进行编码。
    ; T0 p- c4 f7 V' f7 `" r. s4 M6 p$ j5 k+ M2 c- o: p
    from sklearn.preprocessing import LabelEncoder& ]- T8 X9 L; J8 a- U
    #creating the object
    ( E( B0 i" B' H- olb = LabelEncoder()
    2 j4 f3 u( S3 U+ H' by = lb.fit_transform(y)
    6 b  N9 c! s; f8 M3 \" f8 ]! }- n6 u( i+ g0 A. T! @6 s
    拆分数据
    5 l: }$ }& @( b" L# U现在是时候将数据拆分为训练和测试部分了:( _8 X9 O5 W8 U; C7 b- U: z! |

    ; g7 W' ^7 O( ~/ ]from sklearn.model_selection import train_test_split  Z+ V9 ^  r7 N8 h
    xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=40)! p8 a0 ]9 i1 Q# y) v5 ^/ m

    " O2 w3 |4 R' g# S缩放数据
    2 ?; e, l( B: D! _- g当我们创建人工神经网络时,我们必须将数据缩放为更小的数字,因为深度学习算法将节点的权重和输入数据相乘,这需要大量时间,因此为了减少该时间,我们缩放数据。7 l/ O5 x! l" h, r: D! [) w! V. [; E
    8 A2 \. D; L: W" \# D
    对于缩放,我们使用 scikit learn StandardScaler模块,我们缩放训练和测试数据集:5 A( I; n4 ~! E9 s
    5 O* k4 a4 ^6 |
    #importing StandardScaler
    # F( z1 v6 v, c# Cfrom sklearn.preprocessing import StandardScaler" {( H6 O2 E- P# _3 U
    #creating object
    2 Y5 g$ J  i* _. Dsc = StandardScaler(). u- T5 _" `$ n- g! R
    xtrain = sc.fit_transform(xtrain)
    . [1 U6 e4 o& ~9 e' ]  ]6 V/ I! |xtest = sc.transform(xtest)
    & x  s; ~6 m. J1 W" V/ F3 O- G3 D7 G' e
    从这里我们开始创建人工神经网络,为此我们导入用于创建 ANN 的重要库:
    % \( o3 h6 q% x0 V4 Q$ }0 U' i! o7 d: M  S
    #importing keras
    ' r$ X+ F* \, B" ^import keras4 ^( s; b. s  \+ R: I: u. I$ t
    #importing sequential module
    - L7 P+ `% x+ Ofrom keras.models import Sequential
    0 ]  Y  l5 @( k- Y# import dense module for hidden layers$ S6 ~) c6 F: e- ~% z% s
    from keras.layers import Dense8 m& r6 E  I7 l( M$ j0 F2 n9 l% ~
    #importing activation functions
    . @0 G- z3 q9 R5 m6 `from keras.layers import LeakyReLU,PReLU,ELU
    ( M" F* _  b3 q+ x7 a4 U! ifrom keras.layers import Dropout5 F, ]* |: e; W' H+ W
    : W) A, I& D  b. D) |1 E  n
    创建层+ L3 j. o. F2 a! {# k9 N- Z
    导入这些库后,我们创建了三种类型的层:
    0 }+ D, s  U. E  C/ ]  s' p" `* W& h& }$ D1 Z( l/ S+ L
    输入层2 d' g$ E+ d3 z# n
    1 J3 @+ u+ e- J. r% \$ [! n
    隐藏层& P  ~( ^( y2 b7 ~: }0 X

    % a3 I( V( R3 J2 |& x6 X输出层
    % _( Q7 v* k5 }+ ?! j# I
    : P* q$ d/ l" L: f# P首先,我们创建模型:
    5 ^* k6 d' b0 l
    * b3 J# S, o9 V- M5 \#creating model7 {" w) e5 e/ X+ h; p' O
    classifier = Sequential()
    3 G( w! Q) J! l# P
    7 X- N6 ~5 n& u1 I- @Sequential模型适用于每一层恰好有一个输入张量和一个输出张量的平面堆栈。
    & h8 k; z$ B8 R5 a, I' _0 j- u4 W7 `8 V* b% [- a
    现在我们创建神经网络的层:- g/ \- _& ^! e3 `, p) r7 ~

    6 H- ^( i. V. l/ W$ T8 V( w4 B+ y#first hidden layer" Q' t. y1 {$ Y( D& J) n6 P  F9 r
    classifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu',input_dim=30))2 {2 t4 `9 d3 I5 C- u( u! Z9 D: V
    #second hidden layer
    - |; a9 }5 b5 ?9 y$ \4 r$ `, H  hclassifier.add(Dense(units=9,kernel_initializer='he_uniform',activation='relu'))7 Q* u, v& k3 `7 D% K
    # last layer or output layer
    0 a# R$ H6 d9 P5 {& {4 K! iclassifier.add(Dense(units=1,kernel_initializer='glorot_uniform',activation='sigmoid')), G; N- W3 d+ x0 e

    + D# v+ |+ Z) A3 k在以下代码中,使用 Dense 方法创建图层,因为我们使用基本参数。
    8 ]# R1 D0 W& W% e$ F# x
    / }7 |* l2 Q) s# c% P* n- C第一个参数是输出节点+ i: a" _% }. O$ L9 a" y

    ) f& G9 y5 f  ~  F0 H第二个是内核权重矩阵的初始化器2 e8 g% p+ C; A" E  K/ F  K
    6 I' h3 I/ K9 h
    第三个是激活函数+ p( p3 W+ f) M

    5 K! g7 R* x; ^% d( k/ h最后一个参数是输入节点或独立特征的数量。
    % K8 Y+ d6 G( z6 ~& B  K! ^4 \& S+ Q6 s- X  @
    执行此代码后,我们使用以下方法对其进行总结:
    4 j& P- p# {" N+ B, J2 f1 O/ S#taking summary of layers- {/ c2 ~7 R; d
    classifier.summary()
    + ?2 y/ b! u' k8 I3 }7 P
    " f5 D4 y5 W/ U/ B  x# S: m" a4 e" e/ k* X1 @: ~& k4 ^1 [5 V5 y+ L
    编译人工神经网络; Q# x" ?4 Y7 w1 ^$ w8 g6 v
    现在我们用优化器编译我们的模型:
    - }& `- o/ |( g% \; O3 U: S; t/ Z# }4 v9 w
    #compiling the ANN
    7 d+ ]6 S. N& C/ ~! V* Hclassifier.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
    * A  ?' S- w3 [2 n
    3 W0 O3 b0 R4 C  ]2 R$ P将 ANN 拟合到训练数据中
    # }, ~% a& {( g8 e编译模型后,我们必须将 ANN 拟合到训练数据中以进行预测:
    5 E5 [/ j: `' Q/ J- c8 d3 d6 L% \$ d2 k# p
    #fitting the ANN to the training set# p7 |3 ^# C& {
    model = classifier.fit(xtrain,ytrain,batch_size=100,epochs=100)
    & O2 p& [0 s2 V 7 N- `$ ?' _+ @# M
    , D8 z" n7 `( v' z. i
    it()方法将神经网络与训练数据进行拟合,在参数中设置batch_size、epochs等变量的具体值。
    & J1 u) J5 t& m2 u( p% Q2 A# s- t3 c
    在训练数据之后,我们还要对测试数据的准确性评分进行测试,如下所示:+ N. }" \9 F4 ~2 m, K
    2 J3 r" F' u7 Z# V7 X
    #now testing for Test data7 W: H# ]$ H, b) U& k& Y$ N* y% d
    y_pred = classifier.predict(test)
    4 I9 p% G7 l+ |$ C: t
    7 E9 U, E" @5 p- Q; b4 A在执行此代码时,我们发现 y_pred 包含不同的值,因此我们将预测值转换为阈值,如True, False。
    2 T' M7 Z7 D1 b- X  l: H# Z+ J, s
    0 v; h7 J* I. @' J" R#converting values
    , X7 z$ z+ W, Z1 V( \  a1 ry_pred = (y_pred>0.5)! e8 L; c5 n$ M5 c1 E1 V9 P1 @
    print(y_pred)3 |1 y7 w$ \. {8 y# L4 e

    & n- J4 K, d$ E: g/ N3 x
    , V, H! J7 T9 ?% h3 ]5 [3 _2 A2 U: U! a4 B) o
    分数和混淆矩阵
    / M; `9 N% U6 c8 h5 ^' I. ]现在我们检查混淆矩阵和预测值的分数。
      q: }( H+ U7 z7 r; Y! ]+ `* g% P3 }
    from sklearn.metrics import confusion_matrix# G$ S! V& l" v: i; C* u
    from sklearn.metrics import accuracy_score
    ( m0 V$ y3 M8 O  F4 ]& }- r" scm = confusion_matrix(ytest,y_pred)
    % f) X1 `! f0 S  x) y! w' d! vscore = accuracy_score(ytest,y_pred)5 b0 D/ e# m8 J3 s8 {
    print(cm)
    ' C( v/ G/ |; \# T5 M% Cprint('score is:',score)
    8 V2 T6 I. |! |6 c& e( |9 |% Q' u7 B; P+ Q' t5 h# T
    输出:5 B: p' n5 o8 S" c
    & P/ O4 |' u; O/ W3 F: d" p! j
    . n+ Q. p6 _# z5 X

    3 V8 b5 O% a9 @6 Q. R可视化混淆矩阵
    , z. k3 i. J; T% `3 z在这里,我们可视化预测值的混淆矩阵, @% O8 d4 v# x( C2 f' o) k- E

    : b/ Y' f* ?# c( t2 M1 D# creating heatmap of comfussion matrix) b  o9 S) l' `$ u6 ?; e/ T
    plt.figure(figsize=[14,7])* R1 y/ k/ q2 ~
    sb.heatmap(cm,annot=True)
    6 _( T8 M" c: p+ y' b, }plt.show()
    ' b* e* _) ~% T/ L8 y6 {: y
    % y; v  P. [5 f* m  }4 }; q
    6 L8 M- Q& J$ r; W; ^, A
    + Z& E+ ^4 t* b9 k* Y可视化数据历史  H) ~8 \5 N  a$ g* A
    现在我们可视化每个时期的损失和准确性。
    , E' e) h) ^5 h8 \
    & f. V- `  b2 `# list all data in history
    3 l1 k# t! v# ^$ i3 a; c3 Cprint(model.history.keys()). H; p7 J- ], m+ q0 ^  k
    # summarize history for accuracy
    : @1 M+ |$ W1 T# Fplt.plot(model.history['accuracy'])" ^$ ^, n# H, @' X2 _" k2 m; X
    plt.title('model accuracy')
    " I7 A( s$ h! q0 f" [plt.ylabel('accuracy')
    + T2 t1 V% m5 X8 N$ b6 Qplt.xlabel('epoch')6 U& k6 [% y* S# D5 o
    plt.legend(['train', 'test'], loc='upper left')* `# u1 q. K6 p/ s9 p/ c
    plt.show()" s4 p- ]$ C" J& t: ~) c

    / w  C- z8 x  w& b0 O8 F1 L8 g, q
    1 u2 ^7 d! i7 B4 v, X  A' m3 E6 ~# Z3 @" d9 j/ S; g
    6 J+ r$ |0 ?" i0 Q
    # summarize history for loss& R6 Q2 M: v0 d: u
    plt.plot(model.history['loss'])9 S5 T( R1 b8 ^, C% ]
    plt.title('model loss')9 V2 g" c" D) C6 R. C+ v$ j
    plt.ylabel('loss')
    , z! f' @  `% d( i6 yplt.xlabel('epoch')
    ; t2 V. R7 H) O: C1 O" Yplt.legend(['train', 'test'], loc='upper left')! m- N+ {8 a) Z1 n
    plt.show()
    5 L6 i) u7 }/ I. C. q' S/ V0 I+ q% g
    9 Q4 d. B; ~3 b8 V
    $ _5 n- b5 n8 u* D; K  b+ z' L# h& U8 e
    保存模型

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

    • 8 g3 D. {! p# e2 a) _6 [
      & K0 y/ W4 Z% A7 Z  p) x5 N( ^" w
      #saving the model. a( J/ N( ^* r9 g1 @# [# S

      * l4 z7 b- U! n! p

    • 6 D; B; e8 E5 |; ]! U
        h( M9 j% O- ?2 B5 f
      classifier.save('File_name.h5')
      " [3 {8 I  ^- U0 N
      , g# N. w) E8 k8 f; b8 ]( B

    • & L+ J* R* s4 U$ b0 Z) d# E' u/ ^9 s7 U! Y+ u

    9 e, L6 P& p: i9 S% _8 W" ^( F
    9 |' _" X: a8 g% c% R, ]: [) K
    ; p1 [+ H( n0 s8 M+ |( G! 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-24 13:31 , Processed in 0.439624 second(s), 51 queries .

    回顶部