책: O'REILLY의 Hands-On Machine Learning with Scikit-Learn & TensorFlow

URL: http://shop.oreilly.com/product/0636920052289.do

본문에 사용되는 사진들은 모두 위의 책에서 발췌

소스코드: https://github.com/ageron/handson-ml

틀린 내용이 있으면 언제든지 댓글 달아주세요! (오역은 어느정도 이해해주시길)


chapter1. The machine Learning Landscape


머신러닝이란 무엇인가?

General Definition

[Machine Learning is the] field of study that gives computers the ability to learn without being explicitly programmed.
(Arthur Samuel, 1959)

More engineering-oriented one

A computer program is said to learn from experience E with respect to some task T and some performance measure P,
if its performance on T, as measured by P, improves with experience E.

(Tom Mitchell, 1997)


 스팸필터로 예를 들어보자.

사용자에 의해 정의된 스팸 메일과, 일반적인 메일이 있다고 가정해보자.

이러한 스팸 메일과, 일반적인 메일은 training set이라고 불린다.

각각의 training examples은 training instance(or sample)라 불린다.


Task T: 스팸 메일인지에 대해 flag 부여

Experience E: training data (이전에 스팸인지 아닌지에 대한 정보)

Performance P: 정확히 메일을 분류 했는지에 대한 비율

(여기에서 P는 accuracy 라고도 불리며, 이는 종종 classification tasks에 이용된다.)


왜 머신러닝을 사용하는가?

 위의 예에서 얘기한 스팸필터에 대해 생각해보자.


 전통적인 프로그래밍 기법을 이용한 스팸필터는 아래와 같다.

 전형적으로 스팸메일에 사용되는 단어나 구문(예를 들면, "4U", "credit card", "free" 등)들을 보고, 탐지 할 수 있는 각각의 룰을 만든다. 이는 상당히 비효율적일 수 있는데, 각각의 룰들은 상당히 복잡한 룰이 될 수 있고, 이는 유지하기도 어려운 문제점이 있다.


다음은 머신러닝을 이용한 스팸필터이다.


 머신러닝 기반의 스팸필터 방식은 자동적으로 일반 메일과 비교하여, 스팸메일에서 빈번히 특이하게 사용하는 단어들의 패턴을 찾아준다. 프로그램은 훨씬 짧고, 유지하기 쉬우며, 정확도도 높다.


 위의 그림을 보면 붉은색의 Write rules과 녹색의 Data 부분과 Train ML algorithm 부분만 다르게 표시가 되어있는데, 이는 사람이 기존에 룰을 작성하였다면, 머신러닝 기반 학습방법은 "데이터를 통해 기계가 대신 학습해준다"라고 설명할 수 있다.


 이렇게 보면 "뭐가 그렇게 다를까?" 라고 생각해 볼 수도 있는데, 만약 스패머들이 "4U"라는 단어가 룰로 작성되었다는 것을 확인하고 "For U"라고 바꿨다고 생각해보자. 전통적인 스팸 필터 방식으로는 이렇게 변형 될 때마다 룰을 작성해야한다. 그와는 대조적으로 머신러닝 기법으로는 이러한 작업이 필요가 없게 된다.


 또한, 머신러닝 기법을 적용하면 대량의 데이터에서 보이지 않는 패턴들에 대해서도 발견할 수 있게 되는데, 이는 data mining 이라고도 불린다. 가령 아래의 그림과 같이, humans learn에 도움을 줄 수 있다고 해야할까나.



 위의 내용을 요약하자면 머신러닝이 좋은 이유에 대해 다음과 같다.

1) 기존의 수작업 또는 복잡한 룰을 머신러닝 알고리즘을 통해 간결한 코드로 좋은 성능을 낼 수 있다.

2) 변화가 심한 환경에서 머신러닝 시스템은 새로운 데이터를 채택할 수 있다.

3) 복잡하고 대량의 데이터에서 통찰력을 얻을 수 있다.

(그냥 머신러닝이 좋은 얘기를 구구절절 설명하고 있음)


머신러닝 시스템의 종류

1.  Whether or not they are trained with human supervision
(supervised, unsupervised, semisupervised, and Reinforcement Learning)

2. Whether or not they can learn incrementally on the fly

(online versus batch learning)

3. Whether they work by simply comparing new data points to known data points, or instead detect patterns in the training data and build a predictive model, much like scientists do

(instance-based versus model-based learning)


1. Whether or not they are trained with human supervision

1) Supervised learning

- 지도학습(감독학습이라고도 불림)은 쉽게 얘기해서 라벨(레이블)값을 주는 학습 방법이다.

 위의 training set을 보면 instance 즉 각각의 메일에 대해 정답을 부여하는 것이다. 

("이 메일은 정상 메일이다. 이 메일은 스팸 메일이다." 라는 정답)

전형적인 지도학습 방식은 분류(classification)이다. 즉, 메일이 스팸이냐 아니냐를 구분함.


 또다른 방식은 회귀(regression)가 있는데, 이는 쉽게 얘기하여 주식이나 집 값 같이 변동하는 연속적인 데이터들에 대해 예측하는 방식이라고 이해하면 된다.


지도학습에 자주 사용되는 알고리즘은 아래와 같다. (책에서 다룰 내용들)

  • K-Nearest Neighbors
  • Linear Regression
  • Logistic Regression (사실 Logistic Regression은 Logistic Classification이 더 적합)
  • Support Vector Machines
  • Decision Trees and Random Forests
  • Neural networks
    (모두 지도학습은 아님. autoencoders나 restricted Boltzmann machines같은 비지도 학습(Unsupervised)도 있고, deep belief networks 같은 준 지도학습(Semi-supervised)도 있음)

2) Unsupervised learning

