2024. 1. 12. 14:08ㆍTIL
Naive Bayes
y를 우리가 분류하고자 하는 class, X는 input feature라고 하면 P(y|X) = P(X|y)P(y)/P(X)이다. X = [x_1, …, x_n] 일 때 P(x_1, ... ,x_n|y)는 P(x_n|x_n-1, ... ,x_1,y)...P(x_2|x_1,y)P(x_1|y)이다.
이때, 각 feature들이 conditional independent면

이므로 Naive Bayes는 X가 주어졌을 때 feature 간의 conditional independent를 가정하고 Posterior를 최대화하는 y를 예측값으로 결정한다.

# Naive Bayes Classifier
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
# training
gnb.fit(X, y)
# Naive Bayes Classifier evaluation
y_pred = gnb.predict(X_test)
from sklearn.metrics import accuracy_score
print('accuracy: ', accuracy_score(y_test, y_pred))
from sklearn.metrics import precision_score
print('precision: ', precision_score(y_test, y_pred))
from sklearn.metrics import recall_score
print('recall: ', recall_score(y_test, y_pred))
from sklearn.metrics import f1_score
print('f1: ', f1_score(y_test, y_pred))
Evaluation
모델을 제대로 평가하는 metric(지표)을 사용해야 주어진 데이터에 가장 효과적인 모델을 사용할 수 있다. regression 평가 방법은 Mean Squared Error(MSE), Mean Absolute Error(MAE), R-square(결정계수)가 있다.
먼저 Mean Squared Error(MSE)은 오차(틀린 값)의 제곱을 평균으로 나눈 값이다. 0에 가까울수록 좋은 성능이라고 볼 수 있다. 오차값이 큰 데이터점에 대해서 민감하게 반응한다(Outlier에 민감하게 반응).

Mean Absolute Error(MAE)은 오차의 절댓값을 평균으로 나눈 값이다. 0에 가까울수록 좋은 성능이라고 볼 수 있다. 오차값이 큰 데이터점에 대해서 상대적으로 덜 민감하게 반응한다.

R-square(결정계수)는 독립변수 x 가 종속변수 y를 얼마나 잘 설명하는 지를 나타낸다. 전체 y의 평균으로부터 각 y값이 멀리 떨어질수록, 예측한 y값과 실제 y값이 가까울수록 1에 가까워진다. 0~1 사이 값을 가지며, 1에 가까울수록 좋은 성능이라고 볼 수 있다.

# Mean Squared Error
from sklearn.metrics import mean_squared_error
print(mean_squared_error(y_test, y_pred))
# Mean Absolute Error
from sklearn.metrics import mean_absolute_error
print(mean_absolute_error(y_test, y_pred))
# R² Score
from sklearn.metrics import r2_score
print(r2_score(y_test, y_pred))
Classification 평가 방법(evaluation)은 Precision / Recall, F1 score가 있다. Precision은 “positive라고 잡은 샘플 중 몇 개가 실제로 positive인지” , Recall은 “실제로 positive인 샘플 중 몇 개를 positive라고 잡았는지”이다. Precision/recall은 positive
threshold에 따라 조절이 가능하다. False positive가 늘어나는 것이 문제인 경우에는 precision를 높이는 것이 중요하지만, False positive가 늘어나도 어떻게든 positive들을 잡아내야 되는 경우 (e.g. 전염병, 암 진단) recall을 높이는 것이 중요하다.

- Accuracy(정확도) = TP+TN / TP+FP+FN+TN
- Precision(정밀도) = TP / TP+FP
- Recall(재현율) = TP / TP +FN
F1 score은 Precision과 recall을 둘 다 고려한 metric이라고 볼 수 있다.

