brunch

매거진 DTAN

You can make anything
by writing

C.S.Lewis

by sokoban Mar 10. 2019

기계학습 첫 번째 장

머신러닝 정리

% 본 글은 "파이선 라이브러리를 활용한 머신러닝"을 스터디하면서 정리한 글이며 책의 내용 중 일부분이 포함되어 있을 수 있습니다.


http://www.hanbit.co.kr/store/books/look.php?p_code=B6119391002


기계 학습을 공부하기 전에 가장 중요하게 알아보아야 하는 몇 가지 항목들에 들에 사전에 정리를 하고자 한다.


0. 지도 학습 Vs 비지도 학습

 

지도 학습

지도 학습은 산출될 수 있는 결괏값인 Class가 있고 이에 개별적인 데이터들의 결괏값인 Label이 정해진 Training Set 데이터를 이용하여 입력된 데이터들에 대한 결괏값을 산출하는 데 사용되어지는 기계 학습이다. 입력되는 데이터들은 학습을 위한 Training set 말고도 검증을 위한 Validation Set, 그리고 테스트를 위한 Test Set 등 3가지로 구성된다.

 지도 학습의 일반적인 출력 값은 선형 (regression) 값처럼 연속 값일 수도 있으며 또는 입력된 데이터에 대한 분류 값 즉 classification 값일 수도 있다.


지도 학습에는 분류 classification와 회귀 regression이 있다.


분류(Classification) : 미리 정의된, 가능성 있는 여러 클래스 레이블 중 하나를 예측하는 것, 분류는 두 개의 클래스로 분류하는 이진 분류와 세 개 이상의 클래스로 분류하는 다중 분류로 나누어짐


비지도 학습

  지도 학습이 알려진 결과에 대한 분류를 한다면 비지도 학습은 이러한 결과에 대한 결괏값을 알지 못하는 즉 출력 값에 대한 정보 없이 학습해야 하는 모든 종류의 기계 학습을 지칭한다. 즉 비지도 학습은 입력되는 데이터만으로 얻고자 하는 지식을 산출할 수 있어야 한다.


  비지도 학습은 크게 비지도 변환과 군집 (Clustering)으로 나누어질 수 있다. 군집은 입력되는 대상에 대하여 적용된 항목들에 대해 그룹핑하는 것을 말하며 비지도 변환은 입력된 데이터를 사람이나 기계 학습에 적용이 가능하도록 반드시 필요한 특징만을 추출할 수 있도록 하는 차원 축소 등이 있다.



1. 지도 학습


(1). 회귀


 연속적인 숫자, 또는 프로그래밍 용어로 말하면 부동소수 점수를 예측하는 것, 즉 출력되는 값이 연속성이 있는 문제들을 이야기하며 분류와의 차이점은 분류가 Yes/No로 나누거나 하는 분류 문제라면 회귀는 연속적인 숫자를 예측하는 것을 이야기한다..


회귀 : 연속적인 숫자 출력 값을 예측하는 것

분류 : 두 개 혹은 그 이상의 Class(Label)로 나누는 것을 분류


선형 모델 (Linear Model)


선형 모델은 입력 특성에 따라 선형 함수를 만들어 예측을 수행함

선형 모델을 위한 일반화된 예측 함수

 y=w[0]*x[0] + w[1]*x[1] +.... + w[p]*x[p] +b


 x[0] 부터 x[p]까지는 하나의 데이터 포인트 즉 하나의 데이터에 대한 특성을 나타내며 (특성의 개수는 p+1) w와 b는 모델이 학습할 파라미터,

y은 모델이 만들어낸 예측값 만약 특성이 하나인 데이터셋이라면  y=w[0]*x[0] +b  

  w[0]는 기울기고 b는 y축과 만나는 절편 특성이 많아지면 w는 각 특성에 해당하는 기울기를 모두 가미

예측값 y는 입력 특성 x에 w의 각 가중치를 곱해서 더한 가중치 합으로 볼 수 있음


  회귀를 위한 선형 모델은 특성이 하나일 땐 직선, 두 개 일 땐 평면이 되며, 더 높은 차원(특성이 다수 일 때)에는 초평면 hyperplain이 되는 회귀 모델의 특징을 가짐


선형 회귀 (최소 제곱 법)


