SparkML은 대규모 데이터를 처리하는 머신러닝 라이브러리로, 모델 학습과 예측을 지원합니다. 모델의 성능을 평가하는 것은 중요한데, 이를 통해 예측 정확도나 클러스터링 성능을 확인하고 개선할 수 있습니다. 다양한 평가 지표를 제공하여 모델을 최적화하고, 데이터 기반 의사결정을 돕습니다.


Regression

RMSE

RMSE(Root Mean Squared Error, 평균 제곱근 오차)는 예측값과 실제 값의 차이를 제곱하여 평균을 구한 후, 그 제곱근을 취한 값입니다. 이 값이 작을수록 모델의 예측 정확도가 높다는 것을 의미합니다. RMSE는 오차의 크기를 직관적으로 나타내는 데 유용합니다. 값이 0에 가까울수록 모델의 예측이 더 정확하다는 의미입니다.

from pyspark.ml.evaluation import RegressionEvaluator

evaluator = RegressionEvaluator(labelCol="value", predictionCol="prediction", 
                                metricName="rmse")
rmse = evaluator.evaluate(predictions)
print(f"RMSE: {rmse}")
RMSE: 1.43037925984368e-12

R²(R-squared, 결정 계수)는 모델이 데이터의 분산을 얼마나 잘 설명하는지 나타내는 지표로, 1에 가까울수록 모델이 데이터를 잘 설명하는 것입니다. 0에 가까운 값은 모델이 데이터의 변동성을 거의 설명하지 못함을 의미합니다. 는 모델의 적합도를 평가하는 데 유용합니다.

from pyspark.ml.evaluation import RegressionEvaluator

evaluator = RegressionEvaluator(labelCol="value", predictionCol="prediction", 
                                metricName="r2")
r2 = evaluator.evaluate(predictions)
print(f"R²: {r2}")
R²: 1.0

MAE

MAE(Mean Absolute Error, 평균 절대 오차)는 예측값과 실제 값의 차이를 절대값으로 계산하여 그 평균을 구한 값입니다. 값이 0에 가까울수록 모델의 예측이 더 정확하다는 의미입니다. MAE는 예측값의 정확성을 직관적으로 보여주며, 제곱 오차가 아닌 절대 오차를 사용하여 큰 오차에 대해 과도한 패널티를 주지 않습니다.

from pyspark.ml.evaluation import RegressionEvaluator

evaluator = RegressionEvaluator(labelCol="value", predictionCol="prediction", 
                                metricName="mae")
mae = evaluator.evaluate(predictions)
print(f"MAE: {mae}")
MAE: 1.0708356070730839e-12

MSE

MSE(Mean Squared Error, 평균 제곱 오차)는 예측값과 실제 값의 차이를 제곱하여 평균을 구한 값입니다. RMSE와 유사하지만, 제곱근을 취하지 않기 때문에 값이 작을수록 더 좋은 모델입니다. MSE는 큰 오차에 대해 더 큰 패널티를 부여하여, 큰 오차를 줄이는 데 중요한 역할을 합니다.

from pyspark.ml.evaluation import RegressionEvaluator

evaluator = RegressionEvaluator(labelCol="value", predictionCol="prediction", 
                                metricName="mse")
mse = evaluator.evaluate(predictions)
print(f"MSE: {mse}")
MSE: 2.045984826990954e-24

Classification

Accuracy

Accuracy(정확도)는 전체 데이터 중에서 정확하게 분류된 데이터의 비율을 의미합니다. 모델이 예측한 값이 실제 값과 얼마나 일치하는지를 나타내는 지표로, 값이 1에 가까울수록 모델이 잘 분류한 것입니다. 그러나 클래스 불균형이 심한 경우에는 정확도가 높은 것만으로는 좋은 모델이라고 평가할 수 없습니다.

from pyspark.ml.evaluation import MulticlassClassificationEvaluator

