>>勉強の面倒を毎週見てくれる神サービスがこちら

【機械学習】label encodingの数字の付け方を変えると精度はどうなる??実験してみた

データ分析・統計・数学
この記事は約10分で読めます。

実験の目的

機械学習における label encoding(ordinal encoding)とは、カテゴリ変数を数値に変換する手法の1つで、各水準を単純に整数に置き換えるものです。

例えば、「日本」「アメリカ」「イギリス」といったラベル(水準)をそれぞれ「0」「1」「2」と振り分けます。

変換前変換後
日本0
アメリカ1
イギリス2
日本0
アメリカ1
label encodingの例1

しかし数値の割り当て方には決まったルールはなく、好きなように変換を施すことができます。

変換前変換後①変換後②
日本01
アメリカ12
イギリス20
日本01
アメリカ12
label encodingの例2

なので、整数の割り当て方によって精度が高くなったり低くなったりします。

そこで生じる疑問は、

どういう割り当て方をすれば、精度が上がるのか…?

という疑問です。

そんなわけで今回の実験では、label encodingの方法によって精度がどうなるのかを、後述する3つのモデル別に検証しました。

一般的によく言われていること

まず、label encodingに関する知見について調査しました。

”普通の” label encodingとは

特別な理由がなければ、label encodingは辞書順に並べた順のインデックスでencodeされるようです。[1]

変換前変換後
blue0
green1
red2
yellow3
green1
文字列の辞書順にもとづくlabel encodingの例

label encodingが適さない機械学習モデル

しかし、辞書順に基づいてencodingを行ってもその整数の順序には(ほとんどの場合)意味がありません。これは統計学の用語でいうと「名義尺度」で、水準間に大小関係はなく、同じかどうかという情報のみが意味を持ちます

なので、例えば線形回帰モデル

$$\hat{y} = w_1x_\text{country} + \cdots$$

の場合、\(x_\text{country}\)の値によって予測値が変わりますが、日本(=0)、アメリカ(=1)、イギリス(=2)、…となるにつれて予測値が増大してしまいます。日本・アメリカ・イギリスの間に明確な大小関係は無いにもかかわらず、です。

このため、値の大きさに意味を持つモデルにlabel encodingはあまり適していません。
*ニューラルネットワークもこれに含まれそうですね。

しかし決定木系のアルゴリズムなら、label encodingは適しています。

決定木では、(かなりざっくり言うと)
・\(x_\text{country}\)が0なら、\(\hat{y}=100\)
・\(x_\text{country}\)が1なら、\(\hat{y}=150\)
・\(x_\text{country}\)が2なら、\(\hat{y}=90\)

というふうに、(うまく分岐がされれば)値の大小には影響されないモデルになります。そのため、決定木系のアルゴリズムではlabel encodingを直接使っても問題なさそうです。

実験の方法

Kaggleの常設コンペ「House Prices – Advanced Regression Techniques」のデータを用いて、実験を行いました。

次の4通りの label encoding (とone-hot encoding)を比較します。

  • SklearnのLabelEncoderでエンコーディングした場合
  • 目的変数の平均の昇順に0以上の整数を割り振った場合*
  • 目的変数の中央値の昇順に0以上の整数を割り振った場合*
  • ラベルの頻度の昇順に0以上の整数を割り振った場合
  • (おまけ)one-hot encodingの場合

「目的変数の平均の昇順に0以上の整数を割り振る」とは、こういうことです。

x(説明変数)y(目的変数)
100
50
90
80
110
160
元データ
xのカテゴリyの平均
65
100
130
各カテゴリの目的変数の平均を求め、昇順に並べる
x(変換前)x(変換後)y(目的変数)
2100
050
190
080
1110
2160
変換後

そして、モデルによる違いも検証するため、上記の各場合について

  • 線形回帰
  • ランダムフォレスト
  • LightGBM

の3種類のモデルで比較しました。

線形回帰では欠損値が扱えません。したがって、元データから ①欠損値が大部分を占める列を削除し、②欠損値を1つ以上ふくむ行を削除しました。もちろん、この欠損値処理は3モデル共通です。

上記処理後のデータは1460行×20列で、このうち80%にあたる1168行をランダムに抽出して*学習用データとし、残り全てを精度評価用のデータとしました。なお、新たに特徴量は作成せずすべての列を使って予測しました。
* sklearnのtrain_test_splitを用いて分割した。random_stateは8。

各変数の意味についてはコンペのデータ説明(Data fields)を参照してください。

  • MSZoning:5
  • Street:2
  • LotShape:4
  • LandContour:4
  • Utilities:2
  • LotConfig:5
  • LandSlope:3
  • Neighborhood:25
  • Condition1:9
  • Condition2:8
  • BldgType:5
  • HouseStyle:8
  • RoofStyle:6
  • RoofMatl:8
  • Exterior1st:15
  • Exterior2nd:16
  • ExterQual:4
  • ExterCond:5
  • Foundation:6
  • Heating:6
  • HeatingQC:5
  • CentralAir:2
  • KitchenQual:4
  • Functional:7
  • PavedDrive:3
  • SaleType:9
  • SaleCondition:6

目的変数は対数に変換し、精度評価も対数のまま行いました。

Python(3.7.13)を使用。利用したライブラリのバージョンは下のとおり。

  • pandas 1.3.5
  • numpy 1.21.6
  • sklearn 1.0.2
  • lightgbm 2.2.3

結果

評価指標は、コンペ同様にRMSE(二乗平均平方根誤差)としました。

$$\text{RMSE}=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(\hat{y_i}-y_i)^2}$$

LabelEncodersort by target meansort by target mediansort by countone-hot encoding
linear0.1460890.1336840.1344900.1440210.139585
random forest0.1362930.1354760.1369290.1375940.138539
LightGBM0.1245770.1220580.1220890.1234400.126207
RMSE(二乗平均平方根誤差)

参考までに、最大絶対値誤差と最小絶対値誤差による比較です。

*最大絶対値誤差=\(\displaystyle\max_{i}|\hat{y_i}-y_i|\)
*最小絶対値誤差=\(\displaystyle\min_{i}|\hat{y_i}-y_i|\)

LabelEncodersort by target meansort by target mediansort by countone-hot encoding
linear1.4784291.3206571.3375851.4856241.542538
random forest1.0896501.0295091.0338251.0919921.133581
LightGBM0.9827680.8646350.8789980.9035540.930022
最大絶対値誤差
LabelEncodersort by target meansort by target mediansort by countone-hot encoding
linear0.0004840.0000540.0023070.0001700.000008
random forest0.0003720.0000380.0001810.0002190.000177
LightGBM0.0011110.0000180.0000460.0000920.000494
最小絶対値誤差

考察

線形回帰モデルは決定木モデルに比べ、数値の割り当て方法による精度のばらつきが大きくなりました。

RMSEのばらつき(標準偏差)
linear0.005540
random forest0.001177
LightGBM0.001761

これは「label encodingが適さない機械学習モデル」の節でも述べましたが、整数値の割り当てかたに何らかの意味(大小関係など)がある場合には、線形回帰でも有効なencodingとなりえます。

今回の場合、

  • 目的変数の平均の昇順に0以上の整数を割り振った場合(sort by target mean)
  • 目的変数の中央値の昇順に0以上の整数を割り振った場合(sort by target median)

においては、割り振られた整数値が大きければ大きいほど目的変数が大きくなりやすいという、有効な意味をもつencodingになっているため、線形回帰の中でもよい精度を出せたのだと考えられます。

*別の見方をすると、目的変数の情報をlabel encodingに付したから精度が上がった、と考えることもできます。

一方で、決定木系のモデルである「random forest」「LightGBM」ではencodingの仕方によって精度はほぼ変わっていませんね。

まとめ

まとめると、

  • 線形回帰系のモデルを使う際には、Encodingの方法を吟味すべし。
  • 決定木系のモデルでは、Encoding方法を変えてもあまり意味がない。
  • 1つの方法として「目的変数の平均値に基づくlabel encoding」が有効である。

ただし、用いるデータ等によっていろいろ変わってくると思うので、あらゆる場合にあてはまるわけではないことに注意してください。

参考文献

[1] 門脇大輔,阪田隆司,保坂桂佑,平松雄司:Kaggleで勝つデータ分析の技術,技術評論社(2019),p139.

[2]「カテゴリカル変数はなんでもダミー変換すればよいのか?-アルゴリズムに応じたOne Hot EncodingとLabel Encodingの使い分け」キヨシの命題(2018-12-23)
https://yolo-kiyoshi.com/2018/12/23/post-1016/

この記事は役に立ちましたか?
  • 役に立った 
  • ふつう 
  • 役に立たなかった 

記事への意見・感想はコチラ

タイトルとURLをコピーしました