의사 결정 트리를 만들 때 데이터 이산화에 대해

ID3에 의한 의사결정 트리 생성은 숫자 데이터를 처리할 수 없습니다.



숫자 데이터의 100,10,1이 있다고 가정합니다. 다음과 같은 관계가 있습니다.
100 >> 10 > 1

수치 데이터 이외에는, 예를 들어, 문자형의 데이터(명의 척도라고도 불립니다)가 있어, 100,10,1을 문자로서 취급하면 다음과 같이 됩니다.
"100"≠ "10"≠ "1"

"큰, 작다"라는 정보가 사라질 뿐만 아니라 10은 100보다 1에 가깝다는 정보도 사라져 버립니다.

이산화 없이 ID3로 의사결정 트리를 만들 때의 문제점



다음과 같은 데이터가 있다고 가정합니다.


이 데이터로부터, 파이썬으로 0부터 의사결정 트리를 만들어 이해한다(1. 개요편) 에 의해 의사결정 트리를 작성하면(자), 다음과 같이 됩니다.

골프 0은 골프에 가고, ×는 가지 않으면 골프에 가는 날씨가 가장 중요하고, 맑으면 다음은 습도, 비가면 바람이 다음에 중요해진다는 것을 알 수 있습니다.

한편, 온도를 이산화하지 않고 수치 데이터 그대로, 마찬가지로 의사 결정 트리를 작성해 보겠습니다.


결과는 다음과 같습니다.


온도는, 29도 이외는 모두 단독의 값이기 때문에, 각각의 온도시에 골프에 가는/가지 않는 것이 결정됩니다. 아마도이 의사 결정 트리를 보더라도 사람이 뭔가를 깨닫는 것은 어렵습니다.

수치 데이터를 그룹화하여 문자형 데이터로 나누는 것을 이산화라고 합니다



일반적으로는, 데이터의 수치를 등간격으로 분할해 이산화하는 방법, 데이터의 수를 똑같이 분할하는 등 빈도의 방법이 있습니다.


등 간격으로 데이터를 이산화



예를 들어 위와 같은 데이터의 경우 데이터에서 이산화된 문자로 변환하는 계산식은 다음과 같습니다.
# math.floor (小数点以下の切り捨て)を使うために、インポートします。
import math

# この数値を、これから離散化します。
values = [1,5,7,11,12,14,19,20]

# span変数の間隔内にある数値は、同じラベルの数値として離散化します。
span = 10

# 離散化後の各グループの名前を決めておきます。
labels = ["小さい方","大きい方"]

# 離散化する計算式は、 「( x - 最小値 ) / 1グループの大きさ」として結果の小数点を切り捨てます。
# そこでまず最初に「最小値」を求めておきます。
mi = min(values)

# map関数によって、values配列の各値を離散化します。listは、mapの結果からリスト(配列)を作るというものです。
discretized_values = list(map(lambda x:labels[math.floor((x-mi)/span)],values))

# 以下のように離散化後のデータが作成されます。
print(discretized_values)
# ['小さい方', '小さい方', '小さい方', '大きい方', '大きい方', '大きい方', '大きい方', '大きい方']

등 빈도로 데이터를 이산화


# math.floor (小数点以下の切り捨て)を使うために、インポートします。
import math

# この数値を、これから離散化します。
values = [1,5,7,11,12,14,19,20]

# n変数の個数だけ1つのグループにして、離散化します。
n = 4

# 離散化後の各グループの名前を決めておきます。
labels = ["最初の方","後の方"]

# 離散化する計算式は、配列の添え字(インデックス)を i として、「i / n」として小数点を切り捨てます。
# [ x for i in range(n) ] はリストの内包表記というもので、forを使って配列を生成、初期化するものです。
discretized_values = [labels[math.floor(i/n)] for i in range(len(values))]

# 以下のように離散化後のデータが作成されます。
print(discretized_values)
# ['最初の方', '最初の方', '最初の方', '最初の方', '後の方', '後の方', '後の方', '後の方']

독자적으로 데이터를 분류하고 이산화



지금까지의 두 가지 예는 객관적인 관점에 서서 데이터를 이산화해 왔습니다. 한편, 데이터의 의미를 고려하여 이산화하는 방법도 있습니다.

예를 들어 한 게임에서의 랭킹에 영향을 주는 요소를 분석하고 싶은 경우, 그 랭킹을 1위, 2위와 같은 수치 데이터가 아니라, 랭킹 상위, 하위와 같이 이산화하는 것이 좋지만, 이 「랭킹 상위」는, 자의적으로 결정할 수도 있습니다. 1위에서는 없으면 의미가 없다고 생각한다면, 1위와 그 이외로 이산화화해도 좋을 것입니다. 또, 2분할이 아니고, 랭킹 상위, 중위, 하위로 나누어도 좋을 것입니다.

참고



자동으로 숫자 데이터를 이산화하여 의사 결정 트리를 만드는 C4.5 1이라는 알고리즘이 알려져 있습니다. 이 알고리즘을 사용하는 것도 데이터를 이산화하는 한가지 방법이지만, 결과의 의사결정 트리가 복잡해지기 쉽기 때문에, 스스로 매뉴얼로 데이터를 이산화하는 방법이 취해질 수도 있습니다.



Quinlan, J. R.: C4.5: Programs for Machine Learning. Morgan Kaufmann Publishers, (1993). 

좋은 웹페이지 즐겨찾기