- 비지도학습(무감독학습이라고도 불림)은 지도학습과 반대라고 생각하면 된다. 즉 라벨 값을 주지 않는 것이다. 기존의 라벨값을 주는 선생님이 있다고 했다면, 이번에는 선생님 없이 학습을 하는 방법이다.

 위의 그림 같이, 알려주는 사람이 없다.

 데이터의 특성에 따라 군집이 형성되는 것을 확인할 수 있다.

예를 들어, 내 블로그에 방문하는 사람들에 대해 군집화(Clustering) 알고리즘을 사용할 수 있는데, 영화를 좋아하는 방문자들, 쇼핑을 좋아하는 방문자들 등으로 분류를 할 수 있다. 또한, hierarchical clustering 알고리즘을 사용하여 영화 중에서도 드라마, 액션 등의 작은 그룹으로 분류 할 수 있다. 


비지도학습에 자주 사용되는 알고리즘은 아래와 같다.

  • Clustering
    • k-Means
    • Hierarchical Cluster Anaslysis(HCA)
    • Expectation Maximization
  • Visualization and dimensionality reduction
    • Principal Component Analysis (PCA)
    • Kernel PCA
    • Locally-Linear Embedding (LLE)
    • t-distributed Stochastic Neighbor Embedding (t-SNE)
  • Association rule learning
    • Apriori
    • Eclat

[으.... 주성분 분석, 커널 PCA 등 어려운 내용이 많다. 이전 자료 http://kkn1220.tistory.com/133에서 지도학습은 한번 훑어본 경험이 있지만, 비지도학습의 경우 제대로 학습을 하지 않았기에 벌써부터 걱정이다....]


 Visualization 알고리즘 또한 비지도학습의 좋은 예로 들 수 있다. 만약 복잡하고 라벨이 부여되지 않은 많은 데이터가 있을 때 이것을 2D(square)나 3D(cube)로 나타낼 수 있다. 

 이것과 관련이 있는 task는 차원축소(dimensionality reduction)가 있는데, 차원 축소의 목적은 데이터의 많은 정보에 대해 손실 없이 데이터를 간략하게 하는 것에 있다.

이것의 한가지 방법으로는 여러개의 feature들에 대해 상관 관계를 통해, 하나의 feature로 만드는 것이다. 이러한 것을 feature extraction이라고 부른다.


※Tip

 다른 머신러닝 알고리즘에 데이터를 넣기 전, 차원 축소를 이용하여 training data의 차원을 줄이는 것은 

좋은 시도일 수 있다. 그 이유는 속도를 빠르게 해주며, 디스크와 메모리를 덜 사용하게 하고, 또한 성능도 좋을 수 있기 때문이다.


 비지도 학습에도 군집화 말고 다른 중요한 것은 비정상 탐지(anomaly detection)을 말할 수 있다.

예를 들어, 평소와 다른 카드 거래를 감지하거나, 생산 및 제조 단계에서 감지할 수도 있다. 또는 다른 러닝 알고리즘에 적용하기 전 데이터셋으로부터 자동적으로 이상점(outlier)을 제거할 수도 있다.

아래의 그림은 정상 데이터를 통해 학습된 시스템이다. 새로운 데이터가 들어 왔을 때, 해당 데이터가 정상적인지, 아니면 비정상적인지 확인할 수 있다.


 마지막으로 비지도학습에서 중요한 task로 연관 규칙 학습(association rule learning, association analysis)이 있다.

연관 규칙 학습의 목적은 대량의 데이터에서 속성들(attributes) 사이에 관계를 발견하는 것이다.

예를 들어 슈퍼마켓을 운영하고 있다고 가정해보자. 사람들의 구매 내역에서 연관 규칙 학습을 통해 '바베큐 소스와 감자튀김을 구입한 사람들은 스테이크 또한 사는 경향을 보이더라.' 라는 결과를 얻을 수 있다. 그렇기 때문에, 운영자 입장에서는 이 음식들을 가까이 배치할 수 있다.


3) Semisupervised learning

준지도학습(실제로 준지도학습이라 부르는건 못들어본듯..)은 이름에서 얘기하듯이 지도학습과 비지도학습을 섞어놓았다고 생각하면 된다. 페이스북을 생각해보자. 일단 사용자는 페이스북에 자신의 친구나 가족들의 사진들을 업로드 할 수 있다. 이 때, 페이스북은 자동으로 사진들에 대해 A라는 사람과 B라는 사람을 인식할 수 있다. 여기까지는 비지도학습의 군집화(clustering) 부분이다. 그다음 사용자는 사진에 대해 A는 OOO이다. B는 XXX이다. 라고 라벨을 부여하게 된다. 이는 지도학습의 분류(classification)  부분이다. 이러한 방법은 사진을 검색하는데 상당히 유용하다.

페이스북에서 사진에 이사람은 누구입니까? 라는 것을 보았을 것이다. 결국 같은 맥락이다. 라벨을 많이 부여할수록 정확하게 인식하는 것은, 당연한 얘기


 대부분의 준지도학습의 알고리즘은 지도학습과 비지도학습의 결합(combinations) 이다.

예를 들어, deep belief networks(DBNs)는 restricted Boltzmann machines(RBMs) 라고 불리는 비지도학습에 기반한다.

RBMs는 비지도학습 방법에 의해 학습되며, 그 다음 전체 시스템은 지도학습 기법을 통해 fine-tuned 된다.


4) Reinforcement learning

- 강화학습은 위에서 언급한 것들과 매우 많이 다르다. 아래의 그림에서 보이는 agent가 주변 환경을 관찰한다. 

그 다음 환경에 맞는 선택을 하고 행동을 수행하게 되는데 이 때 정확한 행동에 대해서는 보상(rewards)을 하고, 반대로 정확하지 않은 행동에 대해서는 벌점(Penalty)을 부여하게 된다.

agent는 가장 좋은 정책(policy)을 스스로 학습하여, 주어진 상황에 맞게 행동할 수 있게 된다.

