日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习识别乳腺癌

發(fā)布時間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习识别乳腺癌 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡介

人工神經(jīng)網(wǎng)絡(luò)是一種類似于大腦神經(jīng)突觸連接的結(jié)構(gòu)進(jìn)行信息處理的數(shù)學(xué)模型,由大量的輸入層節(jié)點、隱藏層節(jié)點和輸出層節(jié)點連接構(gòu)成。有關(guān)神經(jīng)網(wǎng)絡(luò)算法最核心的三個問題就是:選擇激活函數(shù)、隱藏層數(shù)目和節(jié)點的確定以及權(quán)重的設(shè)置。

  • 其中最為常用的是Logistic激活函數(shù)、雙曲正切激活函數(shù)和高斯激活函數(shù),R中一般默認(rèn)使用Logistic激活函數(shù)。通常情況下,激活函數(shù)的輸出信號值范圍可以是(0,1)、(-1,1)、(-∞,∞),而輸入信號之和的范圍可以是(-∞,∞),如果仔細(xì)看圖的話,會發(fā)現(xiàn)隨著輸入信號之和的絕對值越大,輸出信號值始終為0或1或-1,這樣的結(jié)果將會失真。所以一般需要將輸入信號X變量壓縮到0附近,通常的做法是數(shù)據(jù)標(biāo)準(zhǔn)化,以下自定義標(biāo)準(zhǔn)化函數(shù):
standard1 <- function(x){(x-min(x))/(max(x)-min(x)) } standard2 <- function(x){(x-mean(x))/sd(x) }
  • 前一種是最大最小標(biāo)準(zhǔn)化,后一種是標(biāo)準(zhǔn)正態(tài)化。如果數(shù)據(jù)集基本服從正態(tài)分布的話,可以考慮使用后一種標(biāo)注化方法;否則就使用前一種標(biāo)準(zhǔn)化方法。

  • 選擇隱藏層數(shù)目和節(jié)點數(shù)量
    如上文中的神經(jīng)網(wǎng)絡(luò)圖所示,只有1層隱藏層,稱其為單層網(wǎng)絡(luò),單層網(wǎng)絡(luò)一般可用于基本的模式分類,特別是可用于能夠線性分割的模式,但實際中往往需要更多的隱藏層,目前多層前饋網(wǎng)絡(luò)已成為人工神經(jīng)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的事實標(biāo)準(zhǔn)。多層隱藏層的神經(jīng)網(wǎng)絡(luò)圖:

  • 除了隱藏層數(shù)目可以改動,其每層的節(jié)點數(shù)量也可以靈活的改變,對于節(jié)點數(shù)量的選擇可以通過循環(huán)測試,最終挑選出比較理想的節(jié)點數(shù)量。
    一般情況下,隨著隱藏層數(shù)目和節(jié)點數(shù)量的增加,使神經(jīng)網(wǎng)絡(luò)顯得尤為復(fù)雜,實現(xiàn)復(fù)雜問題的學(xué)習(xí),但是這樣的模型會產(chǎn)生過擬合的風(fēng)險,而且計算量的增加導(dǎo)致訓(xùn)練緩慢。

  • 權(quán)重的設(shè)置
    通過調(diào)整連接權(quán)重訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的計算量非常巨大,因此很少將其應(yīng)用到真實世界的學(xué)習(xí)任務(wù)中。幸運(yùn)的是,一種有效的訓(xùn)練人工神經(jīng)網(wǎng)絡(luò)的方法被發(fā)現(xiàn),其可以解決權(quán)重的設(shè)置的問題,該算法使用了一種后向傳播誤差的策略(Backpropagation)。

神經(jīng)網(wǎng)絡(luò)算法優(yōu)缺點

  • 優(yōu)點:
    1)適用于分類和數(shù)值預(yù)測問題
    2)對數(shù)據(jù)幾乎不作任何假設(shè)條件
  • 缺點:
    1)計算量大、訓(xùn)練緩慢,尤其是網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)相當(dāng)復(fù)雜時
    2)容易發(fā)生過擬合
    3)輸出結(jié)果很難解釋

有關(guān)R中神經(jīng)網(wǎng)絡(luò)算法的實現(xiàn)可以使用自帶的nnet包,也可以使用neuralnet包,還可以使用一套完整的神經(jīng)網(wǎng)絡(luò)功能包RSNNS。