예측 훈련 세트에 있는 타깃 y사이의 평균 제곱 오차(mean squared error)를 최소화하는 파라미터 w와 b를 찾습니다. 평균제곱오차는 예측값과 타깃값의 차이를 제곱하여 더한 후에 샘플의 개수로 나눈 것, 매개 변수가 없다.

  기울기 파라미터(w)는 가중치 또는 계수 라고 함, 평향 또는 절편 파라미터(b)는 intercept_ 속성에 저장되어 있음


# 트레이닝셋 점수와 테스트셋 점수를 비교하여 overfitting인지 underfitting인지를 구별할수 있음

# 두개의 값이 근접할 경우 과소적합, 두개의 값이 차이가 많이 날 경우 overfitting 임


만약 overfitting이 발생할 경우에는 복잡도를 제어할수 있는 모델로 모델 변경을 하는것이 좋음

Training set score: 0.69

Test set score: 0.37

위의 점수에 의하면 overfitting이 발생하고 있으므로 모델을 변경 하는 것이 필요하다.


릿지 회귀


 선형 모델로서 최소적합법에서 사용한 것과 같은 예측 함수를 사용함 허나 릿지 회귀는 가중치(w)선택은 훈련 데이터를 잘 예측하기 위해서 뿐만 아니라 추가 제약 조건을 만족시키기 위한 목적도 있습니다.

 가중치의 절댓값을 가능한 한 작게 만드는 것, 다시 말해 w의 모든 원소가 0에 가깝게 되길 원함 모든 특성이 출력에 주는 영향을 최소한으로 만들며 이런 제약을 규제 regularization 이라고 함 규제는 overfitting이 되지 않도록 모델을 강제로 제한한다는 의미 입니다.


선형 분류 모델

선형 모델은 분류에도 사용가능함


binary classification :

  예측을 위한 방정식

 y=w[0]*x[0] + w[1]*x[1] +.... + w[p]*x[p] +b > 0

선형회귀와 아주 비슷함 다만 특성들의 가중치 합을 그냥 사용하는 대신 예측한 값을 임계치 0과 비교 합니다. 함수에서 계산한 값이 0보다 작으면 클래스를 -1이라고 예측하고 0보다 크면 +1 이라고 예측합니다.


선형 분류 알고리즘은(가장 잘 알려진 두가지)

:linear_model.LogisticRegression에 구현된 로지스틱 회귀

: svm.LinearSVC 에 구현된 Support Vector Machine 임


multiple classification :

많은 선형 분류 모델은 이진 분류만을 지원함, 즉 다중 클래스 (다중 결과값)를 지원 하지 않음

이진 분류를 다중 분류로 확장하는 보편적인 방법은 일대다 one-vs-rest 방법,


일대다 방식 : 각 클래스를 다른 모든 클래스와 구분하도록 이진 분류 모델을 학습함 (즉 모든 클래스의 수만큼 이진 분류 모델을 만듬)


python scikit-learn 에서는 X는 데이터를 y는 class를 표시한다.



나이브 베이즈 분류기

선형 모델과 유사, 훈련속도가 빠르지만 일반화 성능이 조금 뒤짐


나이브 베이즈 분류기는 각 특성을 개별로 취급해 파라미터를 학습하고 각 특성에서 클래스별 통계를 단순 취합하기 때문

scikit-learn에 구현된 나이브 베이즈 분류기는

GaussianNB : 연속적인 어떤 데이터에도 적용

BernoulliNB : 이진 데이터를

MultinomialNB : 카운터 데이터

로 구성됨


결정 트리


결정 트리는 분류와 회귀 문제에 널리 사용되는 모델. 기본적으로 결정 트리는 결정에 다다르기 위해 예/아니오 질문을 이어 나가면서 학습함

트리 만들기를 모든 리프 노드가 순수 노드가 될 때까지 진행하면 모델이 매우 복잡해지고 훈련 데이터에 Overfitting 됨

순수 노드로 이루어진 트리는 훈련 세트에 100% 정확하게 맞는다는 의미입니다.

훈련 세트의 모든 데이터 포인트는 정확한 클래스의 리프 노드에 있음


Overfitting을 막는 전략은 크게 두가지

1 트리 생성을 일찍 중단 (pre-pruning)

2 트리를 만든 후 데이터 포인트가 적은 노드를 삭제 하거나 병합 (post-pruning, pruning)


트리는 과대 적합되기 쉽고 새로운 데이터에 잘 일반화되지 않습니다.

scikit-learn 상에서는 max_depth를 통해서 노드의 깊이를 몇개로 제한할수 있습니다. 이를 통해 pre-pruning을

