2014年4月24日

R案例研究--水藻的生長預測-(四)-預測七種水藻的數量及結論

預測七種水藻的數量

資料採礦的主要目標是預測140樣本中七種水藻的數量。使用的模型是前述驗證過最佳模型。也就是呼叫bestScores()所看到的。也就是下列其中之一cv.rf.v3、cv.rf.v2、cv.rf.v1、cv.rpart.v3:
================================
//取得各水藻的最佳模型名稱
> bestModelsNames <- sapply(bestScores(res.all), function(x) x['nmse','system'])
> learners <- c(rf='randomForest',rpart='rpartXse')
//取得上述個名稱的實際模型名稱
> funcs <- learners[sapply(strsplit(bestModelsNames,'\\.'),
+ function(x) x[2])]
//存放個模型的參數設定
> parSetts <- lapply(bestModelsNames,
+ function(x) getVariant(x,res.all)@pars)
> bestModels <- list()

> for(a in 1:7) {
+ form <- as.formula(paste(names(clean.algae)[11+a],'~.'))
+ bestModels[[a]] <- do.call(funcs[a],
+ c(list(form,clean.algae[,c(1:11,11+a)]),parSetts[[a]]))

+}
================================
strsplit():分解字串,第一個字串是待分解字串,第二個參數是分隔的字串。如strsplit(cv.rf.v3,'\\.')結果便是'cv' 'rf' 'v3'。
getVariant()傳入各個模型名稱,傳回learner物件。@pars稱為插槽(slots)可視為物件的屬性。
do.call():呼叫第一個參數的函數名稱,而把第二個參數當做此函數的參數。
{問題:詳細的函數或類別需再額外研究。}
至此我們得到七個相對的模型。
test.algae內有這140個測試樣本,其中同樣含有缺漏值。我們也可以像之前處理的一樣,使用knnImputation()來補齊缺漏值。但這有些違背了預測建模的規則:『不要使用任何測試集的資訊建立模型』。knnImputation()有額外的參數可以用來避免使用測試集的資料建模:
================================
> clean.test.algae <- knnImputation(test.algae, k = 10, distData = algae[, 1:11])
================================
distData 參數可以讓你指定其他的資料集作為建模來源。其中使用的欄位,並未指定目標變數(1:11),這是因為測試資料集的目標變數並無資料。
接下來我們便可以計算預測值了:
================================
> preds <- matrix(ncol=7,nrow=140)
> for(i in 1:nrow(clean.test.algae))
+ preds[i,] <- sapply(1:7,
+ function(x)
+ predict(bestModels[[x]],clean.test.algae[i,])

+)
================================
至此我們得到這140筆樣本的7個數量預測。在套件中還有一個資料集algae.sols含有這140筆樣本的7個實際數量,我們可以用來計算這些模型的NMSE。
================================
//計算每種藻類的實際數量平均值
> avg.preds <- apply(algae[,12:18],2,mean)
//計算每種藻類預測結果的NMSE
> apply( ((algae.sols-preds)^2), 2,mean) /

+ apply( (scale(algae.sols,avg.preds,F)^2),2,mean)
----------------------------------------------------------
================================
scale()用來歸一化(normalize)資料集,其作法是第一個參數減第二個參數再除於第三個參數,除非這個參數是FALSE。(此處運算皆指向量)
最後的結果顯示,a7很難獲得好的分數,而其他6種則頗具競爭力,尤其是a1。因此我們可以結論,使用適當的模型選擇程序,可以獲得不錯的分數。


結論

這個案例所展現的相關技術有:

  • 資料視覺化
  • 描述性統計
  • 處理變數缺漏值的策略
  • 迴歸分析作業
  • 迴歸分析的評估指標
  • 多線性迴歸分析
  • 迴歸樹分析
  • 運用k-fold交叉驗證對各種模型的比較選擇
  • 同時使用各種模型及隨機森林的應用

對R的基本操作技術有:

  • 從文字檔載入資料
  • 如何從料集中取得相關的統計描述
  • 基本的資料視覺化
  • 處理資料集中的缺漏值
  • 取得迴歸模型
  • 運用上述的模型預測測試資料的預測值
上一頁

沒有留言: