PySpark로 하는 Machine Learning
Andrew Collier
Data Scientist, Fathom Data
모델들의 모음입니다.
군중의 지혜 — 집단의 견해가 단일 전문가보다 더 낫습니다.
다양성과 독립성이 중요한 이유는, 최고의 집단 의사결정은 합의나 절충이 아니라 이견과 경쟁에서 나오기 때문입니다.
― James Surowiecki, The Wisdom of Crowds
랜덤 포레스트 — 결정 트리의 앙상블
모델 다양성 만들기:
포레스트의 트리들은 서로 달라야 합니다.

자동차 데이터로 돌아가 봅시다: 미국 생산(0.0) 여부(1.0).
랜덤 포레스트 분류기를 만듭니다.
from pyspark.ml.classification import RandomForestClassifier
forest = RandomForestClassifier(numTrees=5)
학습 데이터에 적합시킵니다.
forest = forest.fit(cars_train)
포레스트 안의 트리에 접근하는 방법은?
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]
각 트리로 개별 예측을 할 수 있습니다.
각 트리는 어떤 예측을 내놓나요?
+------+------+------+------+------+-----+
|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| <- 완전 일치
+------+------+------+------+------+-----+
.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 |
+-----+----------------------------------------+----------+
모델이 사용하는 특성: 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이 가장 덜 중요합니다.반복적 부스팅 알고리즘:
매 반복마다 모델이 향상됩니다.
그래디언트 부스팅 트리 분류기를 만듭니다.
from pyspark.ml.classification import GBTClassifier
gbt = GBTClassifier(maxIter=10)
학습 데이터에 적합시킵니다.
gbt = gbt.fit(cars_train)
세 가지 트리 모델을 테스트 데이터에서 비교해 봅니다.
# 결정 트리의 AUC
0.5875
# 랜덤 포레스트의 AUC
0.65
# 그래디언트 부스팅 트리의 AUC
0.65
두 앙상블 방법이 단일 결정 트리보다 성능이 높습니다.
PySpark로 하는 Machine Learning