Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 이변량자료
- 이산확률질량함수
- 범주형자료
- 통계학입문
- 확률밀도함수
- 모평균
- 수학적확률
- 포아송분포
- 절삭평균
- jupyter notebook
- 모수
- 균일분포
- 기본행연산
- 피어슨상관계수
- 누적분포함수
- 통계학개론
- 이산형
- 표본평균
- 표본공간
- pmf
- 연속확률변수
- 베르누이분포
- 첨가행렬
- 이항분포
- 행사다리꼴
- 수치형자료
- 사조사
- 조건부확률
- 기댓값과 분산
- Anaconda
Archives
- Today
- Total
summ의 블로그
정리 본문
241004
알고리즘
회귀와 분류에 모두 사용 가능한 알고리즘
- KNN
- 가장 가까운 훈련 데이터 포인트 k개를 찾아 평균을 계산하여 예측에 사용
- 거리 기반 메트릭: 기본적으로 유클리드 거리를 사용하나 특성 공간에 따라 맨해튼 거리, 민코프스키 거리 선택 가능
- KNN 분류: 가장 가까운 K개의 이웃 중 다수결로 가장 많이 등장한 클래스를 예측.
- KNN 회귀: 가까운 K개의 이웃의 평균값으로 회귀값을 예측.
- 특성 스케일링: 변수들을 모두 일정한 범위의 값을 갖도록 변환 필요
- StandardScaler: 표준화 - 값에서 평균을 빼고 표준편차로 나누는 것. 평균 0, 표준편차 1을 기준.
- 데이터가 정규 분포에 가까울 때 적합
- MinMaxScaler: 최대최소화(정규화) - 값에서 최소값을 빼고 최대값과 최소값의 차이로 나누는 것
- 데이터가 정규 분포를 따르지 않거나, 특정 범위로 값이 제한되어야 할 때 적합. 특히 신경망과 같은 모델에서 자주 사용.
- 표준화가 이상치에 더 강함 : 당연함. 이상치는 최대,최소값에 영향을 주기 때문에
- 이상치가 많은 데이터셋이라면, 표준화를 사용한다.
- 사용할 이웃의 수가 커질수록 훈련 데이터에 대한 예측은 좋아짐
- 이해가 쉽고 별다른 노력 없이 좋은 성능을 보이는 경우가 있음
- 훈련과 관계없이 테스트 세트의 정확도는 너무 작거나 너무 크면 좋지 않은 경향이 있기에 적절하게 선택해야 함
- 훈련 세트가 커지면 예측이 느려지고 특성이 많은 경우에는 잘 동작하지 않음
- 희소한(많은 특성이 0인) 데이터에서는 특히 성능이 낮음, 시간 복잡도가 큼
- 추가로 KNN이 연속형 데이터에 더 적합하며, 희소 행렬(Sparse Matrix)을 처리하는 다른 방법, 예를 들어 로지스틱 회귀나 SVM이 더 적합할 수 있음
- 차원의 저주(Curse of Dimensionality) 문제에 취약
- 특성이 많아지면 데이터 간 거리가 멀어지므로, KNN이 유용하게 동작하기 위해서는 특성 차원을 줄이는 차원 축소 기법(PCA, LDA) 등을 사용
- Decision Tree
- 훈련 데이터에 과대 적합 가능성 높음
- 훈련 데이터 범위 밖의 포인트에서는 예측할 수 없음
- 복잡도 제어 max_depth 깊이가 무한하게 깊어지지 않고 적절한 수에서 멈추도록 제한함
- 트리 특성 중요도: 각 특성이 분류에 기여한 정도
- featureimportances, 이 값이 0이면 분류에서 사용되지 않았다는 뜻이나, 다른 특성과 겹쳐서 그럴 수도 있으므로 특성이 의미 없다는 것을 나타내지는 않음
- 앙상블: 여러 머신러닝 모델을 연결하여 더 강력한 모델을 만드는 기법
- 기본적으로 조금씩 다른 여러 결정 트리의 묶음
- 서로 다른 방향으로 과대적합된 트리를 많이 만들어 그 결과를 평균을 냄으로써 과대적합을 줄임
- 배깅 / 부스팅 방식 존재
- 배깅: 여러 약한 학습자를 병렬로 학습시키고, 각각의 예측을 평균화하거나 투표 방식으로 결합하여 최종 예측을 도출하는 방법.각 모델이 독립적으로 학습한 결과를 평균화하거나 투표하는 방식으로 결과를 도출.
- 랜덤 포레스트
- 부스팅: 순차적으로 트리를 만들어 이진트리로부터 더 나은 트리를 만드는 알고리즘
- 중복 허용 x
- 에이다 부스팅, 그래디언트 부스팅, ...
- 부트스트랩 샘플: n개의 data에서 중복을 허용하여 n개를 추출 - 배깅
- 부트스트랩 샘플을 여러 번 (트리의 갯수 만큼) 수행하면 서로 다른 데이터로 이루어진 여러 샘플을 만들 수 있음
- 각 트리는 서로 다른 데이터를 사용할 뿐 아니라, 서로 다른 특성 집합을 사용하도록 함
- 사용할 특성 집합의 수는 max_features로 조정하고 각 트리마다 무작위로 선택
- max_features는 전체 특성 수보다는 적게 설정해야 서로 다른 트리를 만들어낼 수 있음
- 데이터의 다양성을 높여 모델의 일반화 성능을 높이는 데 도움
- 부트스트랩 샘플 크기가 작아지면, 개별 트리의 다양성이 증가함
- 특정 훈련 샘플이 부트스트랩 샘플에 포함될 확률이 낮기 때문
- 크기가 작을수록 전체적인 테스트 성능이 감소함
- 크기가 클수록 과대적합 가능성이 늘어남
- Random Forest
- 결정트리를 배깅하여 다수의 결정 트리들을 학습하는 앙상블 방법
- 랜덤 포레스트는 검출, 분류, 회귀에 사용 가능
- 서로 다른 n개의 부트스트랩 샘플을 사용해 결정 트리를 독립적으로 학습
- 중복을 허용하지 않고 랜덤하게 d개의 특성 선택.
- 정보 이득과 같은 목적함수를 기준으로 최선의 분할을 만드는 특성을 사용해서 노드를 분할
- 특성 선택에서 랜덤성을 추가하여, 특정 특성에 과대적합되는 것을 방지
- 각 트리의 예측을 모아 다수결 투표 voting 로 클래스 레이블 할당
- 결과는 각 트리의 예측을 평균내거나 다수결 투표로 결정
- 트리 개수가 많을수록 계산 비용 증가, 분류기 성능이 좋음
- Support Vector Machine (SVM)
- 두 클래스 간의 결정 경계(hyperplane)를 최적화하는 알고리즘
- 가장 큰 마진을 가진 경계를 찾음
- 선형/ 비선형 분류 문제에 활용
- 커널트릭을 통해 고차원 데이터에서 강력한 성능 발휘
- 마진margin: 양성, 음성 쪽 초평면 사이의 거리를 최대화
- 그래디언트 부스팅 회귀 트리 (Gradient Boosting)
- 결정트리를 부스팅하여 GBM
- GBM 변형 모델로 XGBoost, CatBoost, LightGBM
- 이전 트리(약한 학습기)의 (잔차 오차)오차를 보완하는 방식으로 순차적으로 트리를 생성
- 잔차 오차에 대해 학습하는 새로운 학습기를 추가
- 파라미터에 민감하지만, 랜덤 포레스트보다 더 높은 정확도
- 가장 강력하고 널리 사용하는 모델 중 하나
- 트리 기반 모델은 특성상 희소한 고차원 데이터에는 잘 작동하지 않음
- learning rate 학습율: 각 트리가 오차에 기여하는 정도를 조절
- learning rate가 작아지면 성능은 높아지지만 많은 트리가 필요
- 기본값 0.1
- XGboost
- 시스템 최적화, 알고리즘 강화
- 병렬 처리를 활용하여 리프 노드 나열, 피쳐 계산 동시에 실행 --> 모델 학습 속도 향상
- max_depth 파라미터 적용 후 가지치기에 손실함수 계산, 계산 값에 기반하여 가지치기 여부 결정.
- 라쏘, 릿지 정규화로 페널티를 적용
- 라쏘: 특성 선택 효과
- 릿지: 모든 특성을 활용, 과적합 방지
- early stopping parameter 활용하여 검증 데이터에서 일반화 성능이 향상되지 않을 때 학습을 중단함.
- 과적합 방지를 위한 파라미터 조정 방법
- eta 학습률 낮추기 (반대로 num_boost_round/n_estimators는 높여주기)
- max_depth 낮추기
- min_child_weight 높이기
- gamma 높이기
- subs_ample, colsample_bytree 낮추기
- LightGBM
- XGboost 학습 속도 느림 - 단점 보완: 대용량 데이터에서 메모리 사용 최적화, 학습 속도 향상
- 큰 데이터들을 적은 메모리로 사용 가능
- 과적합에 민감하고, 작은 데이터에 대해 과적합하기 쉬움
- 리프 노드를 중심으로 트리 분할
- level-wise 균형 트리 분할: 트리를 균형 있게 성장
- leaf-wise 리프 중심 트리 분할: 가장 손실이 큰 리프 노드부터 성장. 손실 감소에 집중해 계산 비용을 낮춤
- level-wise보다 트리를 깊게 만들 수 있어 성능은 높지만, 과적합에 취약함
모델 평가
- 안정적인 일반화 성능 측정 방법으로 score 메소드가 제공하는 정확도와 R2 값 이외의 성능 측정 방법
- 일반화 성능을 평가하기 위해 훈련 세트와 테스트 세트로 나누어 한번 평가하는 것보다 안정적이고 뛰어남
- 데이터를 여러 번 반복해서 나누고 여러 모델을 학습
- 교차 검증 cross-validation
- 가장 일반적인 교차 검증 방법은 k-겹 교차검증(k-fole cross-validation)으로 k에 보통 5 또는 10을 사용
- 데이터를 먼저 k개의 fold(부분집합)으로 나눔
- 각각의 폴드를 테스트 세트로 하고 나머지를 훈련 세트로 하여 5번 평가를 반복하여 k개의 정확도를 얻음
- 모든 샘플이 테스트에 한번씩 들어가므로 공정하게 평가됨
- 평가 시간이 더 많이 걸림
- 교차검증 문제점
- 데이터셋을 순서대로 k개의 폴더로 하는 것은 문제 가능성이 있음
- 종속변수가 [0,0,0, 1, 1, 1, 2, 2, 2, ]의 형태로 되어 있다면 세 개의 폴더로 했을 때, 학습이 전혀 되지 않는 결과가 발생
- 해결 방법 1. random shuffling 사용
- 해결 방법 2. stratified k-fold cross-validation 사용
- 계층별 k-겹 교차 검증 stratified k-fold cross-validation
- 계층별 k-겹 교차검증을 할 수 있음
- 각 폴드 안의 클래스 비율이 전체 데이터셋의 클래스 비율과 같도록 데이터를 나눔
- 분류기에 대해서는 계층별 k-겹 교차검증을 사용하는 것이 보다 안정적임
- LOOCV(Leave-one-out cross-validation)
- 폴드 하나에 샘플 하나만 있는 k-겹 교차 검증. 시간이 매우 오래 걸리는 단점이 있음
- 임의분할 교차검증(Shuffle-split cross-validation)
- 중복을 허용하는 샘플링, 매번 훈련-테스트 집합을 만들 때마다 전체 데이터셋에서 랜덤하게 샘플링을 수행
하이퍼 파라미터 튜닝
- Grid Search
- 실험하려는 하이퍼파라미터와 값의 범위를 지정하면, GridSearchCV 는 교차검증을 사용하여 모든 가능한 조합을 수행함
- get_params() : 하이퍼파라미터 수행 전의 하이퍼 파라미터
- 하이퍼 파라미터를 수행할 파라미터들을 한 눈에 확인 가능
- param_grid 파라미터 세트들 리스트, 딕셔너리 형태로 지정
- GridSearchCV 기본 인자
- estimator: 학습 모델 알고리즘, param_grid, scoring, cv, refit: 최적 hp 찾아서 estimator 재학습
- GridSearchCV객체.best_params_ : 최적 하이퍼 파라미터의 조합
- GridSearchCV객체.best_score_ : 최고 평균 정확도 수치
- GridSearchCV객체.cv_resutls_ : 하이퍼파라미터 조합 학습, 평가 기록한 딕셔너리
- GridSearchCV객체.best_estimator_ : refit True 로 최적의 hp 적용하여 학습이 된 상태
- pred = estimator.predict(X_test)
- 'score: ', round(accuracy_score(y_test,pred), 4) 정확도 파악 가능
- 시간이 오래 걸린다는 단점 존재
- Random Search
- estimator, param_distributions, *, n_iter=10, scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', random_state=None, error_score=nan, return_train_score=False)
- GridSearchCV 단점 보완 가능
- 모든 조합이 아닌, 각 반복마다 임의의 값만 대입하여 지정 횟수만큼 평가
- 몇 번 학습과 평가를 반복할 것인지 시도의 수를 우리가 설정할 수 있기 때문에 비교적 시간이 적게 걸림: 파라미터가 많다면 더 효율적임
- params_distributions 파라미터 딕셔너리 형태로 넣음
- n_iter 파라미터 검색 횟수
- RandomizedSearchCV변수.cv_results_['mean_test_score']: 테스트로 얻은 조합 성능
- RandomizedSearchCV변수.best_params_: 최적의 하이퍼 파라미터 값
- RandomizedSearchCV변수.best_score_: 최적의 하이퍼파라미터 값의 성능
'머신러닝' 카테고리의 다른 글
머신러닝 기초 (4) (0) | 2024.10.02 |
---|---|
머신러닝 기초 (3) (1) | 2024.10.02 |
머신러닝 기초 (2) (0) | 2024.09.27 |
머신러닝 기초 (0) | 2024.09.27 |
[ml] 간단한 정리 (3) (0) | 2024.07.10 |