3.6 変数選択

以前紹介したようにstep関数を使ってAICの意味で良い変数を選択することができる.

fit_none <- glm(Diagnosis ~ 1, data=scaled_df, family=binomial)
fit_full <- glm(Diagnosis ~ ., data=scaled_df, family=binomial)
## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました
stats::step(object=fit_none, scope=list(lower=fit_none, upper=fit_full))
## Start:  AIC=753.44
## Diagnosis ~ 1
## 
##                    Df Deviance    AIC
## + Nconcave_mean     1   258.92 262.92
## + Perimeter_mean    1   304.48 308.48
## + Area_mean         1   325.66 329.66
## + Radius_mean       1   330.01 334.01
## + Concavity_mean    1   383.23 387.23
## + Compactness_mean  1   508.79 512.79
## + Texture_mean      1   646.52 650.52
## + Smoothness_mean   1   673.95 677.95
## + Symmetry_mean     1   686.80 690.80
## <none>                  751.44 753.44
## + Fractaldim_mean   1   751.35 755.35
## 
## Step:  AIC=262.92
## Diagnosis ~ Nconcave_mean
## 
##                    Df Deviance    AIC
## + Texture_mean      1   203.34 209.34
## + Area_mean         1   205.78 211.78
## + Radius_mean       1   209.24 215.24
## + Perimeter_mean    1   209.64 215.64
## + Fractaldim_mean   1   223.42 229.42
## + Smoothness_mean   1   241.45 247.45
## + Compactness_mean  1   242.21 248.21
## + Symmetry_mean     1   253.88 259.88
## + Concavity_mean    1   256.58 262.58
## <none>                  258.92 262.92
## - Nconcave_mean     1   751.44 753.44
## 
## Step:  AIC=209.34
## Diagnosis ~ Nconcave_mean + Texture_mean
## 
##                    Df Deviance    AIC
## + Area_mean         1   161.70 169.70
## + Radius_mean       1   164.38 172.38
## + Perimeter_mean    1   165.71 173.71
## + Fractaldim_mean   1   176.95 184.95
## + Compactness_mean  1   187.97 195.97
## + Concavity_mean    1   198.18 206.18
## + Smoothness_mean   1   198.46 206.46
## <none>                  203.34 209.34
## + Symmetry_mean     1   202.15 210.15
## - Texture_mean      1   258.92 262.92
## - Nconcave_mean     1   646.52 650.52
## 
## Step:  AIC=169.7
## Diagnosis ~ Nconcave_mean + Texture_mean + Area_mean
## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました
##                    Df Deviance    AIC
## + Perimeter_mean    1   156.26 166.26
## + Smoothness_mean   1   156.44 166.44
## + Radius_mean       1   157.39 167.39
## + Symmetry_mean     1   157.81 167.81
## <none>                  161.70 169.70
## + Compactness_mean  1   160.95 170.95
## + Fractaldim_mean   1   161.64 171.64
## + Concavity_mean    1   161.64 171.64
## - Area_mean         1   203.34 209.34
## - Texture_mean      1   205.78 211.78
## - Nconcave_mean     1   288.98 294.98
## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました
## 
## Step:  AIC=166.26
## Diagnosis ~ Nconcave_mean + Texture_mean + Area_mean + Perimeter_mean
## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました
##                    Df Deviance    AIC
## + Smoothness_mean   1   151.16 163.16
## + Symmetry_mean     1   152.53 164.53
## <none>                  156.26 166.26
## + Compactness_mean  1   156.03 168.03
## + Radius_mean       1   156.22 168.22
## + Fractaldim_mean   1   156.25 168.25
## + Concavity_mean    1   156.26 168.26
## - Perimeter_mean    1   161.70 169.70
## - Area_mean         1   165.71 173.71
## - Texture_mean      1   202.30 210.30
## - Nconcave_mean     1   252.44 260.44
## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました
## 
## Step:  AIC=163.16
## Diagnosis ~ Nconcave_mean + Texture_mean + Area_mean + Perimeter_mean + 
##     Smoothness_mean
## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました
##                    Df Deviance    AIC
## + Symmetry_mean     1   148.06 162.06
## <none>                  151.16 163.16
## + Concavity_mean    1   149.52 163.52
## + Radius_mean       1   150.37 164.37
## + Compactness_mean  1   150.87 164.87
## + Fractaldim_mean   1   151.14 165.14
## - Smoothness_mean   1   156.26 166.26
## - Perimeter_mean    1   156.44 166.44
## - Area_mean         1   161.69 171.69
## - Nconcave_mean     1   181.21 191.21
## - Texture_mean      1   202.05 212.05
## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました
## 
## Step:  AIC=162.06
## Diagnosis ~ Nconcave_mean + Texture_mean + Area_mean + Perimeter_mean + 
##     Smoothness_mean + Symmetry_mean
## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました

## Warning: glm.fit: 数値的に 0 か 1 である確率が生じました
##                    Df Deviance    AIC
## <none>                  148.06 162.06
## - Symmetry_mean     1   151.16 163.16
## + Concavity_mean    1   147.29 163.29
## + Radius_mean       1   147.74 163.74
## + Fractaldim_mean   1   148.03 164.03
## + Compactness_mean  1   148.05 164.05
## - Smoothness_mean   1   152.53 164.53
## - Perimeter_mean    1   153.44 165.44
## - Area_mean         1   159.18 171.18
## - Nconcave_mean     1   174.34 186.34
## - Texture_mean      1   200.47 212.47
## 
## Call:  glm(formula = Diagnosis ~ Nconcave_mean + Texture_mean + Area_mean + 
##     Perimeter_mean + Smoothness_mean + Symmetry_mean, family = binomial, 
##     data = scaled_df)
## 
## Coefficients:
##     (Intercept)    Nconcave_mean     Texture_mean  
##          0.3531           3.5639           1.6723  
##       Area_mean   Perimeter_mean  Smoothness_mean  
##         12.6985          -8.1320           0.7039  
##   Symmetry_mean  
##          0.4922  
## 
## Degrees of Freedom: 568 Total (i.e. Null);  562 Residual
## Null Deviance:       751.4 
## Residual Deviance: 148.1     AIC: 162.1

実行した結果

警告:  glm.fit: fitted probabilities numerically 0 or 1 occurred

と警告が出るケースがあるが,これはロジスティック回帰においてモデルが過学習しているような状態になっているために出る警告である.パラメーターの推定そのものが失敗しているわけではないが,この場合は推定結果を注意深くみて何かほぼ目的変数と同じような説明変数が存在していないか確認する必要がある.

pairs関数を使ってみてみよう.

pairs(scaled_df)

結果として,

  • Perimeter_mean
  • Area_mean
  • Concavity_mean
  • Nconcave_mean

の相関がかなり高いことが分かる.試しに,これらの変数を取り除いて実行してみよう.

newdata <- scaled_df %>% 
  dplyr::select(-Perimeter_mean, -Area_mean, -Concavity_mean, Nconcave_mean)
