인공지능/머신러닝

ML 빠른 정리

차가운오미자 2021. 6. 15. 10:55

Preprocessing

Label encoder

이름으로 되어있는 것들을 숫자로, 혹은 그 반대로 변환해줌

 

One hot encoder

가변수 (dummy variable) 범주형 변수를 0 또는 1값을 가진 하나 이상의 새로운 특성으로 바꾼 것.

예를 들어, '성별' 이라는 특성이 있었다면 여성, 남성 이라는 특성을 만들고 각 데이터별로 여성이면 여성1, 남성0, 남성이면 반대. 이런식으로 데이터를 변경해준단 뜻인듯

 

Standardization

특성들이 모두 비슷한 영향력을 행사하도록 값을 변환해주는 기술

ex) 1000 점 만점인 시험에서 90점과 100점 만점인 시험에서 90점은 다르다는 것

cf) Normalization: 값의 범위를 0~1로 옮긴다.

표준화는 정규분포의 표준화 공식을 이용한다. 표준화는 어떤 특성의 값들이 정규분포, 즉 종모양의 분포를 따른다고 가정하고 값들을 0의 평균, 1의 표준편차를 갖도록 변환해주는 것이다.

 

PCA(주성분분석)

- 차원축소, 변수추출 기법

- 데이터의 분산을 최대한 보존하면서 서로 직교하는 새 기처(축)을 찾아 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간으로 변환하는 기법

- 특성들이 통계적으로 상관관계가 없도록 데이터셋을 회전시키는 기술이다. 회전한 뒤, 데이터를 설명하는데 그 중요성에 따라 새로운 특성 중 일부만 선택된다.

- 특성 간의 상호작용, 이 상호작용이크래스와 어떠 ㄴ관련이 있는지 파악하기 위해 PCA를 사용할 수 있다.

* Feature Extraction

기존 변수를 조합해 새로운 변수를 만든다. feature selection과는 별개이다. 두 변수를 선형 결합해서 새로운 변수를 만들어내는 방식을 이용한다.

* 내 프로젝트에서 가져온 설명:

PCA는 dimension reduction 방법으로, feature 관게를 통해 새로운 feature를 만들어낼 수 있다는 특성을 가지고 있다. 아마 PCA가 높은 성능은 낸 것은, network intrusion을 파악하는 방법 때문인 것 같다. 예를 들어서 dos 공격 같은 경우, icmp protocol에서 패킷들이 너무 많이 들어온다던지, 혹시 tcp protocol에서 SYN이 지나치게 많이 들어온다던지 하는 상황은 모두 dos로 의심해볼 수 있듯이, protocol_type과 패킷 rate을 합치면 더 좋은 classify를 위한 기준이 될 수 있을 것으로 보인다.

 

Algorithms

KNN

가장 가까운 훈련 데이터 포인트 하나를 최근접 이웃으로 찾아 예측에 사용한다.

한 개의 이웃이 아니라 여러 이웃 (k개)를 찾아서 레이블을 정할 수 있다.

이웃을 적게 사용하면 모델의 복잡도가 높아지고, 많이 사용하면 복잡도는 낮아진다. (결정경계가 더 부드러워짐)

 

Decision Tree

- 결정에 다다르기 위해 예/아니오 질문을 이어 나가며 학습

- 모든 리프가 순수 노드가 될 때까지 진행하면 모델이 너무 복잡해지고, 학습 데이터에 과대적합된다. (아웃라이어에 너무 예민)

- 해결방법

- 사전 가지치기 (트리 생성을 일찍 중단)

ex) max_depth 값을 줌

- 사후 가지치기 (트리를 만든 후 데이터 포인트가 적은 노드 삭제 혹은 병합) → scikit learn은 지원x

 

MLP(다층 퍼셉트론)

- 각 입력 특성 (x[i]: x[0]~x[p])와 출력 y 사이에 hidden layer들을 추가. 그리고 각 노드 별 weight를 부여.

- 즉, 가중치 합을 만드는 과정을 여러 번 반복하며 먼저 중간 단계를 구성하는 은닉 유닛을 계산하고 이를 이용해 최종 결과를 산출하기 위해 다시 가중치 합을 계산한다.

- 각 은닉 유닛의 가중치 합을 계산한 후 그 결과에 비선형 함수인 ReLU(0이하를 잘라버리고)나 하이퍼블 탄젠트(낮은 입력치는 -1로 수렴, 큰 입력값은 +1로 수렴)를 적용 → 선형 모델보다 더 복잡한 함수 학습

- 은닉층의 유닛 갯수 정하는 것이 중요규모 데이터 셋이면 10개 정도면 괜찮

 

adaBoost

- 그레이디언트 부스팅과는 달리 이전의 모델이 잘못 분류한 샘플이 가중치를 높여서 다음 모델을 훈련시킨다.

- 훈련된 각 모델은 성능에 따라 가중치가 부여된다. 예측을 만들 땐 모델이 예측한 레이블을 기준으로 모델의 가중치를 합산하여 가장 높은 값을 가진 레이블을 선택한다.

