Python/Machine Learning

[Python ML]서포트 벡터 머신(SVM)_SVC/SVR, 나이브 베이즈(Naive Bayes)_GaussianNB/BayesianRidge

sohyunkimmm 2023. 1. 20. 15:55
728x90

* 서포트 벡터 머신(SVM; Support Vector Machine)

- '초평면을 활용한 분류모형'

- 데이터를 선형으로 분리하는 최적의 선형 결정 경계를 찾는 알고리즘. 알고리즘의 목표는 클래스가 다른 데이터들을 '가장 큰 마진(margin)'으로 분리해내는 선 또는 면(=초평면)을 찾아내는 것

- 마진(margin): 두 데이터 군과 결정 경계가 떨어져있는 정도

 

가장 데이터를 잘 분류해낸 선은 H3. 마진(margin)이 가장 크기 때문

 

마진, 결정경계, 서포트 벡터

 

- 대부분의 데이터는 이상적으로 분리되어 있지 않음. 많은경우 이상치(outlier)들이 관측됨.

- 이런 경우 데이터를 선형적으로 완벽하게 분리하는 것은 불가능함. 이를 해결하기 위해 약간의 오류를 허용하는 파라미터 = 'C' (cost)

- 낮은 C값: 데이터샘플이 다른 클래스에 놓이는 것을 많이 허용 (일반적인 결정경계 찾아냄)

   ➡️ 과소적합(underfitting) 가능성

- 높은 C값: 데이터 샘플이 다른 클래스에 놓이는 것을 적게 허용 (더 세심하게 결정경계 찾아냄)

   ➡️ 과대적합(overfitting) 가능성

- 적합한 C값을 찾아내는 것이 중요하다!

대부분의 데이터는 이상적으로 분리되어 있지 않음(이상치 관측). 약간의 오류를 허용하는 전략: C(Cost)

 

- gamma하나의 데이터 샘플이 영향력을 행사하는 거리를 결정함. 

- gamma가 클수록 한 데이터 포인터들이 영향력을 행사하는 거리가 짧아지고, gamma가 낮을수록 커짐 

- gamma 매개변수는 '결정경계의 곡률을 조정한다'고 볼 수 있음

- C와 마찬가지로 너무 낮으면 과소적합, 너무 높으면 과대적합의 위험이 있음

C와 gamma의 영향

 

SVM 학습내용,사진 출처: https://bskyvision.com/entry/%EC%84%9C%ED%8F%AC%ED%8A%B8-%EB%B2%A1%ED%84%B0-%EB%A8%B8%EC%8B%A0SVM%EC%9D%98-%EC%82%AC%EC%9A%A9%EC%9E%90%EB%A1%9C%EC%84%9C-%EA%BC%AD-%EC%95%8C%EC%95%84%EC%95%BC%ED%95%A0-%EA%B2%83%EB%93%A4-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98-C%EC%99%80-gamma

 

 

* SVM 코딩하기

1. SupportVectorClassifier(SVC)

- Y = '이탈여부' ➡️ 분류형

- 데이터 분할 - (데이터 표준화) - 데이터 밸런싱 - 모델 생성 - 모델 적용 - 결과값 도출

- SVC모델 생성: SVC_model = SVC(C = 1, random_state = 0)

- 결과값 확인: accuracy, classification_report

SVC Model_SupportVectorClassifier

 

2. SupportVectorRegression(SVR)

- Y = '1회 평균매출액' ➡️ 연속형

 

- Y에 로그 씌우기 -> 데이터 적합 방지, 성능이 좋게 구해지게 만들기 위해

- 데이터 분할 - 데이터 표준화 - 모델 생성 - 모델 적용 - 결과값 도출

- SVR 모델생성: SVR_Model = SVR(C = 1, Kernel = "linear", epsilon = 0.1)

- 결과값 확인: accuracy, RMSE

SVR Model_SupportVectorRegression

 

 

 

* 나이브 베이즈(Naive Bayes)

- '나이브(Naive)': feature들이 서로 '확률적으로 독립(independent)'을 가정하고 있기 때문에 붙인 네이밍

- 특징(feature)이 너무 많은 경우, 이 특징들간의 연간 관계를 모두 고려하게되면 너무 복잡해지기 때문에, '단순화'시켜 쉽고 빠르게 판단을 내릴 때 주로 사용됨

- 나이브 베이즈를 통해 구하고자 하는 것?

분류분석의 경우, '특정 개체 x를 보고 특정 그룹 y에 속할 확률을 추정하는것' : p(class|data)

 

출처: https://becominghuman.ai/naive-bayes-theorem-d8854a41ea08
베이지안 이론을 통해 도출된 식

 

<나이브 베이즈의 예시>

출처: http://www.cs.ucr.edu/~eamonn/CE/Bayesian%20Classification%20withInsect_examples.pdf

여자 Drew, 남자 Drew
Drew라는 이름을 가지고 있는 사람을 남자그룹, 여자그룹으로 나누었을 때,&nbsp;임의의 Drew가 남자그룹에 속할 확률의 식

 

 

Q) 경찰관 Drew씨는 남자일까 여자일까? 

 

 

 

- Bayes 법칙에 따라, 분모에 위치하는 p(Drew)는 두 경우 모두 동일하므로, 분자만 계산하여 비교해봤을 때,

p(male|Drew) = 0.125

p(female|Drew) = 0.25

 

- 따라서, Drew라는 이름을 쓰는 경찰관은 '여성일 확률이 높다'라고 할 수 있다. 

경찰관 Drew씨는 여자였다!

 

 

* Naive Bayes 코딩하기

1. GaussianNB

- Y = '할인민감여부' ➡️ 분류형

- 데이터 분할 - (데이터 표준화) - 데이터 밸런싱 - 모델 생성 - 모델 적용 - 결과값 도출

- NB모델 생성: NB_Model = GaussianNB(var_smoothing = 0)

- 결과값 확인: accuracy, classification_report

GaussianNB Model

 

2. BayesianRidge

- Y = '평균 구매주기' ➡️ 연속형

 

- Y에 로그 씌우기 -> 데이터 적합 방지, 성능이 좋게 구해지게 만들기 위해

- 데이터 분할 - (데이터 표준화) - 모델 생성 - 모델 적용 - 결과값 도출

- BayesianRidge 모델생성: NB_midel_reg = BayesianRidge(alpha_1 = 0.001, lambda_1 = 0.001)

- 결과값 확인: accuracy, RMSE

BayesianRidge Model

 

 

(여담)

내 블로그에서 가장 많은 시간을 할애한 이번 포스팅.. 

728x90
반응형