할수 있습니다.


트리의 중요도 : 트리를 만드는 결정에 각 특성(피쳐)가 얼마나 중요한지를 평가하는 특성 중요도 feature importance 입니다. 즉 가장 중요하게 사용된 특성은 1에 가까우며 중요하지 않을수록 0에 가깝게 표기 됩니다.


회귀 결정 트리 : DecisionTreeRegressor



앙상불

여러 머신러닝 모델을 연결하여 더 강력한 모델을 만드는 기법


랜덤 포레스트

랜덤 포레스트는 훈련 데이터에 Overfitting이 되는 경향을 회피할수 있는 방법

기본적으로 조금씩 다른 여러 결정 트리의 묶음

트리들이 달라질수 있도록 트리 생성시 무작위성을 주입함 -> 데이터 포인트를 무작위로 선택, 부할 테스트에서 특성을 무작위로 선택


구축

먼저 데이터의 부트스트랩 샘플을 생성 : 데이터 포인트에서 무작위로 데이터를 n_samples 횟수만큼 반복 추출함(중복 될수 있음)

이렇게 선택된 데이터셋으로 결정 트리를 만듬



그래디언트 부스팅 회귀 트리


여러개의 결정 트리를 묶어 강력한 모델을 만드는 또 다른 방법

회귀와 분류 모두에 사용 할수 있음

랜덤 포레스트와는 달리 그래디언트 부스팅은 이전 트리의 오차를 보완하는 방식으로 순차적으로 트리를 만듬


learning_rate : 이전 트리의 오차를 얼마나 강하게 보정할 것인지를 제어 (학습률이 크면 보정을 강하게 하므로 복잡한 트리가 됨)

n_estimators : 트리가 더 많이 추가 되고 모델의 복잡도가 커지고 훈련 세트에서의 실수를 바로 잡을 기회를 많이 줌


커널 서포트 백터 머신


커널 서포트 벡터 머신은 입력 데이터에서 단순한 초평면으로 정의되지 않는 더 복잡한 모델을 만들 수 있도록 확장한 것, SVM은 분류와 회귀에 모두 사용할수 있다.


선형 모델과 비선형 특성


저차원 데이터에서는 선형 모델은 매우 제한적임

선형 모델을 유연하게 하는것은 특성끼리 곱하거나 특성을 거듭제곱하는 식으로 새로운 특성을 추가하는것


커널 기법


보통 데이터셋에 비선형 특성을 추가하여 선형 모델을 강력하게 만듬

다만 특성이 많이 추가되면 연산 비용이 커지므로 새로운 특성을 만들지 않고서도 고차원에서 분류기를 학습시킬수 있음

커널 기법 : 실제로 데이터를 확장하지 않고 화장된 특성에 대한 데이터 포인트들의 거리를 계산함

가우시안 커널 (RBF) 커널이 있음


신경망


신경망 모델

다층 퍼셉트론 : multipayer perceptrons (MLP)

-> 피드 포워드 feed-forward 신경망, 혹은 신경망으로 함

MLP의 예측 공식

y=w[0]*x[0]+w[1]*x[1]+....+w[p]*x[p]+b


MLP에서는 가중치 합을 만드는 과정이 반복되며, 먼저 중간 단계를 구성하는 은닉 유닛(hidden unit)을

계산하고 이를 이용하여 최종 결과를 산출하기 위해 다시 가중치 합을 계산함



2. 비지도 학습


비지도 학습 주용 사용

1 군집 : Clustering

2 비지도 변환 : Unsupervised transformation

  -> 차원 축소 dimensionality reduction : 특성이 많은 고차원 데이터를 특성의 수를 줄이면서 꼭 필요한 특징을 포함한 데이터로 표현하는 방법


데이터 변환 적용하기  

 SVM과 같은 알고리즘은 데이터의 스케일에 매우 민감합니다.


  위와 같이 오리지널 데이터에서 특성의 스케일을 조정해서 데이터를 변경함

standardScaler : 각 특성의 평균을 0, 분산을 1로 변경하여 모든 특성이 같은 크기를 가지게 함 (최대값과 최소값을 제한하지 않음)

MinMaxScaler : 모든 특성이 0과 1사이에 위치하도록 데이터를 변경합니다.