예로는 많은 로봇들이 어떻게 걷는지에 대해 학습시킬 때 사용 될 수도 있고, 2016년 3월에 이슈가 되었던 알파고가 있다. 알파고는 게임을 하는 동안에는 학습을 꺼두고, 단지 학습된 정책을 applying 했다는 것을 기억하라고 한다.


2. Whether or not they can learn incrementally on the fly

 머신러닝 시스템을 구분할 때 사용되는 다른 기준으로는, incoming data로 부터 점진적으로 학습할 수 있는 시스템인지 아닌지에 대한 분류이다.


1) Batch learning

- (일괄학습?)은 결론부터 말하자면 점진적으로 학습할 수 없는 시스템이다.

이것은 이용가능한 모든 데이터를 학습해야 한다. 그렇기 때문에, 일반적으로 많은 시간과 컴퓨팅 자원을 소모한다. 

시스템이 일단 학습이 되면, 더이상의 학습이 없이 적용이 된다. 이것은 offline learning 이라고 불린다.

만약 새로운 스팸메일 유형을 발견하여, batch learning 시스템에 적용을 원한다고 생각해보자. 이 때, 단순 새로운 데이터에 대한 것을 학습시키는 것이 아니라 기존 데이터 또한 학습시켜야 한다. 그 다음 기존 시스템을 중단하고, 새로운 시스템으로 교체를 해야 한다.

 다행인지는 모르겠지만, 왜 머신러닝을 사용해야 하는가? 부분에서 자동화 부분을 얘기했듯이, 전체 프로세스는 자동화 처리할 수는 있다. 그렇지만 이러한 시스템을 새로 동작하기 위해서, 기존 데이터까지 같이 학습을 시켜야 되는데 이 때, 시간과 자원을 소모해야 한다. 변동이 심한 데이터일 경우는 어떻겠는가... 이럴 때에는 batch learning이 적합하지 않다.


2) Online learning

- 온라인 학습은 연속적으로(각각이든 mini-batches로 불리는 소그룹이든) 들어오는 데이터에 대해 점진적으로 학습할 수 있는 시스템이다. 그렇기 때문에 각각의 학습 단계는 빠르고 적은 리소스를 사용하게 된다. 

 batch learning과는 달리 연속적인 데이터(예: 주가) 에 대해 상당히 유용하게 사용될 수 있으며, 즉 빠르게 대체할 수 있다. 이는 또한 한정된 컴퓨팅 리소스에 대해서도 좋은 학습 방법이다. 

새로운 데이터에 대해서만 학습을 하는 방식이기 때문에 기존의 것들은 버릴 수 있다.(기존으로 롤백 할 일이 없다면..)


 위의 그림처럼 온라인 학습 알고리즘은 또한,  하나의 기계의 메인 메모리로만 처리할 수 없는 대량의 데이터셋에도 이용 할 수 있다.(이를 out-of-core learning 이라고도 부른다). 알고리즘은 데이터의 부분을 load하며, 부분적 데이터를 각각 돌리고, 이를 전체 데이터를 돌릴 때까지 반복한다.


 온라인 학습 시스템에서 가장 중요한 파라미터 중 하나는 어떻게 변화하는 데이터를 빠르게 적용할 수 있냐는 것이다. (이를 learning rate라고 부른다.)

 만약 learning rate를 높게 설정하면, 시스템은 빠르게 새로운 데이터를 적용할 것이다. 그러나 이러한 방식은 기존 데이터를 빠르게 잊어버리는 경향을 보인다.

 반대로 learning rate를 낮게 설정하면, 시스템은 내성?(inertia)이 생겨 느리게 학습 될 것이지만, 새로운 데이터의 노이즈 값에 덜 반응하게 될 것이다.

 온라인 학습 시스템에서 가장 큰 도전은 '만약 bad한 데이터가 시스템에 유입될 때, 시스템 성능이 서서히 감소'하는 것이다. 이러한 위험을 감소시키기 위해, 시스템을 면밀히(closely) 모니터링 해야하며, 만약 성능이 저하되는 것을 확인했을 때 즉시 학습을 중단하여야 한다.(가능하면 이전 상태로 돌려놓는 것이 좋다.)


※Warning

 온라인 학습 방법 역시 offline으로 수행된다... 그렇기 때문에 온라인이라는 용어는 혼동될 수 있다.

온라인 학습 방법은 incremental learning으로 생각하면 된다.


3. Whether they work by simply comparing new data points to known data points, or instead detect patterns in the training data and build a predictive model, much like scientists do

 마지막으로 머신러닝 시스템을 분류하는 방법으로는 어떻게 데이터들을 일반화(generalize)하는 것이다.

 대부분의 머신러닝 tasks는 예측하는 것이다. 즉 학습 데이터(training examples)가 주어졌을 때, 시스템은 이전에 보지 못했던 examples에 대해 generalize할 필요가 있다. 

 학습데이터를 잘 분류하는 것은 좋은 일이지만, 불충분하다. 결국 우리의 목적은 새로운 데이터들을 얼마나 잘 분류할 수 있는지에 대해 성능이 좋아야 되기 때문이다.


1) Instance-based learning

(이 부분은 한글로 번역하기 애매한 부분들이 있어 영어로 작성)

 Possibly the most trivial form of learning is simply to learn by heart. If you were to create a spam filter this way, it would just flag all emails that are identical to emails that have already been flagged by users - not the worst solution, but certainly not the best.

 Instead of just flagging emails that are identical to known spam emails, your spam filter could be programmed to also flag emails that are very similar to known spam emails. This is requires a measure of similarity between two emails. A(very basic) similarity measure between two emails could be to count the number of words they have in common. The system would flag an emails as spam if it has many words in common with a known spam email.

 This is called instance-based learning: the system learns the examples by heart, then generalizes to new cases using a similarity measure.

 그림을 보니 결국 K-NN을 얘기하는 것 처럼 보였다. 그냥 기존의 학습 데이터에 새로운 데이터가 추가되었을 때, 데이터의 유사성을 측정하여 분류를 하는 것으로 이해했다. 


2) Model-based learning

데이터 셋으로부터 Generalize하는 다른 방법으로는 이러한 데이터들을 가지고 모델을 만드는 방법이다. 그 다음 생성 된 모델을 가지고 예측을 하는 것이다.

그렇다. 위의 Instance-based learning과 차이가 보인다. Instance based learning의 경우 새로운 instance 값이 들어왔을 때, 각각의 Training Instances들과 유사성을 측정을 해야한다. 그렇지만 밑의 Model-based learning의 경우 생성 된 모델에 새로운 instance 값이 들어왔을 때, 해당 영역으로 분류를 할 수 있다. 모델을 만드는 방법은 다음 챕터부터 차근차근 책에서 나온다.


Main Challenges of Machine Learning

머신러닝을 돌리기 위해 몇가지 나쁜 사례에 대해 얘기하고 있는데, 이부분은 가볍게 읽어보고 넘김

- 불충분한 학습 데이터의 양, 제각각의 Feature, 학습 데이터의 over/under fitting 등에 대해 소개

  


chapter1에서는 머신러닝이 무엇인지, 머신러닝이 왜 필요한지, 머신러닝의 종류가 무엇인지 등 머신러닝의 전반적인 부분에 대해 소개하고 있었다. chapter2에서는 End-to-End Machine Learning Project라는 주제로 진행하게 되는데, 머신러닝 데이터를 학습하기 전 데이터를 어떻게 수집하는지, 전처리는 어떻게 하는지에 대한 프로세스 설명이 될 것 같다.

http://kkn1220.tistory.com/133

파이썬 라이브러리를 활용한 머신러닝 책을 보던 중, 정확한 이해 없이 진행하는 것은 무의미하다고 판단하여 
책을 변경하였다. 위의 책도 물론 좋지만, 어느정도 머신러닝 알고리즘에 대해 이해하는 사람에게 더 유효 한 것 같다.


O'REILLY의 Hands-On Machine Learning with Scikit-Learn & TensorFlow라는 유명한 책인데, 이 책은 우선 영어다...

번역본도 나올 것 같지만, 예상 할 수 없어 아마존 킨들에서 바로 구입하였다. 아무래도 책을 계속 가지고 다니기는 어려움이 있어 바로 읽을 수 있는 킨들로 구매를 하였다.

(https://www.amazon.com/Hands-Machine-Learning-Scikit-Learn-TensorFlow/dp/1491962291/ref=sr_1_1?ie=UTF8&qid=1503911665&sr=8-1&keywords=hands+on+machine+learning+with+scikit+learn+and+tensorflow)


총 16강으로 되어 있으며, github는 아래와 같다.

https://github.com/ageron/handson-ml


전제조건으로는 

1) 파이썬 - 특히 numpy, matplotlib

-> http://learnpython.org/

2) Jupyter

-> 2장에서 설치 방법 및 기본에 대한 가이드가 나옴

3) 수학적 지식(미적분, 선형대수, 확률, 통계)