nnet包中的函數(shù)nnet()語法: nnet(formula, data, weights, ...,subset, na.action, contrasts = NULL)nnet(x, y, weights, size, Wts, mask,linout = FALSE, entropy = FALSE, softmax = FALSE,censored = FALSE, skip = FALSE, rang = 0.7, decay = 0,maxit = 100, Hess = FALSE, trace = TRUE, MaxNWts = 1000,abstol = 1.0e-4, reltol = 1.0e-8, ...) formula:模型的公式表達(dá)形式,類似于y~x1+x2+x3 data:指定要分析的數(shù)據(jù)對象 weights:代表各類樣本在模型中所占比重,默認(rèn)將各類樣本按原始比重建立模型 subset:可提取目標(biāo)數(shù)據(jù)集的子集作為模型的訓(xùn)練樣本 na.action:處理缺失值的方法,默認(rèn)忽略缺失值 x:為輸入的自變量矩陣或數(shù)據(jù)框 y:為輸入的因變量,但必須經(jīng)過class.ind()函數(shù)的預(yù)處理 size指定隱藏層節(jié)點個數(shù),通常為輸入變量個數(shù)的1.2至1.5倍 Wts:設(shè)置初始的權(quán)重,默認(rèn)情況將隨機(jī)產(chǎn)生權(quán)重值 mask:指定哪個參數(shù)需要最優(yōu)化,默認(rèn)全部參數(shù)都需要最優(yōu)化 linout:指定線性輸出還是Logistic輸出,默認(rèn)為Logistic輸出 rang:設(shè)置初始權(quán)重值的范圍[-rang,rang] decay:指模型建立過程中,模型權(quán)重值的衰減精度,默認(rèn)為0 maxit:指定模型的最大迭代次數(shù) RSNNS包中的mlp()函數(shù)--多層前饋網(wǎng)絡(luò) mlp(x, y, size = c(5), maxit = 100,initFunc = "Randomize_Weights", initFuncParams = c(-0.3, 0.3),learnFunc = "Std_Backpropagation", learnFuncParams = c(0.2, 0),updateFunc = "Topological_Order", updateFuncParams = c(0),hiddenActFunc = "Act_Logistic", shufflePatterns = TRUE, linOut = FALSE,inputsTest = NULL, targetsTest = NULL, pruneFunc = NULL,pruneFuncParams = NULL, ...) x:為輸入的自變量矩陣或數(shù)據(jù)框 y:為輸入的因變量 size:指定每個隱藏層的節(jié)點數(shù),默認(rèn)是單層5節(jié)點的拓?fù)浣Y(jié)構(gòu) maxit:指定模型的最大迭代次數(shù) initFunc:指定權(quán)重的初始函數(shù) initFuncParams:權(quán)重的初始值默認(rèn)在(-0.3, 0.3)之間 learnFunc:指定計算神經(jīng)網(wǎng)絡(luò)的算法類型,默認(rèn)為標(biāo)準(zhǔn)后向傳播算法 learnFuncParams:指定學(xué)習(xí)算法參數(shù)的初始值,即學(xué)習(xí)速率和最大輸出誤差 updateFunc:指定替換的算法類型 hiddenActFunc:指定隱藏層的算法類型 linOut:指定輸出層的激活函數(shù),可以是線性或Logistic neuralnet包中的neuralnet()函數(shù)語法 neuralnet(formula, data, hidden = c(1), threshold = 0.01, stepmax = 1e+05, rep = 1, startweights = NULL, learningrate.limit = NULL, learningrate.factor = list(minus = 0.5, plus = 1.2), learningrate=NULL, lifesign = "none", lifesign.step = 1000, algorithm = "rprop+", err.fct = "sse", act.fct = "logistic", linear.output = TRUE, exclude = NULL, constant.weights = NULL, likelihood = FALSE) formula:模型的公式表達(dá)形式,類似于y~x1+x2+x3,不允許y~.的格式 data:指定要分析的數(shù)據(jù)對象 hidden:指定每個隱藏層的節(jié)點數(shù),默認(rèn)是單層1節(jié)點的拓?fù)浣Y(jié)構(gòu) threshold:指定誤差函數(shù)的偏差閾值,默認(rèn)為0.01 stepmax:指定模型的最大迭代次數(shù) rep:指定神經(jīng)網(wǎng)絡(luò)訓(xùn)練的次數(shù) startweights:設(shè)置初始的權(quán)重,默認(rèn)情況將隨機(jī)產(chǎn)生權(quán)重值 learningrate.limit:指定學(xué)習(xí)速率的最小最大值,該參數(shù)僅對RPROP和 GRPROP方法起效 learningrate:可為后向傳播算法指定學(xué)習(xí)速率 algorithm:指定計算神經(jīng)網(wǎng)絡(luò)的算法類型 但該包只能處理連續(xù)型因變量的預(yù)測。

應(yīng)用

本文嘗試使用神經(jīng)網(wǎng)絡(luò)算法對乳腺癌進(jìn)行分類,數(shù)據(jù)來自于《機(jī)器學(xué)習(xí)與R語言》中的案例,數(shù)據(jù)包括569條樣本和32個變量。

