R數(shù)據(jù)分析:用R建立預(yù)測模型

預(yù)測模型在各個(gè)領(lǐng)域都越來越火腿倚,今天的分享和之前的臨床預(yù)測模型背景上有些不同纯出,但方法思路上都是一樣的,多了解各個(gè)領(lǐng)域的方法應(yīng)用敷燎,視野才不會(huì)被局限暂筝。

今天試圖再用一個(gè)實(shí)例給到大家一個(gè)統(tǒng)一的預(yù)測模型的做法框架(R中同樣的操作可以有多種多樣的實(shí)現(xiàn)方法,框架統(tǒng)一尤其重要硬贯,不是簡單的我做出來就行)焕襟。而是要:

eliminate syntactical differences between many of the functions for building and predicting models

數(shù)據(jù)劃分

通常我們的數(shù)據(jù)是有限的,所以首先第一步就是決定如何使用我們的數(shù)據(jù)饭豹,就這一步來講都有很多流派鸵赖。

數(shù)據(jù)比較少的情況下务漩,一般還是將全部數(shù)據(jù)都拿來做訓(xùn)練,盡可能使得模型的代表性強(qiáng)一點(diǎn)它褪,但是隨之而來的問題就是沒有樣本外驗(yàn)證饵骨。上文寫機(jī)器學(xué)習(xí)的時(shí)候提到,樣本外驗(yàn)證是模型評(píng)估的重要一步茫打,所以一般還是會(huì)劃分?jǐn)?shù)據(jù)居触。個(gè)人意見:好多同學(xué)就200多個(gè)數(shù)據(jù),就別去劃分?jǐn)?shù)據(jù)集了老赤,全用吧轮洋,保證下模型效度。

我現(xiàn)在手上有數(shù)據(jù)如下:

[圖片上傳失敗...(image-59c252-1661865851360)]

這是一個(gè)有4335個(gè)觀測1579個(gè)變量的數(shù)據(jù)集抬旺,我現(xiàn)在要對(duì)其切分為訓(xùn)練集和測試集弊予,代碼如下:

inTrain <- createDataPartition(mutagen, p = 3/4, list = FALSE)
trainDescr <- descr[inTrain,]
testDescr  <- descr[-inTrain,]

trainClass <- mutagen[inTrain]
testClass  <- mutagen[-inTrain]

代碼的重點(diǎn)在createDataPartition,這個(gè)函數(shù)的p參數(shù)指的是訓(xùn)練集的比例开财,此處意味著75%的數(shù)據(jù)用來訓(xùn)練模型汉柒,剩下的25%的數(shù)據(jù)用來驗(yàn)證。使用這個(gè)函數(shù)的時(shí)候要注意一定是用結(jié)局作為劃分的依據(jù)床未,比如說我現(xiàn)在做一個(gè)死亡預(yù)測模型竭翠,一定要在生存狀態(tài)這個(gè)變量上進(jìn)行劃分,比如原來數(shù)據(jù)中死亡與否的占比是7:3薇搁,這樣我們能保證劃分出的訓(xùn)練集死亡與否的占比依然是7:3斋扰。

數(shù)據(jù)劃分中會(huì)有兩個(gè)常見的問題:一是zero-variance predictor的問題,二是multicollinearity的問題啃洋。

第一個(gè)問題指的是很多的變量只有一個(gè)取值传货,不提供信息,比如變量A可以取y和n宏娄,y占90%n占10%问裕,劃分?jǐn)?shù)據(jù)后訓(xùn)練集中有可能全是y,此時(shí)這個(gè)變量就沒法用了孵坚。為了避免這個(gè)問題我們首先應(yīng)該排除數(shù)據(jù)集中本身就是單一取值的變量粮宛,還有哪些本身比例失衡的變量,可以用到nearZeroVar函數(shù)找后進(jìn)行刪除卖宠。

第二個(gè)問題是共線性巍杈,解決方法一個(gè)是取主成分降維后重新跑,另一個(gè)是做相關(guān)扛伍,相關(guān)系數(shù)大于某個(gè)界值后刪掉筷畦,可以用到findCorrelation函數(shù)。

下面的代碼就實(shí)現(xiàn)了去除zero-variance predictor和相關(guān)系數(shù)大于0.9的變量:

isZV <- apply(trainDescr, 2, function(u) length(unique(u)) == 1)
trainDescr <- trainDescr[, !isZV]
testDescr  <-  testDescr[, !isZV]