Normalizer : 특성 벡터의 유클리디안 길이가 1이 되도록 데이터 포인트를 조정, 지름이 1인 원에 데이터 포인트를 투영, 즉 데이터 포인트가 다른 비율로 스케일이 조정됨

     정규화는 특성 벡터의 길이는 상관없고 데이터의 방향만이 중요할 때 사용함


전처리


차원 축소, 특성 추출, 매니폴드 학습


주성분 분석 (PCA)

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

2차원에서는 가능한 직각 방향이 하나뿐이지만 고차원에서는 무한히 많은 직각 방향이 있을 수 있습니다. 두 성분을 화살표로 나타냈지만, 사실 화살표의 머리와 꼬리는 아무 의미가 없다.

이런 과정을 거쳐 방향을 데이터에 있는 주된 분산의 방향이라고 해서 주성분 이라고 합니다.


 위의 그래프는 입력된 데이터에 대한 히스토그램으로 특정 간격에 얼마나 많은 데이터 포인트가 있는지를 나타낸 것입니다. 각 그래프는 히스토그램 두개를 겹쳐놓은 것으로 푸른색은 양성 클래스의 포인트를 그리고 붉은색은 악성 클래스의 포인트를 나타냅니다. 위와 아래의 주성분 분석 히스토그램을 보면 아래의 데이터는 학습에 적합하게 데이터가 고루 분포되어 있습니다. 다만 특정 히스토그램을 보게 되면 smoothness error 특성으로 두 히스토그램이 거의 겹쳐져 별로 쓸모가 없는 것도 있습니다. 하지만 위의 데이터는 한쪽으로 데이터가 편중되어 있고 비록 worst concave points로 두 히스토그램이 확실하게 구별되어 있지만 데이터 자체의 편중이 심해 학습이 거의 되지 않는 상태라고 볼수 있습니다.



그러나 히스토그램에서는 전혀 이러한 특성간의 상호작용이나 이 상호작용이 클래스와 어떤 관련이 있는지는 전혀 알려주지 못합니다. 더 나은 상호작용을 찾아 낼수 있도록

StandardScaler를 이용 각 특성의 분산이 1이 되도록 데이터의 스케일을 조절 한다. 이는 PCA 객체를 생성하고 fit 메서드를 호출해서 주성분을 찾고 transform 메서드를 호출해 데이터를 회전시키고 차원을 축소합니다.


  이를 통해 기존에 최 하단처럼 제대로 SVM을 이용하여 분류 될수 없었던 데이터가 아래와 같이 분류 할수 있는 데이터로 표시 할수 있게 되었다.

PCA는 비지도 학습이므로 회전축을 찾을때 어떤 클래스 정보도 사용하지 않고 단순히 데이터에 있는 상관관계만을 고려 합니다. 이 산점도는 첫번째 주성분과 두번째 주성분을 사용하여 만들었고 클래스 정보를 이용하여 포인트의 모양을 구분합니다.


이때까지 피쳐를 추출 하는 부분에 대해서 알아 보았다면 이제 부터는 실제로 추출된 특성을 이용하여 머신 러닝을 하는것을 하도록 하자.


비음수 행렬 분해 NMF

NMF : non-negative matrix factorization

유용한 특성을 뽑아내기 위한 비지도 학습 알고리즘

PCA는 데이터의 분산이 가장 크고 수직인 성분을 찾았다면 NMF에서는 음수가 아닌 성분과 계수 값을 찾습니다. 즉 주성분과 계수가 모두 0보다 크거나 같아야 합니다.

PCA를 사용할 때와는 다르게 NMF로 데이터를 다루려면 주어진 데이터가 양수인지 확인해야 합니다. 이 말은 원점 (0,0)에서 상대적으로 어디에 놓여 있는지가 NMF에서는 중요함


t-SNE를 이용한 매니폴드 학습

매니폴드 학습 알고리즘이라고 하는 시각화 알고리즘들은 훨씬 복잡한 매핑을 만들어 더 나은 시각화를 제공, 특히 t-SNE 알고리즘을 많이 사용함



군집 ( Clustering)


군집은 데이터셋을 클러스터라는 그룹으로 나누는 작업, 한 글러스터 안의 데이터 포인트끼리는 매우 비슷하고 다른 클러스터의 데이터 포인트와는 구분되도록 데이터를 나누는 것이 목표


k-평균(k-means) 군집은 가장 간단하고 널리 사용하는 군집 알고리즘

데이터의 어떤 영역을 대표하는 클러스터 중심을 찾음 -> 즉 입력된 데이터를 기반으로 클러스터를 통해서 데이터를 구분한다면 먼저 3개로 나눈다고 생각한다면

