python, R, vimでデータマイニング

python, R, vim で疑問に思ったことなどを

今更欠損値対応:mlr

欠損値対応

TREEベースのアルゴリズムでモデルを構築することが多いので欠損値対応は必要ないと思っていた。 今回はモデルを構築する前にクラスタリングすることにしてkmeansのため欠損値対応が必要になった。

平均値に置換

難しいことをしたいわけではなく、単純に平均値に置換したい。 平均値に置換するのは良い方法ではないみたいだけどわかりやすい。

欠損値対応のパッケージ

毎回、コードを書くのは大変なのでパッケージで対応したい。 miやmiceはもっと小難しいことをしているみたいで平均値置換にむいてない?

mlrが良さそう.

mlrが良さそう。 mlrはcaretと似たようなパッケージでモデル構築のためのパッケージ。 前処理で欠損値対応が可能。

欠損値対応

サンプルコード

# https://mlr-org.github.io/mlr-tutorial/release/html/create_imputation/index.html
library(mlr)
## Loading required package: BBmisc
## Loading required package: ggplot2
## Loading required package: ParamHelpers
data(airquality)
summary(airquality)
##      Ozone           Solar.R           Wind             Temp      
##  Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
##  1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:72.00  
##  Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
##  Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
##  3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
##  Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
##  NA's   :37       NA's   :7                                       
##      Month            Day      
##  Min.   :5.000   Min.   : 1.0  
##  1st Qu.:6.000   1st Qu.: 8.0  
##  Median :7.000   Median :16.0  
##  Mean   :6.993   Mean   :15.8  
##  3rd Qu.:8.000   3rd Qu.:23.0  
##  Max.   :9.000   Max.   :31.0  
## 
imp <- impute(
    airquality, 
    cols = list(
        Ozone = imputeMean(), 
        Solar.R = imputeMean()
    )
)
head(imp$data, 10)
##       Ozone  Solar.R Wind Temp Month Day
## 1  41.00000 190.0000  7.4   67     5   1
## 2  36.00000 118.0000  8.0   72     5   2
## 3  12.00000 149.0000 12.6   74     5   3
## 4  18.00000 313.0000 11.5   62     5   4
## 5  42.12931 185.9315 14.3   56     5   5
## 6  28.00000 185.9315 14.9   66     5   6
## 7  23.00000 299.0000  8.6   65     5   7
## 8  19.00000  99.0000 13.8   59     5   8
## 9   8.00000  19.0000 20.1   61     5   9
## 10 42.12931 194.0000  8.6   69     5  10
str(imp)
## List of 2
##  $ data:'data.frame':    153 obs. of  6 variables:
##   ..$ Ozone  : num [1:153] 41 36 12 18 42.1 ...
##   ..$ Solar.R: num [1:153] 190 118 149 313 186 ...
##   ..$ Wind   : num [1:153] 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
##   ..$ Temp   : int [1:153] 67 72 74 62 56 66 65 59 61 69 ...
##   ..$ Month  : int [1:153] 5 5 5 5 5 5 5 5 5 5 ...
##   ..$ Day    : int [1:153] 1 2 3 4 5 6 7 8 9 10 ...
##  $ desc:List of 9
##   ..$ target              : chr(0) 
##   ..$ features            : chr [1:6] "Ozone" "Solar.R" "Wind" "Temp" ...
##   ..$ lvls                : Named list()
##   ..$ impute              :List of 2
##   .. ..$ Ozone  :List of 2
##   .. .. ..$ impute:function (data, target, col, const)  
##   .. .. ..$ args  : num 42.1
##   .. ..$ Solar.R:List of 2
##   .. .. ..$ impute:function (data, target, col, const)  
##   .. .. ..$ args  : num 186
##   ..$ dummies             : chr(0) 
##   ..$ dummy.type          : chr "factor"
##   ..$ force.dummies       : logi FALSE
##   ..$ impute.new.levels   : logi TRUE
##   ..$ recode.factor.levels: logi TRUE
##   ..- attr(*, "class")= chr "ImputationDesc"
summary(imp$data)
##      Ozone           Solar.R           Wind             Temp      
##  Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
##  1st Qu.: 21.00   1st Qu.:120.0   1st Qu.: 7.400   1st Qu.:72.00  
##  Median : 42.13   Median :194.0   Median : 9.700   Median :79.00  
##  Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
##  3rd Qu.: 46.00   3rd Qu.:256.0   3rd Qu.:11.500   3rd Qu.:85.00  
##  Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
##      Month            Day      
##  Min.   :5.000   Min.   : 1.0  
##  1st Qu.:6.000   1st Qu.: 8.0  
##  Median :7.000   Median :16.0  
##  Mean   :6.993   Mean   :15.8  
##  3rd Qu.:8.000   3rd Qu.:23.0  
##  Max.   :9.000   Max.   :31.0