descrCorr <- cor(trainDescr)
highCorr <- findCorrelation(descrCorr, 0.90)

trainDescr <- trainDescr[, -highCorr]
testDescr  <-  testDescr[, -highCorr]
ncol(trainDescr)

運(yùn)行上面的代碼之后我們的預(yù)測因子就從1575個(gè)降低到了640個(gè)刺洒。

接下來對(duì)于模型特定的預(yù)測算法鳖宾,比如partial least squares, neural networks and support vector machines吼砂,都是需要我們將數(shù)值型變量中心化或標(biāo)準(zhǔn)化的,這個(gè)時(shí)候我們需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理鼎文,需要用到preProcess函數(shù)渔肩,具體代碼如下:

xTrans <- preProcess(trainDescr)
trainDescr <- predict(xTrans, trainDescr)
testDescr  <- predict(xTrans,  testDescr)

在preProcess函數(shù)中,可以通過method參數(shù)很方便地對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行插補(bǔ)漂问,中心化赖瞒,標(biāo)準(zhǔn)化或者取主成分等等操作女揭,我愿稱其為最強(qiáng)數(shù)據(jù)預(yù)處理函數(shù)蚤假。

建模與調(diào)參

建模是用train函數(shù)進(jìn)行的,caret提供的預(yù)測模型建立的統(tǒng)一框架的精髓也在train函數(shù)中吧兔,我們想要用各種各樣的機(jī)器學(xué)習(xí)算法去做預(yù)測模型磷仰,就只需要在train中改動(dòng)method參數(shù)即可,并且我們能用的算法也非常多境蔼,列舉部分如下:

[圖片上傳失敗...(image-291968-1661865851360)]

另外一個(gè)值得注意的參數(shù)就是trControl灶平,這個(gè)參數(shù)可以用來設(shè)定交叉驗(yàn)證的方法:

trControl which specifies the resampling scheme, that is, how cross-validation should be performed to find the best values of the tuning parameters

[圖片上傳失敗...(image-1a4c50-1661865851360)]

比如我現(xiàn)在需要訓(xùn)練一個(gè)logistics模型(大家用的最多的),我就可以寫出如下代碼:

default_glm_mod = train(
  form = default ~ .,
  data = default_trn,
  trControl = trainControl(method = "cv", number = 5),
  method = "glm",
  family = "binomial"
)

在上面的代碼中箍土,我們?cè)O(shè)定了4個(gè)重要的參數(shù):

一是模型公式form逢享,二是數(shù)據(jù)來源data,三是交叉驗(yàn)證方法吴藻,這兒我們使用的是5折交叉驗(yàn)證瞒爬,四是模型算法method。

我現(xiàn)在要訓(xùn)練一個(gè)支持向量機(jī)模型沟堡,代碼如下:

bootControl <- trainControl(number = 200)
svmFit <- train(
                trainDescr, trainClass,
                method = "svmRadial",
                trControl = bootControl,
                scaled = FALSE)

上面的代碼運(yùn)行需要一點(diǎn)時(shí)間侧但,我們是用自助抽樣法,抽樣迭代次數(shù)200次航罗,也就是抽200個(gè)數(shù)據(jù)集禀横,所以比較耗時(shí)。

支持向量機(jī)是有兩個(gè)超參的sigma和C粥血,上面的結(jié)果輸出中每一行代表一種超參組合柏锄,通過上圖我們可以看到不同的超參組合下模型的表現(xiàn)

[圖片上傳失敗...(image-469a05-1661865851359)]

其中有一致性系數(shù)Kappa,如果我們的結(jié)局是十分不平衡的复亏,這個(gè)Kappa就會(huì)是特別重要的評(píng)估模型表現(xiàn)的一個(gè)指標(biāo)

Kappa is an excellent performance measure when the classes are highly unbalanced

我們發(fā)現(xiàn)超參取0.00137和2趾娃,模型會(huì)表現(xiàn)得更好,這個(gè)也成為我們的finalmodel蜓耻。

預(yù)測新樣本

模型目前已經(jīng)訓(xùn)練好了茫舶,我們可以用訓(xùn)練好的最好的模型finalmodel來預(yù)測我們的測試集,進(jìn)而評(píng)估模型表現(xiàn)刹淌。預(yù)測新樣本的代碼如下:

predict(svmFit$finalModel, newdata = testDescr)

有時(shí)候我們會(huì)訓(xùn)練不同算法的多個(gè)模型饶氏,比如一個(gè)支持向量機(jī)模型讥耗,另外一個(gè)gbm模型,這個(gè)時(shí)候使用predict也可以方便的得到多個(gè)算法的預(yù)測結(jié)果疹启,只需要將模型放在一個(gè)list中即可古程。