- 기본적으로 DecisionTreeClassifier(max_depth=1)을 사용, base_estimator로 다른 모델 지정할 수 있음.

 

Naive Bayes

각 특성을 개별로 취급해 파라미터를 학습하고 각 특성에서 크래스별 통계를 단순하게 취합하기 때문

더보기

베이스 정리: 매개변수 x, y가 있을 때, 분류 1에 속할 가능성이 p1(x, y)이고 2일 가능성이 p2(x, y)일때, p1(x, y) > p2(x, y)이면 1이라는 것. 이 개념에서 나온게 나이브 베이스 분류 방법이다.

즉, 나이브 베이스는 조건부 확률, 사건 a가 발생했을 때 사건 b가 발생할 확률을 이용한다.

 

Random forest

- Ensemble 기법: 여러 머신러닝 모델 연결 -> 더 강력한 모델 build

- 여러개의 나무를 생성해, 각 나무의 예측을 조합해서 결론을 내림

- Decision Tree의 훈련 데이터 Overfitting 문제 회피

- Overfitting된 여러 Tree들의 평균을 이용하기

- 무작위 트리 생성

* Implementation

- 트리의 개수: RandomForestRegressor / RandomForestClassifier 의 n_estimators

- 부트스트랩 샘플 생성: n개의 데이터 포인트 중 데이터를 n개씩 추출 -> 데이터의 누락, 반복 가능

- 각 트리에서 모든 특성을 사용하는 것이 아니라, 무작위의 일부 특성(max_features)을 추출해서 최선의 답 찾음

- max_features ++ : 각 트리들이 비슷해짐

- max_features -- : 무작위로 선택한 특성의 임계값에 따른 답

 

SVM

- Support Vector Machine 이란 결정 경계를 정의하는 모델이다. 근데 이 결정 경계를 정할 때, 2차원 선을 이용하는 게 아니라 고차원 평면을 만드는 것이다.

- 결정경계는 데이터 군으로부터 거리가 먼 게 좋다. support vector는 결정 경계와 가까이 있는 데이터들을 의미한다. 즉, 결정경계를 결정하는데 핵심적인 역할을 하는 애들이다.

- 마진이란 결정경계와 서포트 벡터들 사이의 거리이다. 마진을 최대로 넓힌 게 좋은 결정경계이다.

- Support Vector가 핵심이기 때문에 이걸 잘 결정하면 매우 빠르게 모델을 빌드할 수 있다.

- 아웃라이어들을 적절히 수용해야 지나친 피팅이 안일어난다. 반대로 아웃라이어들을 너무 받아주면 또 언더피팅이 일어난다.

- 입력 데이터에서 단순한 초평면으로 정의되지 않는 더 복잡한 모델을 만들 수 있도록 선형 서포트 벡터 머신을 확장한 것.

- 선형 모델을 유연하게 만드는 방법은 특성끼리 곱하거나 특성을 거듭제곱하는식으로 새로운 특성을 추가하는 것. 이 아이디어에서 도출된 것이다.

 

Evaluation

Cross Validation

- train set, test set이 있을 때, 고정된 test set으로 모델의 성능을 확인하고, 파라미터를 수정하고 하다보면 test set에만 적합한 모델이 된다. 즉 test set에 overfitting 된다.

- 그래서 교차검증 방식을 사용한다. (여기선 K-fold를 설명한다, cross validation을 하는 방법은 여러가지가 있다.)

- 그래서 전체 데이터를 train set과 test set으로 나눌 때, 일단 k개의 덩어리로 자른 다음 test set을 각 덩어리로 하는 여러 모델들을 검증하는 것이다. 그리고 accuracy를 각 set의 평균으로 결론짓는 것.

* 장점:

  1. 모든 데이터 셋을 평가에 사용 → overfit 방지
  2. 모든 데이터 셋을 훈련에 사용 → better accuracy, underfit방지

* 단점:

iteration으로 인한 train, test time 증가

 

 

 

 

참고사이트:

https://darkpgmr.tistory.com/110#:~:text=PCA%EB%8A%94%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%ED%95%98%EB%82%98%20%ED%95%98%EB%82%98,%EB%B0%A9%ED%96%A5%EB%B2%A1%ED%84%B0%EB%A5%BC%20%EC%9D%98%EB%AF%B8%ED%95%9C%EB%8B%A4.

 

https://ratsgo.github.io/machine%20learning/2017/04/24/PCA/

 

https://ko.wikipedia.org/wiki/%EC%A3%BC%EC%84%B1%EB%B6%84_%EB%B6%84%EC%84%9D

 

https://bcho.tistory.com/1010

 

참고도서:

파이썬 라이브러리를 활용한 머신러닝 : 사이킷런 핵심 개발자가 쓴 머신러닝과 데이터 과학 실무서[번역개정판] 저 : 안드레아스 뮐러세라 가이도