fit_none <- glm(Diagnosis ~ 1, data=newdata, family=binomial)
fit_full <- glm(Diagnosis ~ ., data=newdata, family=binomial)
result <- stats::step(object=fit_none, scope=list(lower=fit_none, upper=fit_full))
## Start:  AIC=753.44
## Diagnosis ~ 1
## 
##                    Df Deviance    AIC
## + Nconcave_mean     1   258.92 262.92
## + Radius_mean       1   330.01 334.01
## + Compactness_mean  1   508.79 512.79
## + Texture_mean      1   646.52 650.52
## + Smoothness_mean   1   673.95 677.95
## + Symmetry_mean     1   686.80 690.80
## <none>                  751.44 753.44
## + Fractaldim_mean   1   751.35 755.35
## 
## Step:  AIC=262.92
## Diagnosis ~ Nconcave_mean
## 
##                    Df Deviance    AIC
## + Texture_mean      1   203.34 209.34
## + Radius_mean       1   209.24 215.24
## + Fractaldim_mean   1   223.42 229.42
## + Smoothness_mean   1   241.45 247.45
## + Compactness_mean  1   242.21 248.21
## + Symmetry_mean     1   253.88 259.88
## <none>                  258.92 262.92
## - Nconcave_mean     1   751.44 753.44
## 
## Step:  AIC=209.34
## Diagnosis ~ Nconcave_mean + Texture_mean
## 
##                    Df Deviance    AIC
## + Radius_mean       1   164.38 172.38
## + Fractaldim_mean   1   176.95 184.95
## + Compactness_mean  1   187.97 195.97
## + Smoothness_mean   1   198.46 206.46
## <none>                  203.34 209.34
## + Symmetry_mean     1   202.15 210.15
## - Texture_mean      1   258.92 262.92
## - Nconcave_mean     1   646.52 650.52
## 
## Step:  AIC=172.38
## Diagnosis ~ Nconcave_mean + Texture_mean + Radius_mean
## 
##                    Df Deviance    AIC
## + Smoothness_mean   1   160.32 170.32
## + Symmetry_mean     1   160.65 170.65
## <none>                  164.38 172.38
## + Compactness_mean  1   163.26 173.26
## + Fractaldim_mean   1   164.17 174.17
## - Radius_mean       1   203.34 209.34
## - Texture_mean      1   209.24 215.24
## - Nconcave_mean     1   291.12 297.12
## 
## Step:  AIC=170.32
## Diagnosis ~ Nconcave_mean + Texture_mean + Radius_mean + Smoothness_mean
## 
##                    Df Deviance    AIC
## + Symmetry_mean     1   157.38 169.38
## <none>                  160.32 170.32
## + Compactness_mean  1   159.21 171.21
## + Fractaldim_mean   1   159.90 171.90
## - Smoothness_mean   1   164.38 172.38
## - Nconcave_mean     1   187.29 195.29
## - Radius_mean       1   198.46 206.46
## - Texture_mean      1   209.16 217.16
## 
## Step:  AIC=169.38
## Diagnosis ~ Nconcave_mean + Texture_mean + Radius_mean + Smoothness_mean + 
##     Symmetry_mean
## 
##                    Df Deviance    AIC
## + Compactness_mean  1   155.28 169.28
## <none>                  157.38 169.38
## - Symmetry_mean     1   160.32 170.32
## + Fractaldim_mean   1   156.64 170.64
## - Smoothness_mean   1   160.65 170.65
## - Nconcave_mean     1   179.65 189.65
## - Radius_mean       1   198.27 208.27
## - Texture_mean      1   207.68 217.68
## 
## Step:  AIC=169.28
## Diagnosis ~ Nconcave_mean + Texture_mean + Radius_mean + Smoothness_mean + 
##     Symmetry_mean + Compactness_mean
## 
##                    Df Deviance    AIC
## <none>                  155.28 169.28
## - Compactness_mean  1   157.38 169.38
## - Smoothness_mean   1   158.24 170.24
## + Fractaldim_mean   1   155.04 171.04
## - Symmetry_mean     1   159.21 171.21
## - Nconcave_mean     1   176.38 188.38
## - Radius_mean       1   186.89 198.89
## - Texture_mean      1   207.08 219.08

先ほどの警告は解消された. 最終的には以下のようなモデルがAICの意味で最適であるとして進めていこう.

Call:  glm(formula = Diagnosis ~ Nconcave_mean + Texture_mean + Radius_mean + 
    Smoothness_mean + Symmetry_mean + Compactness_mean, family = binomial, 
    data = newdata)