另外還有extractProb和extractPrediction兩個(gè)函數(shù),extractPrediction可以很方便地從預(yù)測模型中提出預(yù)測值喊崖,extractProb可以提出預(yù)測概率挣磨。

評(píng)估模型表現(xiàn)

對(duì)于分類問題,我們可以用confusionMatrix很方便地得到下面的模型評(píng)估指標(biāo):

[圖片上傳失敗...(image-123ec7-1661865851359)]

還有要報(bào)告的ROC曲線:

svmROC <- roc(svmProb$mutagen, svmProb$obs)

[圖片上傳失敗...(image-c1debc-1661865851359)]

aucRoc則可以幫助我們快速地得到曲線下面積荤懂。

對(duì)于回歸問題茁裙,評(píng)估模型表現(xiàn)的時(shí)候就沒有所謂的accuracy and the Kappa statistic了,我們關(guān)心R2节仿,plotObsVsPred可以方便地畫出實(shí)際值和預(yù)測值的走勢晤锥,關(guān)心rmse和mae,calc_rmse函數(shù)可以幫助計(jì)算rmse廊宪,get_best_result函數(shù)可以輸出R方等指標(biāo)矾瘾。

預(yù)測因子選擇

預(yù)測因子的重要性作圖,有時(shí)候我們的數(shù)據(jù)變量很多箭启,或者叫維度很多壕翩,從而導(dǎo)致維度災(zāi)難,好多的預(yù)測因子其實(shí)并不能給模型提供信息傅寡,預(yù)測因子的選擇則是要在盡量使得模型精簡的情況下不損害模型的表現(xiàn)放妈。

varImp可以幫助我們查看各個(gè)預(yù)測因子對(duì)模型的貢獻(xiàn)重要性,并且這個(gè)重要性是以得分的形式給出的赏僧,分怎么計(jì)算的大猛,我也不知道。獲得各個(gè)預(yù)測因子重要性得分的代碼如下:

varImp(gbmFit, scale = FALSE)

[圖片上傳失敗...(image-6d4f87-1661865851359)]

更直觀的我們將該對(duì)象plot下淀零,就可以得到預(yù)測因子重要性的面條圖如下:

[圖片上傳失敗...(image-f9f0dc-1661865851359)]

上面的圖中只列出了重要性前20的變量挽绩,我們其實(shí)是有655個(gè)變量的,但是有200多個(gè)的重要性得分均為0驾中,所以跑模型的時(shí)候其實(shí)是可以完全不要它們的唉堪。

小結(jié)

今天給大家簡單介紹了在caret中做預(yù)測模型的一些知識(shí),感謝大家耐心看完肩民,自己的文章都寫的很細(xì)唠亚,重要代碼都在原文中,希望大家都可以自己做一做持痰,

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灶搜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌割卖,老刑警劉巖前酿,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鹏溯,居然都是意外死亡罢维,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門丙挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肺孵,“玉大人,你說我怎么就攤上這事颜阐∑骄剑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵瞬浓,是天一觀的道長初婆。 經(jīng)常有香客問我蓬坡,道長猿棉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任屑咳,我火速辦了婚禮萨赁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兆龙。我一直安慰自己杖爽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布紫皇。 她就那樣靜靜地躺著慰安,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聪铺。 梳的紋絲不亂的頭發(fā)上化焕,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音铃剔,去河邊找鬼撒桨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛键兜,可吹牛的內(nèi)容都是我干的凤类。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼普气,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼谜疤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤夷磕,失蹤者是張志新(化名)和其女友劉穎苇侵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體企锌,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡榆浓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撕攒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陡鹃。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抖坪,靈堂內(nèi)的尸體忽然破棺而出萍鲸,到底是詐尸還是另有隱情,我是刑警寧澤擦俐,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布脊阴,位于F島的核電站,受9級(jí)特大地震影響蚯瞧,放射性物質(zhì)發(fā)生泄漏嘿期。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一埋合、第九天 我趴在偏房一處隱蔽的房頂上張望备徐。 院中可真熱鬧,春花似錦甚颂、人聲如沸蜜猾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹭睡。三九已至,卻和暖如春赶么,著一層夾襖步出監(jiān)牢的瞬間肩豁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工禽绪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓖救,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓印屁,卻偏偏與公主長得像循捺,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雄人,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容