-> (선형대수) 모든 것을 알기에는 어렵다!!!! 한양대 이상화 교수님의 강의를 추천하는데, 그냥 벡터 및 행렬을 다루는데 중점적으로 가우스 소거법이나, 선형독립, 기저벡터, 벡터 투영, 함수공간 등에 대해 봤다. (증명까지는....skip)
(https://www.youtube.com/playlist?list=PLSN_PltQeOyjDGSghAf92VhdMBeaLZWR3)

-> (통계) 역시 한양대 이상화 교수님 강의를 추천. 적분을 통한 증명은 너무 어려워서... 확률 변수 정의, 누적 확률분포를 미분하면 확률밀도분포가 나오는 정도의 개념을 확인. 

(http://www.kocw.net/home/search/kemView.do?kemId=1056974)

-> 머신러닝을 시작하기도 전에 포기할 것 같아서.. 미적분이나 확률 같은 경우에는 일단은 스킵하였다.

개인적으로 이 책을 보기 전에 머신러닝 강의를 듣는 것을 추천하고 싶다.
-> 개인적으로 머신러닝에 대해 김성훈 교수님의 모두의 딥러닝을 듣는 것을 추천
(https://www.youtube.com/playlist?list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm)

-> 두 번째로는 인공지능 및 기계학습 개론 1,2 의 카이스트 문일철 교수님 강의를 추천(http://kooc.kaist.ac.kr/machinelearning1_17)

-> 위의 강의를 수강한 후 위에서 언급한 파이썬 라이브러리를 활용한 머신러닝 책을 보던 중에, 좀 더 자세히 살펴보고자 해당 책을 읽고자 한다.


해당 책의 로드맵은 아래와 같다.

Part1. The Fundamentals of Machine Learning

- What is Machine Learning.

- The main steps in a typical Machine Learning Project.

- Learning by fitting a model to data.

- Optimizing a cost function

- Handling, cleaning, and preparing data.

- Selecting and engineering features.

- Selecting a model and tuning hyperparameters using cross-validation.

- The main challenges of Machine Learning, in particular underfitting and overfitting (the bias, variance tradeoff)

- Reducing the dimensionality of the training data.

- The most common learning a algorithms (Linear/Polynomial/Logistic Regression, K-NN, SMV, DT, Random Forest, Ensemble methonds)


Part2. Neural Networks and Deep Learning

- What are neural nets. what are they good for.

- Building and training neural nets using Tensorflow.

- The most important neural net architectures (CNN, RNN, LSTM etc)

- Techniques for training deep neural nets.

- Scaling neural networks for huge datasets.

- Reinforcement learning.


Part1에서는 주로 전반적인 머신러닝 알고리즘 및 데이터 전처리, feature 선택 등에 대한 내용을 담고 있다.

Part2에서는 인공신경망과 딥러닝에 대한 내용을 소개하고 있다.


책이 두꺼워서 꽤나 오래 걸리지 않을까 싶다..................

이 글은 파이썬 라이브러리를 활용한 머신러닝 책을 본 사람에게만 유효. (안드레아스 뮐러, 세라 가이도 지음. 박해선 옮김. O'REILLY)

파이썬 라이브러리: scikit-learn

jupyter notebook을 제공하기 때문에, 파이썬 코드나, 각각에 대한 그래프를 확인 할 수는 있지만, 

글의 경우 잊어먹기 쉽기 때문에, 소장을 위한 포스팅 

교재 소스 코드: https://github.com/rickiepark/introduction_to_ml_with_python/


2장. 지도학습


지도학습에는 분류와 회귀가 있음.

- 분류는 미리 정의된, 가능성 있는 여러 클래스 레이블 중 하나를 예측.

  이진 분류(binary classfication), 다중 분류(multiclass classfication)으로 나눌 수 있음.

- 회귀는 연속적인 숫자, 또는 프로그래밍 언어로 말하면 부동소수점수(수학 용어로는 실수)를 예측


지도학습 알고리즘 모델 요약


1) KNN: 작은 데이터셋일 경우, 기본 모델로서 좋고 설명하기 쉬움.

- 훈련 데이터셋을 그냥 저장하는 것이 모델을 만드는 과정의 전부. 별도의 학습이 필요 없음

- 새로운 데이터 포인트에 대해 예측할 땐 알고리즘이 훈련 데이터셋에서 가장 가까운 데이터 포인트, 즉 '최근접 이웃'을 찾음

  (scikit-learn에서 classfication, Regression 모두 지원)


- 매개변수: 중요한 매개변수는 2개. 데이터 포인트 사이의 거리를 재는 방법과 이웃의 수 (실제로 이웃의 수는 3,5개 정도로 적을 때 잘 작동하지만, 조정 필요) 거리를 잴 때, 유클리디안 거리 방식 사용

- 장점: 이해하기 매우 쉬운 모델.

- 단점: 전처리 과정이 중요. 훈련 세트가 매우 크면(특성의 수나 샘플의 수가 클 경우) 예측이 느림. 현업에서는 많이 사용 안함


- 데이터 셋: from sklearn.datasets import load_breast_cancer, from sklearn.datasets import load_boston

- 라이브러리

- graph example: mglearn.plots.plot_knn_classification(n_neighbors=<number>)

     mglearn.plots.plot_knn_regression(n_neighbors=<number>)

- library: from sklearn.neighbors import KNeighborsClassifier

from sklearn.neighbors import KNeighborsRegressor



2) Linear Model: 첫 번째로 시도할 알고리즘. 대용량 데이터셋 가능. 고차원 데이터에 가능.

- 선형 회귀(=LSE): 예측과 훈련 세트 사이에 있는 y 사이의 평균제곱오차(mean squared error)를 최소화 하는 파라미터 w, b를 찾음

- w(가중치:weight 또는 계수: coefficient), b(편향:offset 또는 절편:intercept)

- 평균제곱오차는 예측값과 타깃값의 차이를 제곱하여 더한 후에 샘플의 개수로 나눔

- 선형 회귀는 매개변수가 없는 것이 장점이지만, 그래서 모델의 복잡도를 제어할 방법도 없음

- 릿지 회귀(Ridge): 회귀를 위한 선형 모델로 최소적합법(Least Squares Estimation)에서 사용한 거과 같은 예측 함수 사용

- 하지만 릿지 회귀에서의 가중치(w) 선택은 훈련 데이터를 잘 예측하기 위해서 뿐만 아니라, 추가 제약 조건을 만족시키기 위한 목적도 있음. 가중치의 절대 값을 가능한 작게 만드는 것임. 다시 말해서 w의 모든 원소가 0에 가깝게 되길 원함. 직관적으로 생각하면 이는 모든 특성이 출력에 주는 영향을 최소한으로 만듦(기울기를 작게 만듦) 이러한 제약을 규제(Regularization)이라고 함. 

- 릿지 회귀에 사용하는 규제 방식을 L2규제라고 함

- 수학적으로 릿지의 계수의 L2노름(norm)의 제곱을 패널티로 적용

- 평균제곱오차 식에 아래의 식이 추가 됨

 (카이스트 문일철 교수님 강의를 보면 알파가 알파/2로 되어있음)

- 알파 값을 크게 하면, 패널티의 효과가 커지고(가중치 감소), 알파 값을 작게 하면 그 반대가 됨.

- 선형 회귀보다, 모델이 덜 자유롭기 때문에 과대 적합이 적어짐.

즉, 모델의 복잡도가 낮아지면 성능은 나빠지지만 더 일반화 된 모델

- 알파 값의 매개변수를 조정하여 훈련 세트의 성능 대비 모델을 얼마나 단순화 할지 지정할 수 있음.

- 알파값을 줄이면 계수에 대한 제약이 그만큼 풀리게되고, 아주 작은 알파 값은 선형 회귀로 만든 모델과 같아짐

- 라쏘 회귀(Lasso): 선형 회귀에 규제를 적용하는 데 Ridge의 대안으로 Lasso가 있음. 릿지와 같이 라쏘 또한 계수를 0에 가깝게 만듦

- 라쏘 회귀에 사용하는 규제 방식을 L1규제라고 함

- 라쏘의 계수 벡터의 L1노름을 패널티로 사용. 다른 말로 하면 계수의 절대값의 합

- 평균제곱오차 식에 아래의 식이 추가 됨

- 릿지와 마찬가지로 알파 값을 크게 하면 패널티의 효과가 커지고(가중치 감소), 작게 하면 그 반대가 됨

출처: kooc.kaist.ac.kr 인공지능 및 기계학습 개론1 (6강 Regularization 부분)

위의 그림을 보면 lasso의 경우 단일 부분만 겹치는 것을 확인할 수 있다. Ridge의 경우 제곱식이기 때문에 원의 형태로 모델이 생성되는데, 그렇기 때문에 겹치는 부분이 많음을 확인할 수 있다. 이는 즉 특성이 많고 일부분만 중요하다고 생각될 때에는 Lasso, 그렇지 않다면 Ridge모델을 선택하는 것을 확인할 수 있다.



※ 과소 적합을 줄이기 위해 alpha값을 줄여, 패널티의 효과를 줄임(가중치 증가) 

그러나 alpha값을 너무 낮추면 규제의 효과가 없어져 과대 적합이 된다. Linear Regression과 같은 모델이 됨

실제 두 모델 중 보통은 릿지 회귀를 선호함. 하지만 특성이 많고 그 중 일부분만 중요하다면 Lasso가 더 좋은 선택일 수 있다.

또한 분석하기 쉬운 모델을 원한다면 Lasso가 입력 특성 중 일부만 사용되므로 쉽게 해석할 수 있는 모델을 만들어 줄 것이다.

(scikit-learn은 Lasso와 Ridge의 패널티를 결합한 ElasticNet도 제공함. 실제로 가장 좋은 성능을 내지만 L1/L2규제를 위한 매개변수 두 개 조정 필요)


※Logistic Regression, SVM은 알파 값이 아닌 C값을 사용. Ridge와 마찬가지로 L2규제를 사용.

- 규제의 강도를 결정하기 위한 매개변수는 C.

- 위의 알파와 반대로 C의 값이 높아지면 규제가 감소함.다시 말해 매개변수로 높은 C값을 지정하면 훈련세트와 가능한 최대로 맞추려하고, 반대로 C값을 낮추면 모델은 계수 벡터(w)가 0에 가까워지도록 만듦

-> alpha값을 크게 하면 w가 작아지고, C를 작게 하면 w가 작아진다.

w가 작아진다는 것은, 데이트 포인트 중 다수에 맞추려고 하는 반면, w가 커지면 각각 데이터 포인트를 정확히 분류하려고 노력할 것이다.

응 교수님의 2차식과 9차식을 생각해보자. 9차식은 w가 크기 때문에 엄청 난잡한 그래프가 그려지지 않았던가..... 


- 매개변수

- 보통 C와 alpha값은 로그스케일로 최적치를 정한다. (예: 0.01,0.1,1,10)

- L1, L2규제를 정해야 한다. 중요한 특성이 많지 않다고 생각하면 L1규제를 사용. 그렇지 않으면 기본적으로 L2규제 사용

- 장점: 학습 속도가 빠르고 예측도 빠르다. 매우 큰 데이터셋과 희소한 데이터셋에서도 잘 작동한다.

- 단점: 예측이 어떻게 만들어지는지 비교적 쉽게 이해할 수 있지만, 계수의 값들이 왜 그런지 명확하지 않을 때가 있음.

   저 차원 데이터셋 일 때에는 다른 모델이 일반화 성능이 더 좋음


- 데이터 셋: mglearn.datasets.load_extended_boston(), mglearn.datasets.make_forge(), 

   from sklearn.datasets import load_breast_cancer

- 라이브러리

- example: mglearn.plots.plot_linear_regression_wave()

- library: from sklearn.linear_model import LinearRegression        //선형 회귀

from sklearn.linear_model import Ridge                         //Ridge회귀

from sklearn.linear_model import Lasso                         //Lasso 회귀

        from sklearn.linear_model import LogisticRegression    //Logistic 회귀

from sklearn.svm import LinearSVC                               //support vector machine (c는 classifier)



3) Naive Bayes: 분류만 가능. 선형 모델보다 훨씬 빠름. 대용량 데이터셋과 고차원 데이터에 가능. 선형모델보다 덜 정확

- 매개변수: 모델의 복잡도를 조절하는 alpha매개변수 하나를 가지고 있음 (alpha값이 크면 완만해지고, 모델의 복잡도는 낮아짐)

그러나 성능 변동은 비교적 크지 않아...

- 장점: 선형 모델과 비슷함. 훈련과 예측 속도가 빠르며 훈련 과정을 이해하기 쉬움.

희소한 고차원 데이터에서 잘 작동하며, 비교적 매개변수에 민감하지 않음

선형 모델로는 학스 시간이 너무 오래 걸리는 매우 큰 데이터셋에는 나이브 베이즈 모델을 시도해볼 만하며 종종 사용됨.

- 단점: 분류밖에 안된다?



4) Decision Tree: 매우 빠름. 데이터 스케일 조정이 필요 없음. 시각화하기 좋고 설명하기 쉬움.

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

- 일반적으로 트리만들기를 모든 리프 노드가 순수 노드가 될 때까지 진행하면 모델이 매우 복잡해지고, 훈련데이터에 과대 적합됨

  순수 노드로 이루어진 트리는 훈련 세트에 100% 정확하게 맞는 것을 의미. 즉 훈련 세트의 모든 데이터 포인트는 정확한 클래스의 리

  프 노드에 있음. 이렇게 될 경우에는 결정 경계가 클래스의 포인트들에서 멀리 떨어진 이상치 하나에 민감하게 작용됨

- 과대 적합을 막기 위해서는 두 가지가 있음

- 사전 가지치기(pre-pruning): 트리 생성을 일찍 중단하는 전략

- 사후 가지치기(post-pruning 또는 pruning): 트리를 만든 후 데이터 포인트가 적은 노드를 삭제하거나 병합하는 전략

(scikit-learn에서는 사전 가지치기만 지원)


- 매개변수: 트리가 완전히 만들어기 전에 멈추게 하는 사전 가지치기 매개변수. 보통은 사전 가지치기 방법 중 max_depth,

max_leaf_nodes 또는 min_samples_leaf중 하나만 지정해도 과대적합을 막는 데 충분

- 장점: 만들어진 모델을 쉽게 시각화할 수 있어서 비전문가도 이해하기 쉬움. 또한 데이터의 스케일에 구애 받지 않음.

각 특성이 개별적으로 처리되어 데이터를 분할할하는 데 데이터 스케일의 영향을 받지 않으므로 결정트리에서는 특성의 정규화나 표준화 같은 전처리 과정이 필요 없음. 특히 특성의 스케일이 서로 다르거나 이진 특성과 연속적인 특성이 혼합되어 있을 때도 잘 작동

- 단점: 사전 가지치기를 사용함에도 불구하고 과대적합되는 경향이 있어 일반화 성능이 좋지 않음.


- 데이터 셋:  from sklearn.datasets import load_breast_cancer

- 라이브러리

- graph example: mglearn.plots.plot_animal_tree()

- library: from sklearn.tree import DecisionTreeClassifier, from sklearn.tree import DecisionTreeRegressor



5) Random Forest: 결정 트리 하나보다 거의 항상 좋은 성능을 냄. 매우 안정적이고 강력함. 

