일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 앤비디아
- 제 5회 모비우스 대회
- Online judge
- IOT
- OJ
- 대상
- 앤비디아 드라이버
- java
- git
- Mobius Server
- 머신러닝 기초
- Ocean Developer
- 사물인터넷
- 케라스
- nCube
- KETI
- cudnn
- GPU 가속
- 텐서플로
- github
- 머신러닝
- nVidia CUDA
- 창상수령주 포에버
- 임베디드
- 1st prize
- 깃허브 처음
- 백준
- 사이킷런
- 백준 15552
- 딥러닝
- Today
- Total
장효창의 낙서
[머신러닝] 머신러닝 기본지식(Background) 본문
머신러닝 |
일반적 정의 : 명시적인 프로그래밍 없이 컴퓨터가 학습하는 능력을 갖추게 하는 연구분야
공학적 정의 : 어떤 작업 T에 대한 컴퓨터 프로그램의 성능을 P로 측정했을 때 경험 E로 인해 성능이 향상되었다면, 이 컴퓨터 프로그램은 작업 T와 성능 측정 P에 대해 경험 E로 학습한 것.
시스템이 학습하는 데 사용하는 샘플을 훈련세트라고 하고 각 훈련 데이터를 훈련 사례(샘플)이라고 한다.
이러한 시스템의 성능측정을 정확도라고 부른다.
※ 데이터 마이닝 : 머신러닝 기술을 적용해서 대용량 데이터를 분석하면 겉으로 보이지 않는 패턴을 발견하는 것.
머신러닝 시스템의 종류
머신러닝 시스템은 다음과 같은 분류 기준으로 나눌 수 있다.
1. '학습하는 동안의 감독 형태나 정보량의 여부'
2. '입력 데이터의 스트림으로부터 점진적으로 학습할 수 있는지 여부'
3. '어떻게 일반화 되는 지에 대한 여부'
- 학습하는 동안의 감독 형태나 정보량의 여부
학습의 감독 형태나 정보량의 여부로 분류하게 된다면 다음과 같이 4가지 범주로 나눌 수 있다.
- 지도 학습 : 알고리즘에 주입하는 훈련 데이터에 레이블이라는 원하는 답이 포함되는 학습 방법
전형적으로 분류(Classification)가 전형적인 지도 학습 작업이다. 예를 들면 스팸필터를 걸러내는 경우 실제 스팸데이터가 포함된 레이블로 학습을 시켜야 의미가 있다.
또다른 작업은 타깃의 수치를 예측하는 회귀가 있다. 이는 예측 변수라 부르는 특성을 사용해 타깃 수치를 예측한다.
예를 들어 주행거리, 연식, 브랜드 등을 사용해 중고차 가격을 예측하는 것들이 여기에 속한다.
일부 회귀 알고리즘은 분류에도 사용이 될 수 있고, 분류 알고리즘을 회귀에도 사용할 수 있다.
로지스틱 회귀는 클래스에 속할 확률을 출력한다.
대표적인 지도 학습 알고리즘들은 다음과 같다.
- k-nearest neighbors(k-최근접 아웃)
- linear regression(선형회귀)
- logisticregression(로지스틱 회귀)
- SVM(서포트 백터 머신)
- decision tree & random forest (결정트리와 랜덤포레스트)
- neural networks(신경망)
- 비지도 학습
비지도 학습은 지도 학습과 다르게 레이블이 없다. 즉, 시스템이 학습하는데에 아무런 도움이 없는 학습방법을 말한다.
예를들어 한 건물에 들어온 사람들을 그룹으로 묶으려는 경우 정확하게 A,B를 나눌 수 있는 레이블이 없기 때문에 시스템은 스스로 건물의 사람들의 연결고리를 찾아야한다. 이 때, 계층군집 알고리즘을 사용하면 각 그룹을 더 작은 그룹으로 세분화할 수 있다.
또한 시각화 알고리즘도 좋은 예다. 레이블이 없는 대규모 고차원 데이터를 넣으면 도식화가 가능한 2D, 3D 표현을 만들어준다. 해당 알고리즘은 가능한 한 구조를 그대로 유지하려 하므로 데이터가 어떻게 조직되어 있는 지 알 수 있고 위에서 언급한 예상치 못한 패턴(데이터 마이닝)을 가능하게 해준다.
차원 축소 또한 하나의 예시인데, 상관관계가 있는 여러 특성들을 한 데 모아 특성을 줄여나가는 것이다. 이를 특성 추출이라고도 한다.
이상치 탐지 또한 중요한 비지도 학습이다. 학습을 하는데에 정상적인 샘플들을 넣어 학습시키고 이상 샘플을 만나는 경우 이를 인식하도록 할 수 있다. 비슷한 학습으로 특이치 탐지가 있다. 특이치 탐지는 알고리즘으로 감지하고 싶은 모든 샘플을 제거한 매우 "깨끗한" 훈련 세트가 필요하다. 이 둘의 큰 차이는 강아지 사진 수천장에서 1%의 치와와 사진이 있을 때 치와와를 구분하느냐 못하느냐의 차이이다. 특이치 탐지 알고리즘은 치와와를 특이한 것으로 처리하지 못하나 이상치 탐지 알고리즘은 이 강아지를 매우 드물고 다른 강아지와 다르다고 인식할 것이다.
- 준지도 학습
데이터에 레이블을 다는 것은 상당한 시간과 비용이 들기 때문에 일반적인 데이터는 레이블이 없는 경우가 많다.
준지도 학습은 일부만 레이블이 있는 데이터를 다루는 알고리즘을 말한다.
대부분의 준지도 학습 알고리즘은 지도 학습과 비지도 학습의 조합으로 이루어져 있다.
심층 신뢰 신경망(DBN)은 여러 겹으로 쌓은 제한된 볼츠만 머신(RBM)이라 불리는 비지도 학습에 기초한다.
RBM이 비지도 학습 방식으로 순차적으로 훈련된 다음 전체 시스템이 지도 학습 방식으로 세밀하게 조정한게된다.
- 강화 학습
강화학습이란 학습하는 시스템(에이전트)에서 행동을 실행하고 보상 또는 벌점을 받는 시스템을 말한다. 이 시스템은 보상을 얻기 위해 정책이라고 부르는 최상의 전략을 스스로 학습한다. 머신러닝/딥러닝이 가장 유명하게 된 알파고의 경우가 이 강화학습을 통해 학습된 에이전트이다.
- 입력 데이터의 스트림으로부터 점진적으로 학습할 수 있는지 여부
입력 데이터의 스트림으로부터 어떻게 학습하냐에 따라 배치학습과 온라인학습으로 머신러닝을 분류할 수 있다.
- 배치 학습
컴퓨터 관련 전공자라면 Batch라는 말을 많이 들어봤을 것이다. 배치란 일괄 처리를 말하는데, 배치학습도 이와 같다.
학습을 하는데에 있어 시스템이 가용한 데이터를 모두 사용하여 훈련시키는 것을 말한다.
시스템이 점진적으로 학습할 수 없고, 학습을 완료한 후 시스템에 적용하면 더 이상의 학습 없이 실행된다.
이러한 특징 때문에 오프라인 학습이라고도 하며, 새로운 데이터에 대해 학습을 하기 위해서는 시스템을 중지시키고 처음부터 다시 훈련해야한다는 단점이 있다. 또한 많은 컴퓨팅 자원이 소모된다는 단점이 있다.
- 온라인 학습(점진적 학습)
온라인 학습은 데이터를 순차적으로 한 개씩 또는 미니배치라 부르는 작은 묶음 단위로 주입하여 시스템을 훈련시키는 학습방법을 말한다.
예를들어 주식가격 예측같은 빠른 변화에 스스로 적응해야하는 시스템이라든가, 컴퓨팅 자원이 제한된 경우가 적합하다.
온라인 학습시스템은 새로운 데이터 샘플을 학습하면 학습이 끝난 데이터는 더는 필요하지 않기 때문에 많은 공간을 절약할 수 있다는 장점이 있다. 컴퓨터 한 대에 모두 들어가지 않는 아주 큰 데이터를 학습할 때에도 온라인 학습을 이용하는데 이를 외부 메모리 학습이라고 한다.
※ 외부메모리 학습은 보통 오프라인으로 실행되는데 온라인 학습이라는 말이 헷갈릴 수 있다. 점진적학습이라고 기억을 해주면 좋다.
온라인학습에서 가장 중요한 파라미터는 변화하는 데이터에 얼마나 빠르게 적응할 것이냐이다. 이를 학습률(learning rate)라고 한다. 무작정 학습률이 높으면 좋을 것이라고 생각하기 쉬운데 lr이 높으면 새로운 데이터에 대해 빠르게 적응하지만 이전의 데이터를 빠르게 잊기도 한다. 반대로 너무 낮은경우 시스템 관성이 더 커져 학습이 느리다. 또한 잡음(노이즈)에 대해 덜 민감하다는 장점이 있다. 즉, 학습률은 trade-off 관계에 있다고 말할 수 있다.
- 어떻게 일반화 되는 지에 대한 여부
마지막으로 어떻게 머신러닝 시스템은 일반화 되냐에 따라서 구분할 수 있다. 대부분의 머신러닝의 목적은 예측을 하는 시스템이고 이 말은 주어진 훈련 데이터로 학습하고 새로운 데이터가 들어왔을 때, 좋은 예측을 만들어야한다는 것이다.
- 사례 기반 학습
가장 간단한 형태의 학습은 단순하게 기억하는 것이다. 가령 두 물건을 비교하는 경우 완벽하게 유사하지 않기 때문에 유사도를 측정하여 검사를 진행할 수 있다. 이를 비교하여 일반화하며 학습하는 것을 사례 기반 학습이라고 한다.
- 모델 기반 학습
샘플로부터 모델을 만들어 예측에 사용하는 것을 모델 기반 학습이라고 한다. 연속된 데이터들의 특징을 수학적인 하나의 모델로 만들어줌으로써 파라미터를 생성한다. 이러한 모델의 효율을 따지기 위해 효용함수(적합도 함수)를 정의하거나 비용함수를 정의하여 측정 지표를 마련한다.
다음은 선형모델을 훈련하여 예측하는 예시이다.
OECD 데이터에 없는 키프로스 사람들이 행복한 지 알고싶다면 이 모델을 이용하여 알 수 있다.
처음 코드를 돌리는 것이라면 Anaconda3를 설치하고 가상환경을 새로 만들어서 코드를 돌리는 것을 추천한다.
실제로 머신러닝을 돌리다보면 이 전에 설치한 버전문제나 모듈 충돌이 일어나기 때문에 이를 조심해야하기 때문이다.
# Python ≥3.5 이상이 권장됩니다
import sys
assert sys.version_info >= (3, 5)
# Scikit-Learn ≥0.20 이상이 권장됩니다
import sklearn
assert sklearn.__version__ >= "0.20"
def prepare_country_stats(oecd_bli, gdp_per_capita):
oecd_bli = oecd_bli[oecd_bli["INEQUALITY"]=="TOT"]
oecd_bli = oecd_bli.pivot(index="Country", columns="Indicator", values="Value")
gdp_per_capita.rename(columns={"2015": "GDP per capita"}, inplace=True)
gdp_per_capita.set_index("Country", inplace=True)
full_country_stats = pd.merge(left=oecd_bli, right=gdp_per_capita,
left_index=True, right_index=True)
full_country_stats.sort_values(by="GDP per capita", inplace=True)
remove_indices = [0, 1, 6, 8, 33, 34, 35]
keep_indices = list(set(range(36)) - set(remove_indices))
return full_country_stats[["GDP per capita", 'Life satisfaction']].iloc[keep_indices]
import os
datapath = os.path.join("datasets", "lifesat", "")
# 주피터에 그래프를 깔끔하게 그리기 위해서
%matplotlib inline
import matplotlib as mpl
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)
# 데이터 다운로드
import urllib.request
DOWNLOAD_ROOT = "https://raw.githubusercontent.com/rickiepark/handson-ml2/master/"
os.makedirs(datapath, exist_ok=True)
for filename in ("oecd_bli_2015.csv", "gdp_per_capita.csv"):
print("Downloading", filename)
url = DOWNLOAD_ROOT + "datasets/lifesat/" + filename
urllib.request.urlretrieve(url, datapath + filename)
# 예제 코드
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn.linear_model
# 데이터 적재
oecd_bli = pd.read_csv(datapath + "oecd_bli_2015.csv", thousands=',')
gdp_per_capita = pd.read_csv(datapath + "gdp_per_capita.csv",thousands=',',delimiter='\t',
encoding='latin1', na_values="n/a")
# 데이터 준비
country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
X = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats["Life satisfaction"]]
# 데이터 시각화
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()
# 선형 모델 선택
model = sklearn.linear_model.LinearRegression()
# 모델 훈련
model.fit(X, y)
# 키프로스에 대한 예측
X_new = [[22587]] # 키프로스 1인당 GDP
print(model.predict(X_new)) # 출력 [[ 5.96242338]]
# 3-최근접 이웃 회귀 모델로 바꿉니다.
import sklearn.neighbors
model1 = sklearn.neighbors.KNeighborsRegressor(n_neighbors=3)
# 모델을 훈련합니다.
model1.fit(X,y)
# 키프로스에 대한 예측을 만듭니다.
print(model1.predict(X_new)) # 출력 [[5.76666667]]
머신러닝을 하다보면 다음과 같은 몇 가지 문제점들을 마주칠 수 있다.
1. 충분하지 않은 양의 훈련 데이터
머신러닝은 안타깝게도 데이터의 양이 많지 않으면 좋은 성능을 낼 수가 없을 뿐더러 간단한 알고리즘조차 적용하지 못한다. 따라서 머신러닝을 하기 위해선 충분한 양의 많은 데이터가 필요하다.
2. 대표성 없는 훈련 데이터
대표성이 없는 데이터를 사용하여 훈련을 하게되면, 정확한 예측 결과를 내놓지 못할 수 있다. 샘플이 작으면 샘플링 잡음이 일어나고 샘플이 너무 크더라도 표본 추출 방법이 잘못되면 대표성을 띄지 못하는 샘플링 편향이 일어난다.
3. 낮은 품질의 데이터
훈련 데이터가 에러, 이상치, 잡음이 많다면 패턴을 찾기 어려워 작동하지 않는다. 이를 위해서 우리는 데이터를 정제하는 작업을 실시하는데 이를 데이터 프로세싱, 전처리 작업이라고 한다.
4. 관련 없는 특성
엉터리가 들어가면 엉터리가 나오는 것처럼 훈련에 사용할 좋은 특징(feature)를 찾아내는 것이다. 얼마나 중요한지 이를 위한특성 공학이라는 공학이 존재할 정도이다.
5. 훈련 데이터 과대적합
과대적합은 훈련 데이터에 있는 잡음의 양에 비해 모델이 너무 복잡할 때 일어난다.
이의 해결방법은 다음과 같다.
- 파라미터 수가 적은 모델은 선택하거나, 훈련 데이터의 특성 수를 줄이거나, 모델에 제약을 걸어 단순화 시킨다.
- 훈련 데이터를 더 많이 모은다
- 훈련 데이터의 잡음을 줄인다
이렇게 모델에 제약을 가하는 것을 규제라고 하며 규제의 양은 하이퍼파라미터가 결정한다.
하이퍼 파라미터는 학습알고리즘으로부터 영향을 받지 않으며 훈련 전에 미리 지정되고 훈련하는 동안에는 상수로 남아 있다.
6. 훈련 데이터 과소적합
모델이 너무 복잡해서 생기는 현상이 과대적합이라면 과소적합이란 모델이 너무 단순해서 생기는 경우이다. 데이터의 내제된 구조를 모델이 학습하지 못할 때 발생한다. 이를 해결하기 위해선
- 모델 파라미터가 더 많은 강력한 모델을 선택한다.
- 학습 알고리즘에 더 좋은 특성을 제공한다
- 모델의 제약을 줄인다.
테스트 및 검증
모델을 평가하고 필요하다면 상세하게 튜닝을 할 수 있어야 한다.
새로운 샘플에 얼마나 잘 일반화될지 아는 유일한 방법은 새로운 샘플에 실제로 적용해보는 것이다.
이보다 더 나은 방법은 훈련 데이터를 훈련 세트와 테스트 세트 두 개로 나누는 것이다. 이름대로 훈련 세트는 훈련하는데에 사용하고 테스트 세트는 모델을 테스트 하는 데에 사용한다. 새로운 샘플에 대한 오류 비율을 일반화 오차(외부 샘플 오차)라고 하며, 테스트 세트에서 모델을 평가함으로써 이 오차에 대한 추정값을 얻는다.
만약 과적합을 피하기 위해 규제를 적용하려고 하이퍼파라미터를 설정했다고 치자. 이를 실제 테스트에 투입하게 되면 성능이 예상보다 좋지 않은 결과를 나타낼 수 도있다. 이는 테스트 모델에 대해 최적화 된 모델을 만들었기 때문이다.
이를 해결하기 위해 "홀드아웃 검증"을 사용하여 훈련 세트의 일부를 떼어내어 여러 후보 모델을 평가하고 가장 좋은 하나를 선택한다. 이 세트들을 검증 세트라고 한다. 이러한 검증 세트들을 활용하여 일반화 오차를 추정한다.
일반적으로 위의 방법을 사용하면 잘 작동되나, 검증 세트가 너무 작으면 모델이 정확하게 평가가 되지않는다.
최적이 아닌 모델을 잘못 선택할 수 있다. 반대로 검증 세트가 너무 크면 남은 훈련 세트가 전체 훈련 세트보다 너무 작아진다. 이를 위해 작은 검증 세트를 여러 개를 사용하여 반복적인 교차 검증을 수행한다.