1. 程式人生 > 其它 >完整的R語言預測建模例項-從資料清理到建模預測

完整的R語言預測建模例項-從資料清理到建模預測

本文使用Kaggle上的一個公開資料集,從資料匯入,清理整理一直介紹到最後資料多個演算法建模,交叉驗證以及多個預測模型的比較全過程,注重在實際資料建模過程中的實際問題和挑戰,主要包括以下五個方面的挑戰:

  1. 缺失值的挑戰
  2. 異常值的挑戰
  3. 不均衡分佈的挑戰
  4. (多重)共線性的挑戰
  5. 預測因子的量綱差異

以上的幾個主要挑戰,對於熟悉機器學習的人來說,應該都是比較清楚的,這個案例中會涉及到五個挑戰中的缺失值,量綱和共線性問題的挑戰。

案例資料說明

本案例中的資料可以在下面的網址中下載: https://www.kaggle.com/primaryobjects/voicegender/downloads/voicegender.zip

下載到本地後解壓縮會生成voice.csv檔案 下面首先大概瞭解一下我們要用來建模的資料

資料共包含21個變數,最後一個變數label是需要我們進行預測的變數,即性別是男或者女 前面20個變數都是我們的預測因子,每一個都是用來描述聲音的量化屬性。 下面我們開始我們的具體過程

步驟1:基本準備工作

步驟1主要包含以下三項工作:

  1. 設定工作目錄
  2. 載入需要使用的包
  3. 準備好平行計算

步驟2:資料的匯入和理解

資料下載解壓縮後就是一份名為‘voice.csv’ 的檔案,我們將csv檔案存到我們設定的工作目錄之中,就可以匯入資料了。

### read in original datasetvoice_Original <- read_csv("voice.csv",col_names=TRUE)
describe(voice_Original)

通過這個函式,我們現在可以對資料集中的每一個變數都有一個整體性把握。 我們可以看出我們共有21個變數,共計3168個觀測值。

由於本資料集資料完整,沒有缺失值,因而我們實際上並沒有缺失值的挑戰,但是為了跟實際的資料探勘過程相匹配,我們會人為將一些資料設定為缺失值,並對這些缺失值進行插補,大家也可以實際看一下我們應用的插補法的效果:

可以看出,我們的插補出來的值和原始值之間的差異是比較小的,可以幫助我們進行下一步的建模工作。

另外一點,我們在實際工作中,我們用到的預測因子中,往往包含數值型和類別型的資料,但是我們資料中全部都是數值型的,所以我們要增加難度,將其中的一個因子轉換為類別型資料,具體操作如下:

圖形結果如下:

但是我們更關注的是,預測因子之間是不是存在高度的相關性,因為預測因子間的香瓜性對於一些模型,是有不利的影響的。 對於研究預測因子間的相關性,corrplot 包中的corrplot函式提供了很直觀的圖形方法:

###find correlations between factors
factor_Corr <- cor(voice_Original[,-c(9,21)])
corrplot(factor_Corr,method="number")

步驟3:資料分配與建模

在實際建模過程中,我們不會將所有的資料全部用來進行訓練模型,因為相比較模型資料集在訓練中的表現,我們更關注模型在訓練集,也就是我們的模型沒有遇到的資料中的預測表現。 因此,我們將我們的資料集的70%的資料用來訓練模型,剩餘的30%用來檢驗模型預測的結果。

### separate dataset into training and testing setssample_Index <- createDataPartition(voice_Original$label,p=0.7,list=FALSE)
voice_Train <- voice_Original[sample_Index,]
voice_Test <- voice_Original[-sample_Index,]

但是我們還沒有解決之前我們發現的一些問題,資料的量綱實際上是不一樣的,另外某些因子間存在高度的相關性,這對我們的建模是不利的,因此我們需要進行一些預處理,我們又需要用到preProcess 函式:

### preprocess factors for further modeling
pp <- preProcess(voice_Train,method=c("scale","center","pca"))voice_Train <- predict(pp,voice_Train)voice_Test <- predict(pp,voice_Test)

我們首先將數值型因子進行了標準化,確保所有的因子在一個量綱上,接著對已經標準化的資料進行主成分分析,消除因子中的高相關性。如果我們看一下我們的現在經過處理的資料,就可以看到:

原來的所有數值型因子已經被PC1-PC10取代了。

現在,我們進行一些通用的設定,為不同的模型進行交叉驗證比較做好準備。

可以看到隨機森林的結果介於上面兩個模型之間。但是模型的結果是存在一定的偶然性的,即因為都使用了交叉驗證,每個模型都存在抽樣的問題,因此結果之間存在一定的偶然性,所以我們需要對模型進行統計意義上的比較。

但是在此之前,我想提一下平行計算的問題,我們在開始建模之前就使用parallel 和doParallel 兩個包設定了平行計算的引數,在modelControl中將allowParallel的值設為了TRUE,就可以幫助我們進行交叉驗證時進行平行計算,下面這張圖可以幫助我們看到差異:

因為原生的R只支援單程序,通過我們的設定,可以將四個核都使用起來,可以大為減少我們的計算時間。

我們最後的一個步驟就是要將三個模型進行比較,確定我們最優的一個模型:

結果從準確率和Kappa值兩個方面對資料進行了比較,可以幫助我們瞭解模型的實際表現,當然我們也可以通過圖形展現預測結果:

根據結果,我們可以看到,其實邏輯迴歸的結果還是比較好的。 所以我們可以將邏輯迴歸的結果作為我們最終使用的模型。