데이터 스케일 조정 필요없음. 고차원 희소 데이터에는 잘 안 맞음.

- 앞서 확인한 것처럼 결정트리의 주요 단점은 훈련 데이터에 과대적합되는 경향이 있다는 것이다. R.F는 이 문제를 회피하는 방법이다.

- R.F는 기본적으로 조금씩 다른 여러 결정 트리의 묶음이다. R.F의 아이디어는 서로 다른 방향으로 과대적합된 트리를 많이 만들면 그 결과를 평균냄으로써 과대적합된 양을 줄일 수 있다는 것이다. 이렇게 하면 트리 모델의 예측 성능은 유지되면서 과대적합이 줄어드는 것이 수학적으로 증명 되었다.

- 랜덤 포레스트에서 트리를 랜덤하게 만드는 방법은 두 가지 이다.

- 트리를 만들 때 사용하는 데이터 포인트를 무작위로 선택하는 방법

- 분할 테스트에서 특성을 무작위로 선택하는 방법


- R.F 모델을 만들려면 생성할 트리의 개수를 정해야 한다. (RandomForest Regressor나 Classifier의 n_estimators 매개변수)

- 트리를 만들기 위해 부트스트랩 샘플을 생성 (n_samples개의 데이터 포인트 중에서 무작위로 데이터를 n_samples횟수만큼 반복 추출)