먼저 입력된 데이터를 조기화 함, 그 다음으로 각 데이터 포인트를 가장 가까운 클러스터 중심에 할당함 -> 다음으로 할당한 포인트의 평균값으로 클러스터 중심을 갱신,

-> 이 과정을 두번 더 반복 하여 총 3번 반복한 후에 클러스터를 종료함


군집은 각 데이터 포인트가 레이블을 가진다는 면에서 분류와 조금 비슷하다. 허나 정답을 모르고 있으며 레이블 자체에 어떤 의미가 있지는 않음

즉 레이블을 가지는 데이터를 만든다고 하더라도 그 레이블은 어떠한 의미가 없다.

2차원 예제 데이터에서 군집 알고리즘을 적용할 때 한 그룹의 레이블은 0으로, 다른 그룹은 1로 지정되는 것은 중요하지 않음.


k-평균의 실패

데이터셋의 클러스터 개수를 정확하게 알고 있더라도 k-평균 알고리즘이 항상 이를 구분해낼수 있는 것은 아님

k-평균은 가장 가까운 클러스터 중심까지의 거리만 고려하기 때문에 이런 데이터를 잘 처리하지 못함


병합 군집

agglomerative clustering

: 시작할때 각 포인트를 하나의 클러스터로 지정하고, 그 다음 어떤 종료 조건을 만족할 때까지 가장 비슷한 두 클러스터를 합쳐 나감

지정된 개수의 클러스터가 남을때까지 비슷한 클러스터를 합침, linkage 옵션으로 가장 비슷한 클러스터를 측정하는 방법 사용


DBSCAN

Density-based spatial Clustering of applications with noise

: 클러스터의 개수를 미리 지정할 필요가 없이 복잡한 형상도 찾을수 있으며 어떤 클래스에도 속하지 않는 포인트를 구분할 수 있습니다. DBSCAN은 병합 군집이나 k-평균보다는 다소 느리지만 비교적 큰 데이터셋에도 적용할 수 있습니다. 우선 특성 공간에서 가까이 있는 데이터가 많아 붐비는 지역의 포인트를 찾습니다. 이런 지역을 특성 공간의 밀집 지역 이라고 함

-> 시작할 때 무작위로 포인트를 선택함, 다음으로 그 포인트에서 eps거리 안의 모든 포인트를 찾음

  Class 즉 레이블이 없는 데이터를 입력하여 이에 대한 레이블을 산출 할수 있다. Class를 몇개로 나눌것인지를 입력하지 않아도 되지만 eps와 min_samples가 나누어지는 Class의 개수를 결정하게 되므로 이를 잘 입력 하여야만 된다.


레이블 값을 입력하여 산출한 데이터 모델

DBSCAN을 이용하여 산출한 데이터 모델

두개가 거의 유사하게 그려지는것을 알수 있다.



군집 알고리즘의 비교와 평가


군집 알고리즘의 결과를 실제 정답 클러스터와 비교하여 평가할 수있는 지표들이 있음 1(최적)과 0(무작위) 사이의 값을 제공하는 ARI adjusted rand index와 NMI normalized mutual information가 가장 널리 사용되는 지표 (ARI는 음수가 될수 있음)



3. 결론

  이상으로 기계학습에 가장 기본적인 알고리즘에 대해서 알아 보았다. 기본적으로 위 서적의 샘플 소스는 모두 scikit-learn으로 구성되어 있어 따라가는데 큰 불편함은 없다. 다만 TensorFlow 대비하여 scikit-learn의 경우 병렬 CPU를 지원 하지 않았기 때문에 (현재 지원이 가능할수도 있음) 차원이 많은 경우 장기간 계산을 진행하다가 멈추는 경우가 종종 있고 결과값이 도출되지 않는 경우도 많았다.


  만약 실제 대용량 데이터를 이용하여 피처가 많을 경우에는 차원 축소를 하더라도 수백만건 이상의 데이터가 입력된다면 scikit-learn에서 제대로 동작하지 않을수도 있으므로 이를 염려에 두고 코드를 작성하는것이 좋다고 생각된다.


  Tensor의 경우 GPU를 활용할 경우 scikit-learn 대비 빠른 속도를 보여준다. (물론 GPU가 좋아야 한다. 단순히 CPU 에 의존한다면 병렬 CPU를 사용한다고 해도 효과는 반감되었었다.)

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari