verum ipsum factum

sudillap's blog

ワインの味(美味しさのグレード)は予測できるか?(2)

それでは実際に分析を行なっていきます。

分析方法

データ分析により、ワインの成分データから味のグレード(属性quality)を求めるモデルを作成します。
グレードqualityは0(とてもまずい)から10(絶品)までの値をとる質的変数(順序尺度)とみなすのが原則ですが、分析の際には量的変数として扱います。

したがって回帰モデルを作成することによりデータを分析すれば良いことになります。用いた手法は、線形回帰モデル(交互作用あり・なし)、サポートベクター回帰(SVR、support vector regression)、ランダムフォレスト(random forest)です*1

もちろん、グレードqualityを質的変数とみなすことにより、分類問題として分析することも可能です。実際は、あまり予測精度に違いはありませんでしたので結果は省略します。

また、事前につぎの処理をデータに施しておきます。

  • 標準化
  • 元データを2/3を訓練データに、1/3をテストデータに分割
  • 外れ値の除去(LOF(local outlier factor)を用います)

この処理を施した結果、データサイズはつぎのようになりました。

ワイン 訓練データサイズ テストデータサイズ
赤ワイン 1062 533
白ワイン 3263 1633

訓練データを用いてモデルを作成し、テストデータを用いて予測精度を評価します(教師あり学習です)。

ところで、モデルの予測結果は実数になるため、これを0から10までの整数に変換する必要があります。この記事ではCortezら(2009)と同様な方法で整数に変換します。

$i$番目のテストデータのquality(正解のグレード)を$y_i$、予測結果(実数)を$\hat{y}_i$とします。このときqualityの予測クラス(整数で、予測グレードのこと)$p_i$はつぎの式で計算します。
$$
p_i =
\begin{cases}
y_i, & \text{if } |y_i - \hat{y}_i| \leqq T \\
\lfloor \hat{y}_i + 0.5 \rfloor, & \text{if } |y_i - \hat{y}_i| > T
\end{cases}
$$
ここで、$\lfloor x \rfloor$は床関数で、上の2番めの式は難しく見えますが、実際は単純な四捨五入のことです。

上の1番目の式に現れる$T$はしきい値で、0.5または1とします。それぞれの意味はつぎのとおりです。

  • $T=0.5$のときは予測結果を四捨五入してqualityの予測クラスを求めます。
  • $T=1$のときは予測結果と正解データの差が1以下であれば正解とみなします(すなわち評価が甘くなります)。

たとえば、正解が5、予測結果が5.8とすると、$T=0.5$のときは四捨五入して予測クラスは6となります。一方、$T=1$のときは正解と予測結果の差は0.8(<1)なので予測クラスは(6ではなく)5となります。また、予測結果が6.1のばあいは、正解との差は1.1(>1)なので、四捨五入して予測クラスは6となります。

$T=1$とすると評価基準が甘くなります。しかし、もともと味のグレードqualityは、3人以上のワイン査定人による評価結果の中間値を取ったものですので、正解のグレードと予測結果が1だけ異なっても正解とみなして問題ないと考えられます。


線形回帰モデル

まずはシンプルな線形回帰モデルでワインの味qualityを予測します。

まず属性間に多重共線性があるかどうか、VIF(分散拡大要因)を計算しました。

●赤ワイン
       fixed.acidity     volatile.acidity          citric.acid       residual.sugar            chlorides  free.sulfur.dioxide total.sulfur.dioxide              density                   pH            sulphates              alcohol 
            7.630214             1.790090             3.212295             1.687765             1.490558             2.061621             2.273877             5.993643             3.319835             1.402595             2.820069 
●白ワイン
       fixed.acidity     volatile.acidity          citric.acid       residual.sugar            chlorides  free.sulfur.dioxide total.sulfur.dioxide              density                   pH            sulphates              alcohol 
            3.260098             1.132510             1.151530            15.216226             1.242013             1.782381             2.323432            38.632377             2.469470             1.171794            11.087115 

