지도 학습 알고리즘
1. 회귀(Regression) : 임의의 어떤 숫자를 예측하는 문제(두 변수 사이의 상관관계를 분석하는 방법))
2. 분류(Classification) : 추측하고자 하는 결과가 이름이나 문자면 분류(샘플을 몇 개의 클래스 중 하나로)
회귀
○ 결정계수(R^2) = 1 - { (타깃 - 예측)^2의 합 / (타깃 - 평균)^2의 합 }
○ 과대적합(overitting) : 훈련 세트에만 적합한 모델
○ 과소적합(underfitting) : 테스트 점수가 높게 나오는 경우 or 두 점수 모두 낮은 경우
● 과소적합 발생 이유 : 데이터의 수가 적은 경우
● 과소적합 줄이는 법 : 모델을 복잡하게 만들기
○ 선형 회귀 (Linear Regression)
● 비교적 간단 & 성능이 뛰어난 편
● coef_ 속성 : 머신러닝의 기울기 = 계수 | 가중치
○ 다항 회귀 (Polynomial Regression)
● 다항식을 사용해 특성과 타킷 사이의 관계를 나타낸 선형 회귀
○ 다중 회귀 (Multiple Regression)
● 여러 개의 특성을 사용한 선형 회귀
● 특성의 갯수가 증가하면 선형 모델은 아주 강력해짐
But 훈련 세트에 과대적합하게 되어 테스트 점수가 떨어짐
- 그러면 어떻게 과대적합을 줄이냐?
○ 규제(Regularization)
● 선형 회귀 모델의 경우 : 특성에 곱해지는 계수(기울기) 크기를 작게 만드는 일
- 어떻게 진행해야 하나?
1. 정규화(계수 값의 크기를 비슷하게 해 주기) e.g. StandardScaler
2. 규제 주고 모델 훈련
● 릿지(Ridge) 회귀
- sklearn.linear_model vozlwl dksdp dlTdma
- alpha 매개변수로 규제의 강도를 조절
그러면 어떻게 적절한 alpha 값을 찾나요?
0.001 ~ 100 까지 10배씩 늘리면서 훈련/테스트 그래프 그려보기
그래프에서 두 그래프가 가장 가깝고 테스트 점수가 가장 높은 부분을 alpha값으로 선정
- sag : 확률적 평균 경사 하강법 알고리즘(특성과 샘플 수가 많을 때 성능이 빠르고 좋음)
● 라쏘(Lasso) 회귀
- 릿지를 라쏘로 바꿔주기만 하면 라쏘랑 똑같이 진행하면 됨
- 릿지와 차이 : 계수 값을 아예 0으로 만들 수도 있음(= 중요한 변수 선택이 가능하다)
- max_iter : 알고리즘 수행 반복 횟수 지정
● 릿지와 라쏘의 사용 구분
- 릿지 : 모든 변수를 유지하고 싶을 때 사용하고 다중공선성이 존재하는 데이터에 유용
* 다중공선성 : 독립변수들 간의 상관관계가 높을 때
- 라쏘 : 많은 특성 중 중요한 특성을 선택할 때
○ 엘라스틱넷(Elastic net) : 릿지와 라쏘 회귀를 혼합한 방법
● 코드 예시
from sklearn.linear_model import Ridge, Lasso, ElasticNet
# 릿지 회귀
ridge = Ridge(alpha=1.0)
# 라쏘 회귀
lasso = Lasso(alpha=0.1)
# 엘라스틱넷
elasticnet = ElasticNet(alpha=0.1, l1_ratio=0.5) # l1_ratio는 L1과 L2 패널티의 비율 조정
[분류]
로지스틱 회귀
: 이름은 회귀이지만 분류 모델, 선형 회귀와 동일하게 선형 방정식 학습
○ 방정식
● z는 어떤 값도 가능하지만 확률이 되려면 0 ~ 1로 바꿔줘야 함
- 그러면 어떻게 바꿔줘야 하나? 시그모이드 함수 or 로지스틱 함수를 사용
○ 시그모이드 함수
z = a * (weight) + b * (Length) + c * (Diagonal) + .... + f
● 로지스틱 회귀로 이진 분류 수행(True | False; 불리언 인덱싱)
● 로지스틱 회귀로 다중 분류 수행
- LogisticRegression 클래스 : 기본적으로 릿지 회귀와 같이 계수 제곱을 규제(L2 규제)
- 다중 분류의 경우 z 값이 n 개가 나오고 n개의 z값을 확률로 변환이 필요함
어떻게? 소프트맥스 함수(Softmax function)
○ 소프트맥스 함수 : 여러 개의 선형 방정식의 출력값을 0 ~ 1 사이로 압축하고 전체 합이 1이 되도록 지수 함수를 사용
○ 확률적 경사 하강법(Stochastic Gradient Descent)
● 훈련 세트에서 랜덤 하게 하나의 샘플을 선택해 손실 함수의 경사를 따라 최적의 모델을 찾는 알고리즘
● 점진적 학습 방법의 대표적인 알고리즘
* 점진적 학습법 : 훈련한 모델을 안 버리고 새로운 데이터에 대해서만 조금씩 훈련
● 훈련 세트에서 랜덤하게 하나의 샘플을 선택하여 가파른 경사를 조금 내려가는 방법을 전체 샘플을 사용할 때까지
만약 산(= 손실함수)을 내려오지 못하면? 다시 처음부터 랜덤하게 하나의 샘플을 선택하여 이어서 경사 내려감
만족할만한 위치에 도달할 때까지 에포크를 반복
* 에포크(epoch) : 확률적 경사 하강법에서 훈련 세트를 한 번 모두 사용하는 과정
* 손실 함수 : 머신러닝 알고리즘이 얼마나 엉터리인지 측정하는 기준
● 종류
- 미니배치 경사 하강법 : 여러 개의 샘플을 사용해 경사하강법을 진행
- 배치 경사 하강법 : 한 번 경사로를 따라 이동하기 위해 전체 샘플을 사용하는 것
● 신경망 알고리즘에서 확률적 경사 하강법이나 미니 배치 경사 하강법을 사용
○ 로지스틱 손실 함수(Logistic loss function; 이진 크로스엔트로피 손실 함수)
● 다중분류에서 사용하는 손실함수
● 양성클래스(타깃 = 1) 일 때 손실 = -log(예측확률)
● 음성클래스(타깃 = 0) 일 때 손실 = -log(1- 예측확률)
○ SDGClassifier : 확률적 경사 하강법을 사용한 분류 모델
● scikit-learn 패키지 안의 모듈
○ 에포크와 과대/과소적합
● 적은 에포크 = 훈련 횟수가 적음 → 과소적합된 모델일 가능성이 큼
● 많은 에포크 = 훈련 횟수가 많음 → 과대적합된 모델일 가능성이 큼
○ 힌지손실(hinge loss)
● hinge : loss 매개변수의 기본 값
● 서포트 벡터 머신(Support vector machine)의 알고리즘을 위한 손실 함수
○ 결정 트리 모델(Decision Tree)
● 질문을 하나씩 던져 정답을 맞혀가며 학습하는 알고리즘(비교적 예측 과정 이해가 쉬움)
● 불순도(impurity) : 최적의 질문을 찾기 위한 기준
* 지니 불순도, 엔트로피 불순도
● 가지치기 : 트리의 최대 깊이를 지정해 주는 것
● 장점 : 표준화 전처리를 따로 해줄 필요가 없음 why? 특성값의 스케일은 결정 트리
어떤 특성이 가장 유효한지 특성 중요도를 계산해 줌
○ 교차 검증
● 검증 세트 : 전체 = 훈련 60% + 검증 20% + 테스트 20%
● 검증 세트를 생성한다고 훈련 세트가 감소
● 교차 검증을 통해 안정적인 검증 점수와 더 많은 데이터를 훈련
● 모든 폴드에 대해 검증 점수를 얻어 평균하는 방법을 사용
● Scikit-learn에서 cross_validate() 함수의 폴드 나누기
- 회귀 모델 : KFold 분할기 사용
- 분류 모델 : StratifiedKFold 사용
# cross_validate
scores = cross_validate(dt, train_input, train_target)
print(np.mean(scores['test_score']))
# StratifiedKFold
from sklearn.model_selection import StratifiedKFold
scores = cross_validate(dt, train_input, train_target, cv=StratifiedKFold())
print(np.mean(scores['test_score']))
○ 하이퍼파라미터 튜닝 : 사용자 지정 파라미터
● 매개변수가 많아지면 하나하나 정해주기 힘들다.
● AutoML : 하이퍼파라미터 튜닝을 자동으로 수행하는 기술
● GridSearchCV : 사이킷런 의 클래스로 하이퍼파라미터 탐색과 교차 검증을 한 번에 수행
* n_jobs 매개변수 : CPU 코어 수를 지정
- 과정 : 탐색할 매개변수 지정 → 훈련 세트에서 그리드 서치 수행
→ 최상의 평균 검증 점수가 나오는 매개변 수 조합 찾기 → 전체 훈련 세트를 사용해 최종 모델 훈련
from sklearn.model_selection import GridSearchCV
params = {'min_impurity' : [0.0001, 0.0002, 0.0003, 0.0004, 0.0005]}
gs = GridSearchCV(DecisionTreeClassifier(random_state = 42), params, n_jobs= -1)
- 최상의 매개변수 조합 확인 및 교차 검증 점수 확인
gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=1)
gs.fit(train_input, train_target)
# 매개변수 조합확인
print(ge.best_params_)
# 교차검증 점수 확인
print(np.max(ge.cv_results_['mean_test_score']))
● 랜덤 서치(Random Search)
: 매개변수 값의 목록을 전달하는 것이 아니라 매개변수를 샘플링할 수 있는 확률 분포 객체를 전달
수동으로 매개변수를 바꾸는 것이 아니라 그리디 서치나 랜덤 서치를 이용하여 바꾸는 것이 편함
○ 앙상블 학습(ensemble learning)
● 랜덤 포레스트(Random Forest) : 각 결정 트리를 랜덤 하게 만들어 각 결정 트리의 예측을 사용해 최종을 만듦
- 각 트리를 훈련하기 위한 데이터를 만드는 방법
- 부트스트랩 사용 : 전체 데이터 중에 한 개를 선택하고 다시 전체 데이터 중에 1개를 선택(즉, 중복이 가능)
전체 특성 개수의 제곱근만큼의 특성을 선택
* If 4개의 특성 존재 then 노드마다 2개를 랜덤 하게 선택
* But 회귀 모델(RandomForestRegressor)은 전체 특성을 사용
● 엑스트라 트리(Extra Trees) : 랜덤 포레스트와 비슷하게 동작
부트스트랩 샘플을 사용하지 않는 대신 랜덤 하게 노드 분할(과대적합 감소)
- splitter='random' : 엑스트라 트리가 사용하는 결정 트리
- ExtraTreesClassifier
- 랜덤하게 노드를 분할하기 때문에 무작위성이 강함. 하지만 더 많은 결정 트리를 훈련해야 하는 단점이 존재
- 회귀버전 : ExtraTreesRegressor 클래스
● 그레디언트 부스팅(Gradient Boosting) : 깊이가 얕은 결정 트리를 사용하여 트리의 오차를 보완하는 방법
- GradientBoostingClassifier
- 과대적합에 강하고 일반적으로 높은 일반화 성능 기대 가능
- 경사 하강법을 사용하여 트리를 앙상블에 추가(손실함수를 최소화하는 앙상블 방법)
- 분류 : 로지스틱 손실 함수 사용 / 회귀 : 평균 제곱 오차 함수 사용
- n_jobs 매개변수가 없음
● 히스토그램 기반 그레디언트 부스팅(Histogram-based Gradient Boosting)
: 정형 데이터를 다루는 머신러닝 알고리즘 중 가장 인기가 높은 알고리즘
- 대표적인 라이브러리 : XGBoost, LightGBM(MS 제작)
- 입력 특성을 256개의 구간으로 나눔 So, 최적의 분할을 매우 빠르게 찾을 수 있음
- 트리 개수 지정하는데 (n_estimators) 대신 부스팅 반복 횟수 지정(max_iter) 사용
'Networks > 데이터 분석 및 AI' 카테고리의 다른 글
SK networks AI Camp - 인공 신경망 (3) | 2024.09.02 |
---|---|
SK networks AI Camp - 비지도 학습 (0) | 2024.08.31 |
SK networks AI Camp - 평가 지표 (0) | 2024.08.26 |
SK networks AI Camp - Data Encoding (0) | 2024.08.23 |
SK networks AI Camp - Machine Learning (2) | 2024.08.23 |