#讀取數(shù)據(jù) cancer <- read.csv(file = file.choose()) str(cancer) 除樣本的標(biāo)識號ID以外,diagnosis變量為目標(biāo)變量,其余都是數(shù)值型變量。 #數(shù)據(jù)標(biāo)準(zhǔn)化 cancer_stand <- sapply(cancer[,-c(1,2)], standard1) #數(shù)據(jù)合并 cancer_stand <- as.data.frame(cbind(diagnosis = cancer$diagnosis, cancer_stand)) #將目標(biāo)變量轉(zhuǎn)換為因子 cancer_stand$diagnosis <- factor(cancer_stand$diagnosis, levels = c(1,2), labels = c('B','M'))#構(gòu)建訓(xùn)練樣本集和測試樣本集 set.seed(1234) index <- sample(c(1,2), nrow(cancer_stand), replace = TRUE, prob = c(0.8,0.2)) train <- cancer_stand[index == 1,] test <- cancer_stand[index == 2,]#使用nnet包中的nnet()函數(shù)建模 library(nnet) #通過循環(huán),確定最佳的節(jié)點數(shù) err1 <- 0 err2 <- 0 for (i in 1:45){set.seed(1234)model <- nnet(diagnosis ~ ., data = train, maxit = 300, size = i, trace = FALSE)err1[i] <- sum(predict(model, train, type = 'class') != train$diagnosis)/nrow(train)err2[i] <- sum(predict(model, test, type = 'class') != test$diagnosis)/nrow(test) } plot(err1, type = 'b', col = 'black', lty = 2, lwd = 2, ylab = '誤差', xlab = '節(jié)點數(shù)', ylim = c(0,0.05), pch = 10) lines(err2, type = 'b', col = 'blue', lty = 2, lwd = 2, pch = 23) legend(locator(1), legend = c('訓(xùn)練集誤差率','測試集誤差率'), col = c('black','blue'), lty = c(2,2), lwd = c(2,2), bty = 'n',pch = c(10,23)) 通過返回的圖形結(jié)果,選擇最佳的節(jié)點數(shù)為4#通過循環(huán),確定最大迭代次數(shù) err1 <- numeric() err2 <- numeric() for (i in 1:500){set.seed(1234)model <- nnet(diagnosis ~ ., data = train, maxit = i, size = 4, trace = FALSE)err1[i] <- sum(predict(model, train, type = 'class') != train$diagnosis)/nrow(train)err2[i] <- sum(predict(model, test, type = 'class') != test$diagnosis)/nrow(test) } plot(err1, type = 'l', col = 'black', lty = 1, ylab = '誤差', xlab = '節(jié)點數(shù)') lines(err2, type = 'l', col = 'blue', lty = 4) legend(locator(1), legend = c('訓(xùn)練集誤差率','測試集誤差率'), col = c('black','blue'), lty = c(1,4), bty = 'n') 通過返回的圖形結(jié)果,選擇最大迭代次數(shù)為50#建立最終的神經(jīng)網(wǎng)絡(luò)模型 set.seed(1234) model_nnet <- nnet(diagnosis ~ ., data = train, maxit = 50, size = 4, trace = FALSE) pred_nnet <- predict(model_nnet, test, type = 'class') #預(yù)測精度 Freq_nnet <- table(test$diagnosis, pred_nnet) Freq_nnet accuracy_nnet <- sum(diag(Freq_nnet))/sum(Freq_nnet) accuracy_nnet 模型準(zhǔn)確判斷率超過99%,模型非常完美的刻畫了數(shù)據(jù)。#使用RSNNS包中的mlp()函數(shù)建模 library(RSNNS) #將數(shù)據(jù)順序打亂 data_cancer = cancer[sample(1:nrow(cancer),length(1:nrow(cancer))),2:ncol(cancer)] #定義網(wǎng)絡(luò)輸入 cancerValues= data_cancer[,-1] #定義網(wǎng)絡(luò)輸出,并將數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換 cancerTargets = decodeClassLabels(data_cancer[,1]) #從中劃分出訓(xùn)練樣本和檢驗樣本 set.seed(1234) model_cancer = splitForTrainingAndTest(cancerValues, cancerTargets, ratio=0.20) #數(shù)據(jù)標(biāo)準(zhǔn)化 model_cancer = normTrainingAndTestSet(model_cancer, type = '0_1') #利用mlp命令執(zhí)行前饋反向傳播神經(jīng)網(wǎng)絡(luò)算法 model_mlp = mlp(model_cancer$inputsTrain, model_cancer$targetsTrain, size=4, maxit=100, inputsTest=model_cancer$inputsTest, targetsTest=model_cancer$targetsTest) #利用上面建立的模型進(jìn)行預(yù)測 pred_mlp = predict(model_mlp, model_cancer$inputsTest) #生成混淆矩陣,觀察預(yù)測精度 Freq_mlp <- confusionMatrix(model_cancer$targetsTest,pred_mlp) Freq_mlp accuracy_mlp <- sum(diag(Freq_mlp))/sum(Freq_mlp) accuracy_mlp 模型的預(yù)測能力也非常高,準(zhǔn)確率超過95%,但相比于nnet()函數(shù)準(zhǔn)確率明顯下降。

總結(jié)

以上是生活随笔為你收集整理的机器学习识别乳腺癌的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。