- 예를 들면 리스트 ['a','b','c','d']에서 부트스트랩 샘플을 만들면 ['b','d','c','d']가 될 수 있고 ['d','a','d','a']도 가능

- 이렇게 만든 데이터셋으로 결정 트리를 만듦. 이전의 결정 트리 알고리즘과 같이 각 노드에서 전체 특성을 대상으로 최선의 테스트를 찾는 것이 아니고, 알고리즘이 각 노드에서 후보 특성을 무작위로 선택한 후 이 후보들 중에서 최선의 테스트를 찾음. 몇 개의 특성을 고를지는 max_feature 매개변수로 조정할 수 있음. 후보 특성을 고르는 것은 매 노드마다 반복되므로 트리의 각 노드는 다른 후보 특성들을 사용하여 테스트를 만듦

- 부트스트랩 샘플링은 랜덤 포레스트의 트리가 조금씩 다른 데이터셋을 이용해 만들어지도록 함. 또 각 노드에서 특성의 일부만 사용하기 때문에 트리의 각 분기는 각기 다른 특성 부분 집합을 사용. 이 두 메커니즘이 합쳐져서 R.F의 모든 트리가 서도 달라지도록 만듦

- 이 방식에서 핵심 매개변수는 max_feature. max_feature를 n_feature로 설정하면 트리의 각 분기에서 모든 특성을 고려하므로 특성 선택에 무작위성이 들어가지 않음. max_features를 낮추면 R.F 트리들은 많이 달라지고 각 트리는 데이터에 맞추기 위해 깊이가 깊어짐

- R.F로 예측을 할 때는 먼저 알고리즘이 모델에 있는 모든 트리의 예측을 만듦. 회귀의 경우에는 이 예측들을 평균하여 최종 예측을 만듦. 분류의 경우에는 약한 투표 전략을 사용. 즉 각 알고리즘이 가능성 있는 출력 레이블의 확률을 제공함으로써 간접적인 예측을 함. 트리들이 예측한 확률을 평균내어 가장 높은 확률을 가진 클래스가 예측값이 된다.


- 매개변수: n_estimators(클수록 좋음. 더 많은 트리를 평균하면 과대적합을 줄여 안정적임), 

max_features(작은 max_feature는 과대적합을 줄여줌. 일반적으로 기본 값을 쓰는 것이 좋음), max_depth와 같은 가지치기 옵션 

- 장점: 성능이 매우 뛰어나고 매개변수 튜닝을 많이 하지 않아도 잘 작동하며 데이터의 스케일을 맞출 필요가 없음

단일 트리의 단점을 보완하고 장점은 그대로 가지고 있음. 만약 의사 결정 과정을 간소하게 표현해야 한다면 단일 트리를 사용 가능

- 단점: 텍스트 데이터 같이 매우 차원이 높고, 희소한 데이터에는 잘 작동하지 않음. 이런 데이터에는 선형 모델이 더 적합.

또한, 선형 모델보다 많은 메모리를 사용하며 휸련과 예측이 느림.


- 데이터 셋: from sklearn.datasets import make_moons, from sklearn.datasets import load_breast_cancer