白ワインのdensity、alcoholのVIFが10を超えているため多重共線性を起こす可能性はありますが、ここでは全属性を用いて回帰モデルを作成します。

つぎに最適な重回帰モデルをステップワイズ法でモデル選択(AICで評価)しました。重回帰モデルの変数ごとの係数はつぎのとおりです。
なお、各変数の係数が本記事の冒頭で書いた式と異なるのは、データを標準化しているためです(冒頭に書いた式はわかりやすさのため標準化していないデータによる式です)。

●赤ワイン
Call:
lm(formula = .outcome ~ fixed.acidity + volatile.acidity + citric.acid + 
    residual.sugar + chlorides + free.sulfur.dioxide + total.sulfur.dioxide + 
    density + pH + sulphates + alcohol, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
 -2.34418 -0.38125 -0.04248  0.47055  2.11543 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)           5.617422   0.020111 279.317  < 2e-16 ***
fixed.acidity         0.029250   0.054355   0.538   0.5906    
volatile.acidity     -0.165753   0.027092  -6.118 1.33e-09 ***
citric.acid          -0.012419   0.035889  -0.346   0.7294    
residual.sugar        0.007935   0.026037   0.305   0.7606    
chlorides            -0.096093   0.023713  -4.052 5.45e-05 ***
free.sulfur.dioxide   0.064935   0.028752   2.258   0.0241 *  
total.sulfur.dioxide -0.143063   0.031568  -4.532 6.52e-06 ***
density              -0.022065   0.048730  -0.453   0.6508    
pH                   -0.084751   0.036164  -2.344   0.0193 *  
sulphates             0.159759   0.023963   6.667 4.21e-11 ***
alcohol               0.281640   0.033668   8.365  < 2e-16 ***
 ---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.6543 on 1050 degrees of freedom
Multiple R-squared: 0.3413,     Adjusted R-squared: 0.3344 
F-statistic: 49.45 on 11 and 1050 DF,  p-value: < 2.2e-16 

●白ワイン
Call:
lm(formula = .outcome ~ fixed.acidity + volatile.acidity + citric.acid + 
    residual.sugar + chlorides + free.sulfur.dioxide + total.sulfur.dioxide + 
    density + pH + sulphates + alcohol, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
 -3.4069 -0.5082 -0.0447  0.4634  3.0696 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)           5.890e+00  1.322e-02 445.658  < 2e-16 ***
fixed.acidity         1.085e-01  2.337e-02   4.642 3.58e-06 ***
volatile.acidity     -1.924e-01  1.432e-02 -13.433  < 2e-16 ***
citric.acid           5.967e-05  1.397e-02   0.004 0.996592    
residual.sugar        5.205e-01  5.297e-02   9.825  < 2e-16 ***
chlorides            -2.557e-03  1.514e-02  -0.169 0.865939    
free.sulfur.dioxide   8.593e-02  1.819e-02   4.723 2.42e-06 ***
total.sulfur.dioxide -3.577e-03  2.026e-02  -0.177 0.859869    
density              -6.403e-01  8.385e-02  -7.636 2.93e-14 ***
pH                    1.324e-01  2.043e-02   6.481 1.05e-10 ***
sulphates             7.742e-02  1.457e-02   5.314 1.14e-07 ***
alcohol               1.604e-01  4.342e-02   3.694 0.000225 ***
 ---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.7545 on 3251 degrees of freedom
Multiple R-squared: 0.2993,     Adjusted R-squared: 0.2969 
F-statistic: 126.2 on 11 and 3251 DF,  p-value: < 2.2e-16 

このモデルのもとでテストデータを用いてワインの味qualityを予測しました。予測結果の分割表はつぎのとおりです。なお、pred.halfは$T=0.5$の予測結果、pred.oneは$T=1$の予測結果です。

●赤ワイン
       pred.half
quality   4   5   6   7
      3   1   3   1   0
      4   0  10   3   0
      5   1 162  50   0
      6   0  62 151   8
      7   0   2  60  14
      8   0   0   4   1

       pred.one