evaluator = MulticlassClassificationEvaluator(labelCol="value", predictionCol="prediction", 
                                              metricName="accuracy")
accuracy = evaluator.evaluate(predictions)
print(f"Accuracy: {accuracy}")
Accuracy: 0.8162251655629139

Precision

Precision(정밀도)는 모델이 예측한 Positive 클래스 중에서 실제로 Positive인 데이터의 비율을 의미합니다. 값이 1에 가까울수록 모델이 예측한 Positive가 실제로 맞았다는 뜻입니다. 정밀도는 모델이 얼마나 정확하게 긍정적인 예측을 했는지를 평가하는 지표입니다.

from pyspark.ml.evaluation import MulticlassClassificationEvaluator

evaluator = MulticlassClassificationEvaluator(labelCol="value", predictionCol="prediction", 
                                              metricName="weightedPrecision")
precision = evaluator.evaluate(predictions)
print(f"Precision: {precision}")
Precision: 0.8170603530840838

Recall

Recall(재현율)은 실제 Positive 클래스 중에서 모델이 예측한 Positive의 비율을 의미합니다. 값이 1에 가까울수록 모델이 실제 Positive를 잘 잡았다는 뜻입니다. 재현율은 모델이 실제 긍정적인 예시를 얼마나 잘 식별했는지를 나타냅니다.

from pyspark.ml.evaluation import MulticlassClassificationEvaluator

evaluator = MulticlassClassificationEvaluator(labelCol="value", predictionCol="prediction", 
                                              metricName="weightedRecall")
recall = evaluator.evaluate(predictions)
print(f"Recall: {recall}")
Recall: 0.8162251655629139

F1

F1-scorePrecisionRecall의 균형을 맞춘 값입니다. 정밀도와 재현율이 둘 다 높을 때 F1-score도 높습니다. F1-score는 두 지표가 잘 맞는지를 평가하며, 값이 1에 가까울수록 모델이 잘 동작한다는 뜻입니다. 주로 정밀도와 재현율의 균형이 중요한 상황에서 유용합니다.

from pyspark.ml.evaluation import MulticlassClassificationEvaluator

# F1-score 계산
evaluator = MulticlassClassificationEvaluator(labelCol="value", predictionCol="prediction", 
                                              metricName="f1")
f1_score = evaluator.evaluate(predictions)
print(f"F1-score: {f1_score}")
F1-score: 0.815993482890897

AUC

AUC (Area Under the Curve, 곡선 아래 면적)ROC Curve 아래 면적을 의미합니다. AUC는 모델의 분류 성능을 평가하는 지표로, 값이 1에 가까울수록 모델이 잘 예측했다는 의미입니다. AUC가 0.5이면 모델이 랜덤 예측을 하는 것과 같고, 1에 가까울수록 매우 좋은 모델로 평가됩니다.

from pyspark.ml.evaluation import BinaryClassificationEvaluator

evaluator = BinaryClassificationEvaluator(labelCol="value", rawPredictionCol="prediction", 
                                          metricName="areaUnderROC")
auc = evaluator.evaluate(predictions)
print(f"AUC: {auc}")

AUC: 0.815708660985534

Clustering

Silhouette

Silhouette Score는 클러스터링 결과가 얼마나 잘 분리되었는지 평가하는 지표입니다. 각 데이터 포인트가 자신이 속한 클러스터와 얼마나 가까운지, 그리고 다른 클러스터와 얼마나 멀리 떨어져 있는지를 기반으로 점수를 계산합니다. 값은 -1에서 1 사이로, 값이 1에 가까울수록 클러스터가 잘 분리되었다는 의미입니다.

from pyspark.ml.evaluation import ClusteringEvaluator

evaluator = ClusteringEvaluator()
silhouette = evaluator.evaluate(predictions)
print(f"Silhouette Score: {silhouette}")
Silhouette Score: 0.7475653709556944

References