from sklearn.metrics import accuracy_score
print('accuracy: ', accuracy_score(y_test, y_pred))
from sklearn.metrics import precision_score
print('precision: ', precision_score(y_test, y_pred))
from sklearn.metrics import recall_score
print('recall: ', recall_score(y_test, y_pred))
from sklearn.metrics import f1_score
print('f1: ', f1_score(y_test, y_pred))
PCA(Principal Component Analysis)
PCA는 고차원의(feature가 많은) x에 대해서 주어진 x 들의 분포를 가장 잘 설명하는 x축, y축을 찾아내는 기술이다. x축과 y축을 찾아낸 후, 우리가 가진 데이터를 새로운 x축과 y축에 나타낼 수 있다(특히 feature가 너무 많은 경우). 주로 데이터의 전반적인 분포를 visualization 할 때 매우 유용합니다(Scatter plot 사용). 또한, n_components를 2 이외의 값으로 주어서 모델의 feature 개수를 줄여 효과적인 학습을 할 수도 있다.
# Principal Component Analysis (PCA)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca_model = pca.fit_transform(X_train) #Fit to data, then
transform it
pca_df = pd.DataFrame(columns=['x','y'])
pca_df['x'] = pca_model[:,0]
pca_df['y'] = pca_model[:,1]
pca_df.plot.scatter(x='x', y='y',
c=['b' if z ==0 else 'r' for z in y_train])
Feature Analysis
데이터를 설명하는 feature x와 알아보고자 하는 label y가 있을 때, 어떠한 feature가 y를 설명하는 데에 있어 중요한 feature 인지 아는 것은 매우 중요하다. Logistic regression이나 linear regression, Support vector machine, 그리고 random forest 모두 학습이 된 상태에서 어떠한 feature를 주로 보고 있는지를 보여주는 값들을 가지고 있다. 각 feature들과 label 간의 상관관계 분석을 통해 어떤 feature가 중요한지를 안다면 의사결정 과정에서 큰 도움이 될 수 있다(e.g. 문제를 일으키는 주된 원인이 무엇인지 파악할 경우).
Regression에서의 Linear regression, Classification에서의 Logistic regression 모두 학습이 된 상태에서 .coef_ 와 .intercept_ 를 조회할 수 있다. .coef_는 각 feature들에 대해서 각각 곱해지는 값, .intercept_ 는 절편을 의미한다. coef_의 절댓값이 상대적으로 큰 feature가 있다면, label을 설명하는데 중요한 feature일 수 있다.
# Logistic Regression
from sklearn.linear_model import LogisticRegression
lgr = LogisticRegression()
# training
lgr.fit(X_train, y_train)
lgr.coef_
# array([[-1.74894748e+00, 2.05970508e+00, 6.90864943e-01,-1.13234564e+00, 5.70392800e-01,
# -1.52202120e-03,3.35484430e-01, 2.87431155e-01, 1.24852192e-01,6.05941756e-01]])
lgr.intercept_
# array([-0.489761])
상대적으로 .coef_ 값이 큰 첫 번째, 두 번째 feature에 대해서 label을 color로 주고 scatter plot을 그려보면 두 변수가 label을 설명하는데 중요한 feature일 수도 있다는 것을 알 수 있다.
plt.scatter(X_train[:, 0], X_train[:, 1], marker="o",
c=y_train, s=25, edgecolor="k")
plt.show()

Support vector machine 도 학습이 된 상태에서 .coef_ 와 .intercept_ 를 조회할 수 있다.
# Support Vector Machines (SVM)
from sklearn.svm import SVC
svc = SVC(kernel='linear')
# training
svc.fit(X, y)
svc.coef_
# array([[-1.10086514, 0.96241273, 0.45270636, -0.46822568, 0.21103224,
# 0.24624928, 0.21930329, -0.13029874, -0.22471887, 0.43350556]])
Random forest 모델들에서는 자체적으로 feature importance score를 제공한다. .feature_importances_ 를 통해 각 feature의 importance score를 구할 수 있다.
# Random forest classifier
from sklearn.ensemble import RandomForestClassifier
rfc= RandomForestClassifier(n_estimators=100, max_depth=200)
# training
rfc.fit(X, y)
rfc.feature_importances_
# array([0.25357745, 0.26571728, 0.09979086, 0.17900508,0.02387162,
# 0.02279699, 0.02225427, 0.04759967, 0.02854178, 0.056845])
상관관계 분석
상관관계는 통계적 변인과 다른 여러 통계적 변인들이 공변(共變)하는 함수관계이다. 각 feature들과 label 간의 상관관계 분석을 통해 feature의 중요도를 알아볼 수 있다.
- pearsonr(): 피어슨 상관계수, 두 변수 간의 선형 상관관계의 정도
- spearmanr(): 스피어만 상관계수, 두 변수간의 크기 순서상의 상관관계의 정도
두 상관계수 모두 1/-1에 가까울수록 양/음의 상관관계가 있다고 할 수 있다. 같이 나오는 p-value의 경우 H0: 두 변수는 상관관계가 없다고 하는 가설에 대한 p-value이다.
import scipy.stats as stats
stats.pearsonr(X_train[:,0], y_train)
# (-0.6388501021295765, 6.944360183441342e-10)
stats.spearmanr(X_train[:,0], y_train)
# SpearmanrResult(correlation=-0.6689214712019207, pvalue=5.406591936684204e-11)
공부하며 어려웠던 내용
Naive Bayes에서 여러 조건부확률이 나오니 식을 따라가기 어려웠고 어떻게 활용되는지 직관으로는 이해되지 않았다.
'TIL' 카테고리의 다른 글
| 2. Snowflake 운영과 관리 (0) | 2024.01.23 |
|---|---|
| 1. 데이터 웨어하우스 소개 (1) | 2024.01.22 |
| 데이터 분석 과정 학습 및 시각화 실습(4) (2) | 2024.01.11 |
| 데이터 분석 과정 학습 및 시각화 실습(3)-2 (1) | 2024.01.10 |
| 데이터 분석 과정 학습 및 시각화 실습(3)-1 (1) | 2024.01.10 |