- 라이브러리

- library: from sklearn.ensemble import RandomForestClassifier



6) Gradient Boosting Decision Tree: 랜덤 포레스트보다 조금 더 성능이 좋음. 랜덤 포레스트보다 학습은 느리나,

예측은 빠르고, 메모리를 조금 사용. 랜덤포레스트보다 매개변수 튜닝 많이 필요

- 그래디언트 부스팅 회귀 트리는 여러 개의 결정 트리를 묶어 강력한 모델을 만드는 또 다른 앙상블 방법 (이름만 회귀, 분류도 함)

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

- 기본적으로 그래디언트 부스팅은 무작위성이 없음. 대신 강력한 사전 가지치기가 사용됨

- 그래디언트 부스팅은 보통 하나에서 다섯 정도의 깊지 않은 트리를 사용하기 때문에 메모리를 적게 사용하고 예측도 빠름

- 기본적인 아이디어는 얕은 트리 같은 간단한 모델을 많이 연결하는 것. 각각의 트리는 데이터의 일부에 대해서만 예측을 잘 수행할 수 있어서 트리가 많이 추가 될수록 성능이 좋아짐

- 중요한 매개변수로는 이전 트리의 오차를 얼마나 강하게 보정할 것인지를 제어하는 learning_rate가 있음. 학습률이 크면  트리는 보정을 하기 때문에 복잡한 모델을 만듦, n_estimators 값을 키우면 앙상블에 트리가 더 많이 추가되어 모델이 복잡도가 커지고 훈련 세트에서의 실수를 바로잡을 기회가 더 많아짐


- 매개변수: n_estimator, learning_rate

※ n_estimator가 클수록 좋은 랜덤 포레스트와는 달리, 그래디언트 부스팅에서는 크게하면 모델이 복잡해지고 과대적합될 가능성이 높아짐. 일반적인 관례는 가용한 시간과 메모리 한도에서 n_estimator를 맞추고 나서 적절한 learning_rate를 찾음

중요한 또 다른 매개변수는 각 트리의 복잡도를 낮추는 max_depth(또는 max_leaf_nodes)인데, 통상 그래디언트 부스팅 모델에서는 max_depth를 매우 작게 설정하며 트리의 깊이가 5보다 깊어지지 않게 한다.

- 장점: 다른 트리 기반 모델처럼 특성의 스케일을 조정하지 않아도 되고, 이진 특성이 연속적인 특성에서도 잘 동작함

- 단점: 매개변수를 잘 조정해야 한다는 것과 훈련시간이 김. 희소한 고차원 데이터에는 잘 작동하지 않음


- 데이터 셋: from sklearn.datasets import load_breast_cancer

- 라이브러리

- library: from sklearn.ensemble import GradientBoostingClassifier



7) Support Vector Machine: 비슷한 의미의 특성으로 이뤄진 중간 규모 데이터셋에 잘 맞음. 데이터 스케일 조정필요. 매개변수에 민감

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

- 서포터벡터의 이론은 이 책에서는 별로 다루지 않았음.

- 기본적으로 커널, 서포트 벡터, 마진, hard/soft margin, 비선형 decision boundary 등의 내용은 wiki에서 보는 것이 좋다고 판단됨


- 매개변수: 규제 매개변수 C, 어떤 커널을 사용할지와 각 커널에 따른 매개변수

- 장점: 데이터의 특성이 몇 개 안 되더라도 복잡한 결정 경계를 만들 수 있음. 

- 단점: 저차원, 고차원의 데이터에 모두 잘 작동하지만 샘플이 많을 때는 잘 맞지 않음..

또 하나의 단점은 데이터 전처리와 매개변수 설정에 신경을 많이 써야됨. 분석하기도 어려움


근데 다른 책들이나, 요새 논문들을 보면 SVM을 많이 사용하는 데, 이 책의 저자는 SVM을 그닥 높이 평가하지 않는다는 느낌이 들었음..



8) 신경망: 특별히 대용량 데이터셋에서 매우 복잡한 모델을 만들 수 있음. 매개변수 선택과 데이터 스케일에 민감. 학습이 오래 걸림

- MLP(MultiLayer Perceptrons)는 여러 단계를 거쳐 결정을 만들어내는 선형 모델의 일반화된 모습습

- SVM과 마찬가지로, 은닉층, feed-forward, ReLU, tanh 등 wiki에서 보는 것이 더 좋을 것 같음. 내용을 너무 많이 함축시켜놓음음

- 어차피 김성훈 교수님의 딥러닝의 경우 모두를 위한 딥러닝이나 응교수님의 강의를 들을거니깐...?


- 매개변수: 신경망에서 가장 중요한 매개변수는 은닉층의 개수와 각 은닉층의 유닛수이다. 처음에는 한 개 또는 두 개의 은닉층으로 시작해서 늘려가야 된다. 각 은닉층의 유닛 수는 보통 입력 특성의 수와 비슷하게 설정하지만 수천 초중반을 넘는 일은 거의 없다.

신경망의 매개변수를 조정하는 일반적인 방법은 먼저 충분히 과대적합되어서 문제를 해결할만한 큰 모델을 만듦. 그런 다음 훈련데이터가 충분히 학습될 수 있다고 생각 될 때 신경망 구조를 줄이거나 규제 강화를 위해 alpha값을 증가시켜 일반화 성능을 향상시킴


- 장점: 대량의 데이터에 내재된 정보를 잡아내고 매우 복잡한 모델을 만들 수 있음. 충분한 연산 시간과 데이터를 주고 매개변수를 세심하게 조정하면 신경망은 (분류와 회귀 문제에 모두) 종종 다른 머신러닝 알고리즘을 뛰어넘는 성능을 냄

- 단점: 학습이 오래 걸림. 또한 전처리에 주의해야함.

+ Recent posts