앙상블

PySpark로 하는 Machine Learning

Andrew Collier

Data Scientist, Fathom Data

앙상블이란?

모델들의 모음입니다.

비슷한 모델들의 모음

군중의 지혜 — 집단의 견해가 단일 전문가보다 더 낫습니다.

PySpark로 하는 Machine Learning

앙상블의 다양성

 

 

 

다양성과 독립성이 중요한 이유는, 최고의 집단 의사결정은 합의나 절충이 아니라 이견과 경쟁에서 나오기 때문입니다.

― James Surowiecki, The Wisdom of Crowds

PySpark로 하는 Machine Learning

랜덤 포레스트

랜덤 포레스트 — 결정 트리의 앙상블

모델 다양성 만들기:

  • 각 트리는 데이터의 무작위 부분집합으로 학습
  • 각 노드에서 분할에 무작위 특성 부분집합 사용

포레스트의 트리들은 서로 달라야 합니다.

나무들의 모음

PySpark로 하는 Machine Learning

여러 트리로 포레스트 만들기

자동차 데이터로 돌아가 봅시다: 미국 생산(0.0) 여부(1.0).

랜덤 포레스트 분류기를 만듭니다.

from pyspark.ml.classification import RandomForestClassifier

forest = RandomForestClassifier(numTrees=5)

학습 데이터에 적합시킵니다.

forest = forest.fit(cars_train)
PySpark로 하는 Machine Learning

트리 확인하기

포레스트 안의 트리에 접근하는 방법은?

forest.trees
[DecisionTreeClassificationModel (uid=dtc_aa66702a4ce9) of depth 5 with 17 nodes,
 DecisionTreeClassificationModel (uid=dtc_99f7efedafe9) of depth 5 with 31 nodes,
 DecisionTreeClassificationModel (uid=dtc_9306e4a5fa1d) of depth 5 with 21 nodes,
 DecisionTreeClassificationModel (uid=dtc_d643bd48a8dd) of depth 5 with 23 nodes,
 DecisionTreeClassificationModel (uid=dtc_a2d5abd67969) of depth 5 with 27 nodes]

각 트리로 개별 예측을 할 수 있습니다.

PySpark로 하는 Machine Learning

개별 트리의 예측

각 트리는 어떤 예측을 내놓나요?

+------+------+------+------+------+-----+
|tree 0|tree 1|tree 2|tree 3|tree 4|label|
+------+------+------+------+------+-----+
|   0.0|   0.0|   0.0|   0.0|   0.0|  0.0| <- 완전 일치
|   1.0|   1.0|   0.0|   1.0|   0.0|  0.0|
|   0.0|   0.0|   0.0|   1.0|   1.0|  1.0|
|   0.0|   0.0|   0.0|   1.0|   0.0|  0.0|
|   0.0|   1.0|   1.0|   1.0|   0.0|  1.0|
|   1.0|   1.0|   0.0|   1.0|   1.0|  1.0|
|   1.0|   1.0|   1.0|   1.0|   1.0|  1.0| <- 완전 일치
+------+------+------+------+------+-----+
PySpark로 하는 Machine Learning

합의 예측

.transform() 메서드로 합의 예측을 생성합니다.

+-----+----------------------------------------+----------+
|label|probability                             |prediction|
+-----+----------------------------------------+----------+
|0.0  |[0.8,0.2]                               |0.0       |
|0.0  |[0.4,0.6]                               |1.0       |
|1.0  |[0.5333333333333333,0.4666666666666666] |0.0       |
|0.0  |[0.7177777777777778,0.28222222222222226]|0.0       |
|1.0  |[0.39396825396825397,0.606031746031746] |1.0       |
|1.0  |[0.17660818713450294,0.823391812865497] |1.0       |
|1.0  |[0.053968253968253964,0.946031746031746]|1.0       |
+-----+----------------------------------------+----------+
PySpark로 하는 Machine Learning

특성 중요도

모델이 사용하는 특성: cyl, size, mass, length, rpm, consumption.

이 중 무엇이 가장/가장 덜 중요할까요?

forest.featureImportances
SparseVector(6, {0: 0.0205, 1: 0.2701, 2: 0.108, 3: 0.1895, 4: 0.2939, 5: 0.1181})

다음과 같습니다:

  • rpm이 가장 중요합니다
  • cyl이 가장 덜 중요합니다.
PySpark로 하는 Machine Learning

그래디언트 부스팅 트리

반복적 부스팅 알고리즘:

  1. 결정 트리를 만들고 앙상블에 추가합니다.
  2. 앙상블로 각 학습 인스턴스의 레이블을 예측합니다.
  3. 예측을 실제 레이블과 비교합니다.
  4. 오예측된 인스턴스의 가중치를 높입니다.
  5. 1로 돌아갑니다.

매 반복마다 모델이 향상됩니다.

PySpark로 하는 Machine Learning

트리 부스팅하기

그래디언트 부스팅 트리 분류기를 만듭니다.

from pyspark.ml.classification import GBTClassifier

gbt = GBTClassifier(maxIter=10)

학습 데이터에 적합시킵니다.

gbt = gbt.fit(cars_train)
PySpark로 하는 Machine Learning

트리 비교

세 가지 트리 모델을 테스트 데이터에서 비교해 봅니다.

# 결정 트리의 AUC
0.5875

# 랜덤 포레스트의 AUC
0.65

# 그래디언트 부스팅 트리의 AUC
0.65

두 앙상블 방법이 단일 결정 트리보다 성능이 높습니다.

PySpark로 하는 Machine Learning

모든 모델을 앙상블하라!

PySpark로 하는 Machine Learning

Preparing Video For Download...