quality   4   5   6   7
      3   1   3   1   0
      4   1   9   3   0
      5   0 207   6   0
      6   0   8 213   0
      7   0   2  22  52
      8   0   0   4   1

●白ワイン
       pred.half
quality   4   5   6   7
      3   1   2   4   1
      4   2  28  20   0
      5   2 203 293   9
      6   0 111 571  65
      7   0  10 195  74
      8   0   0  27  14
      9   0   0   0   1

       pred.one
quality   4   5   6   7   8
      3   1   2   4   1   0
      4  14  16  20   0   0
      5   0 423  75   9   0
      6   0   8 738   1   0
      7   0  10  63 206   0
      8   0   0  27  12   2
      9   0   0   0   1   0

結果をまとめるとつぎの表になります。

  • 赤ワイン
しきい値T 正解率 精度(quality:4~7) 再現率(quality:3~8)
0.5 0.614 0.000 0.678 0.561 0.609 0.000 0.000 0.761 0.683 0.184 0.000
1 0.887 0.500 0.904 0.855 0.981 0.000 0.077 0.972 0.964 0.684 0.000
  • 白ワイン
しきい値T 正解率 精度(quality:4~7) 再現率(quality:3~9)
0.5 0.521 0.400 0.573 0.514 0.451 0.000 0.040 0.400 0.764 0.265 0.000 0.000
1 0.847 0.933 0.922 0.796 0.896 1.000 0.000 0.280 0.834 0.988 0.738 0.049 0.000

正解率は、約5~6割(しきい値0.5)、約8~9割(しきい値1)です。

また、交互作用を考慮して線形回帰モデルを作成しましたが、予測性能は交互作用なしの場合とほぼ同じ(わずかによい)でしたので結果は省略します。

サポートベクターマシンサポートベクター回帰

$\epsilon$サポートベクター回帰で予測します。カーネルはRBF(パラメータは$\gamma$)を用いました。サポートベクターマシンについてはこちらを参照してください。

サポートベクター回帰にはいくつかのパラメータがありますので、最適なパラメータを5分割の交差検証で選択しました。探索したパラメータ空間は、$C \in \{2^{-5}, 2^{-4}, \ldots, 2^{5}\}, \gamma \in \{-15, -13, \ldots,3\}, \epsilon \in \{2^{-5}, 2^{-4}, \ldots, 2^{-1}\}$です。
最適なパラメータはつぎのとおりでした。

$C$ $\gamma$ $\epsilon$
赤ワイン 1 0.125 0.25
白ワイン 2 0.125 0.25

このモデルのもとでテストデータを用いてワインの味qualityを予測しました。予測結果の分割表はつぎのとおりです。なお、pred.halfは$T=0.5$の予測結果、pred.oneは$T=1$の予測結果です。

●赤ワイン
       pred.half
quality   4   5   6   7
      3   1   4   0   0
      4   0  11   2   0
      5   0 177  36   0
      6   0  67 143  11
      7   0   3  50  23
      8   0   0   5   0

       pred.one
quality   4   5   6   7
      3   1   4   0   0
      4   1  10   2   0
      5   0 207   6   0
      6   0   1 220   0
      7   0   3  14  59
      8   0   0   5   0

●白ワイン
       pred.half
quality   4   5   6   7   8
      3   0   6   2   0   0
      4   8  32  10   0   0
      5   5 308 184  10   0
      6   2 150 526  69   0
      7   0   6 150 122   1
      8   0   2  11  27   1
      9   0   0   0   1   0

       pred.one
quality   4   5   6   7   8
      3   0   6   2   0   0
      4  22  18  10   0   0
      5   0 448  49  10   0
      6   2  15 726   4   0
      7   0   6  48 225   0
      8   0   2  11  22   6
      9   0   0   0   1   0

結果をまとめるとつぎの表になります。

  • 赤ワイン
しきい値T 正解率 精度(quality:4~7) 再現率(quality:3~8)
0.5 0.644 0.000 0.676 0.606 0.676 0.000 0.000 0.831 0.647 0.303 0.000
1 0.914 0.500 0.920 0.891 1.000 0.000 0.077 0.972 0.995 0.776 0.000
  • 白ワイン
しきい値T 正解率 精度(quality:4~8) 再現率(quality:3~9)
0.5 0.591 0.533 0.611 0.596 0.533 0.500 0.000 0.160 0.607 0.704 0.437 0.024 0.000
1 0.874 0.917 0.905 0.858 0.859 1.000 0.000 0.440 0.884 0.972 0.806 0.146 0.000

正解率は、約6割(しきい値0.5)、約9割(しきい値1)で、線形回帰モデルより予測結果が良いことが分かります。

ランダムフォレスト

ランダムフォレスト回帰で予測します。

このモデルのもとでテストデータを用いてワインの味qualityを予測しました。分割表はつぎのとおりです。なお、pred.halfは$T=0.5$の予測結果、pred.oneは$T=1$の予測結果です。

●赤ワイン
       pred.half
quality   4   5   6   7
      3   1   4   0   0
      4   0  11   2   0
      5   2 176  35   0
      6   0  54 154  13
      7   0   3  38  35
      8   0   0   3   2

       pred.one
quality   4   5   6   7   8
      3   1   4   0   0   0
      4   2   9   2   0   0
      5   0 209   4   0   0
      6   0   1 220   0   0
      7   0   3  11  62   0
      8   0   0   3   1   1

●白ワイン
       pred.half
quality   4   5   6   7   8
      3   0   4   4   0   0
      4   3  36  11   0   0
      5   0 346 156   5   0
      6   0 108 590  49   0
      7   0   2 125 152   0
      8   0   1   6  26   8
      9   0   0   0   1   0

       pred.one
quality   4   5   6   7   8
      3   0   4   4   0   0
      4  24  15  11   0   0
      5   0 457  45   5   0
      6   0   6 740   1   0
      7   0   2  27 250   0
      8   0   1   6  16  18
      9   0   0   0   1   0

結果をまとめるとつぎの表になります。

  • 赤ワイン
しきい値T 正解率 精度(quality:4~7) 再現率(quality:3~8)
0.5 0.685 0.000 0.710 0.664 0.700 0.000 0.000 0.826 0.697 0.461 0.000
1 0.927 0.667 0.925 0.917 0.984 1.000 0.000 0.154 0.981 0.995 0.816 0.200
  • 白ワイン
しきい値T 正解率 精度(quality:4~8) 再現率(quality:3~9)
0.5 0.673 1.000 0.696 0.661 0.652 1.000 0.000 0.060 0.682 0.790 0.545 0.195 0.000
1 0.912 1.000 0.942 0.888 0.916 1.000 0.000 0.480 0.901 0.991 0.896 0.439 0.000

正解率は、約7割(しきい値0.5)、約9割(しきい値1)で、線形回帰モデルやサポートベクターマシンより予測結果が良いことが分かります。

予測結果と正解の散布図(ジッターあり)を示します。
f:id:sudillap:20130427171336p:plainf:id:sudillap:20130427171341p:plain

ランダムフォレストでは変数ごとの重要度を計算することができます。Cortezら(2009)の結果と異なるのですが、データを標準化したためと重要度の計算手法が異なるためと思われます。
f:id:sudillap:20130427171355p:plainf:id:sudillap:20130427171400p:plain



参考文献

Bache, K. & Lichman, M. (2013). UCI Machine Learning Repository. Irvine, CA: University of California, School of Information and Computer Science.

P. Cortez, A. Cerdeira, F. Almeida, T. Matos and J. Reis.
Modeling wine preferences by data mining from physicochemical properties.
In Decision Support Systems, Elsevier, 47(4):547-553. ISSN: 0167-9236.

*1:Cortezら(2009)が採用した手法は、線形回帰モデル、サポートベクター回帰ニューラルネットワークです