1. 평균 제곱 오차 (Mean Squared Error, MSE):
    • 의미: MSE는 예측값과 실제 값 간의 차이(오차)의 제곱을 모든 샘플에 대해 평균화한 값입니다. 이 값이 작을수록 모델의 예측이 정확합니다. 
    • 수식: MSE = (1/n) * Σ(yi - ŷi)² (i는 샘플 인덱스, n은 샘플 수, yi는 실제 값, ŷi는 예측 값)
  2. 평균 절대 오차 (Mean Absolute Error, MAE):
    • 의미: MAE는 예측값과 실제 값 간의 절대값 차이를 모든 샘플에 대해 평균화한 값입니다. MSE와 달리 제곱하지 않으므로 이상치(outlier)에 덜 민감합니다.
    • 수식: MAE = (1/n) * Σ|yi - ŷi| (i는 샘플 인덱스, n은 샘플 수, yi는 실제 값, ŷi는 예측 값)
  3. R-squared (결정 계수, R²):
    • 의미: R-squared는 회귀 모델의 설명력을 나타내며, 예측값이 실제 값의 분산을 얼마나 잘 설명하는지를 나타냅니다. 1에 가까울수록 모델이 높은 설명력을 가집니다.
    • 수식: R² = 1 - (Σ(yi - ŷi)² / Σ(yi - ȳ)²) (i는 샘플 인덱스, yi는 실제 값, ŷi는 예측 값, ȳ는 실제 값의 평균)
  4. 평균 제곱근 오차 (Root Mean Squared Error, RMSE):
    • 의미: RMSE는 MSE의 제곱근 값으로, 예측 오차의 평균적인 크기를 나타냅니다. 미리 예측 오차의 단위와 일치시킬 수 있어 해석하기 쉽습니다.( sklearn에서 제공되지 않음)
    • 수식: RMSE = √MSE
  1. 정확도 (Accuracy):
    • 의미: 정확도는 모델이 올바르게 예측한 샘플의 비율로, 전체 예측 중 올바른 예측의 비율을 나타냅니다.
    • 사용 사례: 이진 분류(두 개의 클래스)나 다중 클래스 분류(여러 개의 클래스)에서 모델의 전반적인 성능을 평가하는 데 사용됩니다.
  2. 정밀도 (Precision):
    • 의미: 정밀도는 모델이 True로 예측한 샘플 중 실제로 True인 샘플의 비율을 나타냅니다. False Positive를 줄이는 데 중점을 둡니다.
    • 사용 사례: 거짓 긍정을 최소화해야 할 때, 예를 들어 스팸 메일 필터링에서 스팸 메일로 오진 않도록 하는 경우.
  3. 재현율 (Recall):
    • 의미: 재현율은 실제 True인 샘플 중 모델이 True로 예측한 샘플의 비율을 나타냅니다. False Negative를 줄이는 데 중점을 둡니다.
    • 사용 사례: 실제 True 샘플을 놓치지 않고 감지해야 할 때, 예를 들어 의료 진단에서 질병을 빠뜨리지 않도록 하는 경우.
  4. F1 점수 (F1 Score):
    • 의미: F1 점수는 정밀도와 재현율의 조화 평균입니다. 모델의 정확성을 평가하는 데 사용되며, 정밀도와 재현율 사이의 균형을 나타냅니다.
    • 사용 사례: 정밀도와 재현율이 중요한 균형을 가져야 하는 경우, 예를 들어 검색 엔진의 검색 결과 정확성을 향상시키는 경우.
  5. ROC 곡선 (Receiver Operating Characteristic Curve):
    • 의미: ROC 곡선은 이진 분류 모델의 성능을 시각화하는 데 사용됩니다. FPR(거짓 양성 비율) 대비 TPR(참 양성 비율)을 나타내며, 곡선 아래 영역(Area Under the Curve, AUC)이 넓을수록 모델의 성능이 우수합니다.
    • 사용 사례: 이진 분류 모델의 성능을 시각적으로 비교하고자 할 때.

목적에 따라 다르게 사용하는 지표

  • 문제 유형과 목표에 따라 다른 평가 지표가 필요함
  • 도메인 지식에 따라서도 달라질 수 있음.
  • 금융 분야: 리스크 최소화가 중요하므로 정확도 보다는 정밀도나 재현율을 높이는 것이 중요
  • 데이터 불균형: 클래스 불균형이 있는 경우 정확도만으로 모델의 성능을 판단하기 어려움. 정밀도, 재현율, F1 score 등을 고려해야함.

'Data Scientist > Machine Learning' 카테고리의 다른 글

이상치 탐지 및 시각화 (코드 예제 포함)  (0) 2023.07.24
[ML] 벡터의 개념  (0) 2022.07.04
[ML] 경사하강법  (0) 2022.07.04
[ML] XGBoost  (0) 2022.03.31
[ML] 앙상블 기법  (0) 2022.02.09

1. 이상 탐지(Anomaly detection)

이상 탐지(anomaly detection)란 자료에서 다른 패턴을 보이는 자료를 찾는 것을 말합니다. 이런 데이터를 이상값(anomaly)라 하며 이상 탐지는 사기 탐지, 침입 탐지, 안전 관리를 포함한 다양한 분야에 널리 활용된다.

2. 이상의 종류

2.1. Point anomaly

데이터셋 내에 하나의 데이터가 나머지에 대해 이상하다고 판단되는 경우, 흔히 아웃라이어(Outlier)라고 부른다.

2.2. Collective anomaly

데이터셋 내에 여러 데이터 포인트가 이상하다고 판단되는 경우

2.3. Contextual anomaly

전체적인 데이터셋의 맥락을 고려했을때 이상하다고 판단되는 경우

3. Isolation forest

Isolation forest는 기본적으로 데이터셋을 의사결정나무(Decision Tree) 형태로 표현해 정상값을 분리하기 위해서는 의사결정나무를 깊숙하게 타고 내려가야 하고, 반대로 이상값은 의사결정나무 상단부에서 분리할 수 있다는 것을 이용한다.

이 특성을 사용해 의사결정나무를 몇 회 타고 내려가야 분리되는가를 기준으로 정상과 이상을 분리한다.

Isolation forest의 장점

  • 군집기반 이상탐지 알고리즘에 비해 계산량이 매우 적다
  • 강건한(Robust)한 모델을 만들 수 있다

# Isolation forest 구현 코드 예제

from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import IsolationForest

df3 = df3.set_index('regdate-display') # 시간 컬럼 넣기
df3 = df3[['msg.base_state.curr-temperature']]  # 데이터 프레임의 원하는 컬럼 넣기

outliers_fraction = float(.01)
scaler = StandardScaler()
np_scaled = scaler.fit_transform(df3.values.reshape(-1, 1))
cast_scaled_df = pd.DataFrame(np_scaled)
model = IsolationForest(contamination=outliers_fraction)
model.fit(cast_scaled_df)
df3['anomaly'] = model.predict(cast_scaled_df)

위 예제는 한 컬럼의 이상치 탐지를 위한 코드이다. 먼저 standartscaler로 표준화 시킨 후 Isolation forest를 진행했다. 

데이터셋의 값이 들쑥날쑥하거나, 매우 큰 경우에는 cost의 값이 발산하여 정상적인 학습이 이루어지지 않기 때문이다!

# 이상치 탐지 시각화 코드

#시각화
fig, ax = plt.subplots(figsize=(10,6))
a = df3.loc[df3['anomaly'] == -1, ['msg.base_state.curr-temperature']] #anomaly

bbox = dict( ## 텍스트 박스 스타일 지정
    boxstyle='square',
    facecolor='white', 
)

line_plot = ax.plot(df3.index, df3['msg.base_state.curr-temperature'], color='black', label = 'Normal')
ax.scatter(a.index,a['msg.base_state.curr-temperature'], color='red', label = 'Anomaly')
line_plot = line_plot[0] # 선 그래프 요소

y = list(a['msg.base_state.curr-temperature'])
new_coord = []
for i in range(len(y)):
    for coord in list(line_plot.get_xydata()):
        if coord[1] == y[i]:
            new_coord.append([coord[0],y[i]])
            
for cor in new_coord:
    ax.text(cor[0],cor[1]+2,f'{int(cor[1])}',fontsize=12, ha='center', label = 'Anomaly', bbox=bbox) 

ax.set_xlabel('time', fontsize = 14)
ax.set_ylabel('msg.base_state.curr-temperature', fontsize = 14)
ax.set_title("이상치 탐지 시각화", fontdict={'fontsize': 14} )
plt.show()
fig.savefig(output_path + 'CART_anomaly_detect.png')

결과 이미지는 아래와 같이 그래프에서 이상치가 어디에 있고 값은 어떤지 상위에 박스로 표시할 수 있도록 했다. 

만약에 위 그래프를 그릴 때 한글이 깨진다면 아래 코드를 실행시키면 된다.

# 한글 폰트 깨짐 방지 코드
import matplotlib as mpl
import matplotlib.font_manager as fm

# print(mpl.matplotlib_fname()) # 디렉토리 확인하기

normal_font = fm.FontEntry(fname=os.path.join('{디렉토리 확인한 후 경로 넣기}', 'NanumGothic.otf'), name='NanumGothic')
fm.fontManager.ttflist.append(normal_font)
mpl.rcParams['font.family'] = normal_font.name


bold_font = fm.FontEntry(fname=os.path.join('/home/srjung/.local/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc', 'NanumBoldGothic.otf'), name='NanumBoldGothic')
fm.fontManager.ttflist.append(bold_font)

plt.rcParams['axes.unicode_minus'] = False

 

참고: Isolation Forest (for anomaly detection) (tistory.com)

'Data Scientist > Machine Learning' 카테고리의 다른 글

모델 성능 평가 지표와 사용 목적  (0) 2023.09.19
[ML] 벡터의 개념  (0) 2022.07.04
[ML] 경사하강법  (0) 2022.07.04
[ML] XGBoost  (0) 2022.03.31
[ML] 앙상블 기법  (0) 2022.02.09

벡터란?

- 숫자를 원소로 가지는 리스트 또는 배열(행벡터/열벡터)

- 벡터는 공간에서 한 점을 의미(n차원)

- 원점으로부터 상대적 위치를 표현( 스칼라곱: 벡터의 길이를 나타내는 연산자)

- 벡터에 숫자를 곱해주면 길이만 변함(스칼라곱: 주어진 벡터의 길이를 변환해주는 것)

- 벡터끼리 같은 모양을 가지면 덧셈, 뺄셈, 성분곱(hadamard product)을 계산할 수 있음

- 두 벡터의 덧셈/뺄셈은 다른 벡터로부터 상대적 위치이동을 표현

- 벡터의 노름(norm) : 원점에서부터의 거리(임의의 차원 d에 대해 성립함) - 각 노름에 따라 기하학적 성질이 달라짐

      L1 노름: 각 성분의 변화량(x축과 y축의 이동거리)의 절대값을 모두 더함

      L2 노름: 피타고라스 정리를 이용해 원점에서 x라는 벡터로 직접 이어지는 선(유클리드 거리)를 계산함 

                     -> np.linalg.norm을 이용해서 구현 가능

  

-> L1, L2 노름을 이용해 두 벡터 사이의 거리를 계산할 수 있음 - 벡터의 뺄셈을 이용

-> L2 노름에서만 두 벡터 사이의 거리르 이용해 각도를 계산해 볼 수 있다.

    내적(inner product): 분자를 쉽게 계산하는 방법( 두 벡터들의 연산들의 성분곱을 취한 후, 모든 벡터들을 다 더해줌)

      -> 정사영(orthogonal projection)된 벡터의 길이와 관련 있다. - 정사영: x와 y 벡터가 있을 때 x가 y라는 벡터로 그림자            처럼 표현되는것

출처: 부스트 캠프 

'Data Scientist > Machine Learning' 카테고리의 다른 글

모델 성능 평가 지표와 사용 목적  (0) 2023.09.19
이상치 탐지 및 시각화 (코드 예제 포함)  (0) 2023.07.24
[ML] 경사하강법  (0) 2022.07.04
[ML] XGBoost  (0) 2022.03.31
[ML] 앙상블 기법  (0) 2022.02.09

경사하강법

- 미분의 개념과 그래디언트 벡터에 대해 알면 경사하강법의 알고리즘과 수식을 이해할 수 있다!

- 특히 변수가 벡터인 경우, 편미분을 통해서 구한 그래디언트 벡터를 통해 d-차원으로 경사하강법을 확장할 수 있다

 

미분(differentiation)의 개념:

변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로 최적화에서 제일 많이 사용하는 기법(최소점과 최대점 찾기)

-> sympy.diff 함수 이용해서 계산할 수 있음

-> 미분을 어디에 쓰지? : 접선의 기울기를 구할때/ 한점에서 접선의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가하는지/ 감소하는지 알 수 있다

-> 미분값을 빼면 경사하강법(gradient descent)이라고 하며 극소값의 위치를 구할 때 사용한다.

-> 미분값을 더하면 경사상승법(gradient ascent)이라 하며 함수의 극대값의 위치를 구할 때 사용한다.

-> 경사상승/하강법은 극값에 도달하면 움직임을 멈춤: 극값에서는 미분값이 0이므로 더 이상 업데이트가 안된다. 그러므로 목적함수 최적화가 자동으로 끝난다.

# 경사하강법 알고리즘
# gradient: 미분을 계산하는 함수
# init: 시작점, lr:학습률, eps:알고리즘 종료조건

var = init
grad = gradient(var)
while(abs(grad) > eps):
	var = var - lr * grad
    grad = gradient(var)

-> 변수가 벡터나 행렬일 경우: 편미분(partial differentiation) 사용

     단위벡터: 주어진 벡터 x가 있을 때, 그 x의 i번째 벡터에만 영향을 주고 나머지에는 영향을 주지 않음

-> 각 변수별로 편미분을 계산한 그레디언트(gradient) 벡터를 이용해 경사하강/ 경사상승법에 사용할 수 있다.(편미분이 d개)

# 경사하강법 알고리즘(벡터나 다변수일 경우)
# gradient: 그레디언트 벡터를 계산하는 함수
# init: 시작점, lr:학습률, eps:알고리즘 종료조건

var = init
grad = gradient(var)
while(norm(grad) > eps):  # 절대값 대신에 노름을 계산해서 종료조건 설정
	var = var - lr * grad
    grad = gradient(var)

출처:부스트 캠퍼스

'Data Scientist > Machine Learning' 카테고리의 다른 글

이상치 탐지 및 시각화 (코드 예제 포함)  (0) 2023.07.24
[ML] 벡터의 개념  (0) 2022.07.04
[ML] XGBoost  (0) 2022.03.31
[ML] 앙상블 기법  (0) 2022.02.09
[ML] tensorflow와 keras 의 차이  (0) 2022.02.03

  • Extreme Gradient Boosting의 약자
    • Boosting: 여러 개의 약한 의사결정나무(Decision Tree)를 조합해서 사용하는 앙상블(Ensemble) 기법 중 하나. , 약한 예측 모형들의 학습 에러에 가중치를 두고, 순차적으로 다음 학습 모델에 반영하여 강한 예측모형을 생성

Regression, Classification 문제를 모두 지원하며, 성능과 자원 효율이 좋아, 인기 있게 사용되는 알고리즘

병렬 처리를 사용해 학습, 분류 속도가 빠름

XGBoost 자체에 과적합 규제 기능이 있어 강한 내구성을 지님

다른 알고리즘과 연계 활용성 좋음 Ensembling 학습 가능

'Data Scientist > Machine Learning' 카테고리의 다른 글

[ML] 벡터의 개념  (0) 2022.07.04
[ML] 경사하강법  (0) 2022.07.04
[ML] 앙상블 기법  (0) 2022.02.09
[ML] tensorflow와 keras 의 차이  (0) 2022.02.03
[ML] 머신러닝의 큰 그림 살펴보기(왕기초)  (0) 2021.12.03

특징

  • 하나의 데이터를 여러개의 분류기를 통해 다수의 학습 모델을 만들어 학습시키고, 학습 결과를 결합함으로써 과적합을 방지하고 정확도를 높이는 학습 기법.  즉, 다양한 학습 알고리즘들을 결합하여 학습시키는 학습 기법
  • 예측력 보완 Good - 더 많은 연산능력을 활용하여 더 좋은 예측력 가짐
  • 각각의 알고리즘을 single로 사용할 경우 나타나는 단점들 보완

 

유형

  • 앙상블 기법 종류: 보팅, 배깅, 부스팅, 스태킹 등

1. 보팅

  • 앙상블 학습의 기본, 하위 모든 기법들이 보팅 사용
  • 하나의 데이터에 여러 알고리즘 적용
  • 여러 모델에서 구해진 예측값들을 대상으로 다수결 투표를하여 최종 클래스를 예측
  • 하드 보팅과 소프트 보팅

 

2. 배깅

  • 하나의 데이터를 여러개로 나누어 학습하는(부스트래핑) 앙상블 학습법
  • Booststrap Aggregating의 줄임말
    • 부트스트랩이란?
    • : 학습 데이터셋에서 중복을 허용하여 랜덤하게 추출하는 방식(aka. 리샘플링), random sampling을 통해 training data를 늘릴 수 있음
      • 장점: 분산 감소, 학습 데이터가 충분하지 않더라도 충분한 학습효과를 줌 - underfitting, overfitting 문제 해결 도움
      • 단점: 중복으로 인해, 특정 샘플은 사용되지 않고 특정 샘플은 여러번 사용되어 편향될 가능성
  • 여러개로 나누어진 데이터에 하나의 알고리즘 적용
  • 하지만 여러개로 나누어진 데이터를 이용하는 배깅에서도, 최종 예측값을 선택하는 행위는 '보팅'이라 함
  • 대표적 알고리즘: 랜덤 포레스트(Random Forest)

3. 부스팅

  • 병렬로 수행되는 배깅과 달리, 각 결과값을 이용하여 순차적으로 결합
  • 성능이 약한 학습기(weak learner)를 여러 개 연결하여 순차적으로 학습함으로써 강한 학습기(strong learner)를 만드는 기법
  • 즉, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에서는 가중치(Weight)를 부여하면서 학습과 예측을 진행하는 기법
  • 장점: 오답에 대해 높은 가중치를 부여하고 정답에 대해 낮은 가중치를 부여하여 오답에 더욱 집중
  • 단점: 이상치(Outlier)에 취약
  • 대표적 알고리즘: 그래디언트 부스팅 (Gradient Boosting), XgBoost (eXtra Gradient Boost), LightGBM

 

참고:

 

1. 앙상블(Ensemble) 기법과 배깅(Bagging), 부스팅(Boosting), 스태킹(Stacking)

안녕하세요, 허브솔트에요. 저희 데이터맛집의 허브솔트 첫 글 주제로 앙상블이 당첨됐네요...! 요새 캐글의 상위권 메달을 휩쓸고 있는 대세 알고리즘이 앙상블 기법을 사용한 알고리즘의 한

data-matzip.tistory.com

 

 

앙상블(Ensemble)

1. 앙상블 방법들(Ensemble methods) 앙상블은 분류에서 가장 각광받는 알고리즘 방법 중 하나입니다. 딥러닝을 제외한 정형 데이터의 예측 분석 영역에서는 앙상블이 매우 높은 예측 성능으로 인해

gggggeun.tistory.com

구글에서 개발한 텐서플로우와 케라스 프레임워크의 차이점

둘은 무슨 사이?

  • Tensorflow 는, 구글에서 개발하고 오픈소스로 공개한 머신러닝 프레임워크입니다.
  • Keras 는, Tensorflow 위에서 동작하는 라이브러리입니다.

왜 Tensorflow 가 있는데, 그 위에서 동작하는 Keras 가 필요한가?

  • Tensorflow 는 훌륭한 프레임워크이지만, 아직 사용을 하기에는 어려운 부분이 많습니다.
    • 특히, 처음 머신러닝을 접하는 사람이라면 더욱 그렇습니다.
  • 반면, Keras 는 사용자 친화적으로 개발되었기 때문에 사용이 매우 편합니다.
    • 정말 간단한 신경망의 경우, 겨우 몇 줄 만으로 만들 수가 있습니다.

언제 Tensorflow 와 Keras 를 사용하는게 좋은가?

  • 만약, 머신러닝을 처음 시작하고, 비교적 단순한 신경망을 구성하거나, 기존의 갖추어진 기능만을 사용해, 빠른 시간 내에 프로토타이핑을 하고자 한다면, Keras 만으로 충분 할 수 있습니다.
  • 하지만, Tensorflow 는 훨씬 더 디테일한 조작이 가능하므로, 신경망을 유심히 관찰하고, 연구 및 개발을 해야하는 경우라면, Tensorflow 를 사용하는 것이 좋을 수 있습니다.
    • Tensorflow 에서는 Threading 이나 Queue 등의 메커니즘을 훨씬 디테일하게 사용할 수 있고
    • 내부 구조를 확인할 수 있는 디버거를 사용할 수도 있습니다.

가장 좋은 옵션은?

  • tf.keras 로 주요 틀을 구현하고, 순수한 Tensorflow 로 내용을 채워넣는 방법이 가장 좋은 옵션이 될 수 있습니다.

참고

https://wooono.tistory.com/77

( 핸즈온 머신러닝 책 study p.67~)

머신러닝이 어떻게 돌아가는지, 어떤 순서로 데이터를 가공하고 적용할지에 대해서 큰 그림을 그려보긔

 

1. 문제정의 - 어떤 기법을 쓰지? 어떤 데이터지? 


2. 성능 측정 지표 선택 - 대표적: 평균 제곱근 오차(RMSE): 유클리디안 노름(방법), 예측값의 벡터와 타깃값의 벡터 사이의 거리를 재는 방법


3. 데이터 가져오기


4. 환경 구축
  1) 데이터 구조 훑기: head(),info(), value_counts(), describe(), 
  2) 데이터 시각화를 통해 데이터 살펴보기
   : 히스토그램을 통해 알 수 있는 결과: 각 컬럼들의 스케일, 상한 하한값, 특성 어떻게 표시되어있는지, 모양의 분포를    통해 정규화해야할지 말지 정하기
   3) 테스트 세트 만들기
   : 테스트 세트를 떼어놓는 이론적인 방법: 무작위로 어떤 샘플을 선택해서 데이터셋의 20% 정도를 (데이터셋이 매우         크다면 그보다 적게) 떼어놓으면 됨.


4. 데이터 이해를 위한 탐색과 시각화
   : 산점도, 상관관계 조사(corr()), 등등


5. 머신러닝 알고리즘을 위한 데이터 준비
   1) 데이터 정제: dropna(), drop(), fillna(), simpleImputer()(누락된 값을 손쉽게 다루게 해줌, 누락된 값을 특성의 중간          값으로 대체 한다고 지정)
   2) 텍스트와 범주형 특성 다루기- > 텍스트를 숫자로 변환(OrdinalEncoder() 사용), OneHotEncoder()
   3) 특성 스케일링: min-max스케일링(정규화), StandardScaler()(표준화)

 

6. 모델 선택과 훈련
   :과소/과대적합 고려하기
    1) 선형회귀 모델: LinearRegression
    2) 의사결정 모델: DecisionTreeRegressor
    3) RandomForestRegressor
    4) 과대 적합일 경우 대안으로 사용하는 방법: 교차검증(k fold cross_val_score)


7. 모델 세부 튜닝

   1) 그리드 탐색(GridSearchCV)

       : 만족할 만한 하이퍼파라미터 조합을 찾아줌

   2) 랜덤 탐색(RandomizedSearchCV)

      : 그리드 서치와 비슷하지만 하이퍼파라미터 탐색공간이 커지면 사용하는 편이 좋음

   3) 앙상블 방법

      : 최상의 모델을 연결해보는 것, 모델의 그룹을 단일 그룹보다 더 나은 성능을 발휘할 때가 많음, 

   4) 최상의 모델과 오차분석

      : 정확한 예측을 위한 특성의 상대적인 중요도를 알려줌

   5) 테스트 세트로 시스템 평가하기

머신러닝이란?

데이터에 모델을 맞추는 것!(fitting) 모델은 데이터의 특징과 성향에 따라 기법을 적용시켜 최적화시킨다.

어떤 조건에 대해 예측을 할때, 다음과 같은 방법으로 할 수 있다. 

 

지도 학습과 비지도 학습

- 학습하는 동안의 감독 형태나 정보량에 따라 분류

 

지도학습

1. 레이블이 있다.

2. 분류(classification)

3. 회귀(regression): 예측 변수라는 특성(feature)을 사용해 타깃 수치를 예측하는 것

4. 지도학습 알고리즘: K-최근접 이웃(k-nearest neighbors), 선형회귀(Linear Regression), 로지스틱 회귀(Logistic regression), 서포트 벡터 머신(Support Vector Machine), 결정트리와 랜덤 포레스트(Decision tree, Random Forest), 신경망(neural networks)

 

비지도 학습

1. 레이블이 없다. 

2. 비지도 학습 알고리즘:

군집(clustering) - k-평균(k-means) DBSCAN, 계층 군집분석(hierarchical cluster analysis)(HCA), 이상치 탐지와 특이치 탐지(outlier detection, novelty detection), 원-클래스(one-class SVM), 아이솔레이션 포레스트(isolation forest)

시각화와 차원축소(visualization, dimensionality reduction) - 주성분 분석(principal component analysis)(PCA), 커널PCA(kernel), 지역적 선형 임베딩(locally-linear embedding)(LLE), t-SNE(t-distributed stochastic neighbor embedding)

연관 규칙 학습(association rule learning) - 어프라이어리(Apriori), 이클렛(Eclat)


준지도 학습

1. 일부만 레이블이 있는 데이터

2. 지도 학습과 비지도 학습의 조합으로 이루어져 있다.

3. ex)구글 포토 호스팅 서비스

 

강화 학습

1. 에이전트: 학습하는 시스템

2. 환경을 관찰해서 행동을 실행하고 그 결과로 보상을 받는 것. 최상의 보상을 받기 위해 스스로 학습, 에이전트가 상황별로 어떻게 행동해야할지 결정.


배치 학습과 온라인 학습

- 입력 데이터의 스트림으로부터 점진적으로 학습할 수 있는지에 대한 여부에 따라 분류

 

배치 학습 

1. 시스템이 점진적으로 학습할 수 없음. 가용한 데이터를 모두 사용해 훈련

2. 오프라인 학습이라고도 함.

3. 시스템을 훈련시키고 제품 시스템에 적용하면 더 이상의 학습 없이 실행됨.

4. 이 시스템이 새로운 데이터에 학습하려면 시간과 비용 많이 소요, 새롭게 다시 훈련시켜야함.

 

온라인 학습

1. 데이터를 순차적으로 한개씩이나 미니배치라 부르는 작은 묶음 단위로 주입하여 시스템 훈련

2. 학습단계가 빠르고 비용이 적게듦 

3. 학습해야하는 데이터가 방대할 때, 그리고 학습에 사용되는 데이터가 꾸준히 입력될때 사용


사례 기반 학습과 모델 기반 학습

- 어떻게 일반화(generalize)되는가에 따라 분류. 일반화란 주어진 훈련 데이터로 학습하고 훈련 데이터는 본 적 없는 새로운 데이터에서 좋은 예측을 만들어야한다는 뜻

 

사례 기반 학습

1. 시스템이 훈련 샘플을 기억함으로써 학습

2. 비슷한 것 끼리 유사도 측정해 새로운 데이터와 학습한 데이터 샘플을 비교하는 식으로 일반화함

 

모델 기반 학습

1. 샘플들의 모델을 만들어 예측에 사용하며 일반화 시키기


 

머신러닝 프로젝트 형태를 요약하자면,

 

1. 데이터를 분석한다. 

2. 모델을 선택한다.

3. 훈련 데이터로 모델을 훈련시킨다. (비용함수 최소화하는 파라미터 찾기)

4. 테스트 데이터나 새로운 데이터에 모델을 적용해 예측한다. 

 

 

여기서, 머신러닝 데이터를 테스트셋과 트레이닝 셋으로 나누는 이유

training dataset은 학습시킬 파라미터들을 결정하는데 사용, 학습할 데이터

test dataset은 실제 학습된 모델을 평가하는데 사용되는 데이터. 이 데이터를 통해 머신러닝 알고리즘이 얼마나 잘 학습되었는지 평가함.

 

 

 

교차 검증이란?

  • 보통은 train set 으로 모델을 훈련, test set으로 모델을 검증한다.
  • 여기에는 한 가지 약점이 존재한다.
  • 고정된 test set을 통해 모델의 성능을 검증하고 수정하는 과정을 반복하면, 결국 내가 만든 모델은 test set 에만 잘 동작하는 모델이 된다.
  • 즉, test set에 과적합(overfitting)하게 되므로, 다른 실제 데이터를 가져와 예측을 수행하면 엉망인 결과가 나와버리게 된다.
  • 이를 해결하고자 하는 것이 바로 교차 검증(cross validation)이다.
  • 교차 검증은 train set을 train set + validation set으로 분리한 뒤, validation set을 사용해 검증하는 방식이다.

 

교차 검증의 장점과 단점

  • 장점
    • 모든 데이터셋을 훈련에 활용할 수 있다.
      • 정확도를 향상시킬 수 있다.
      • 데이터 부족으로 인한 underfitting을 방지할 수 있다.
    • 모든 데이터셋을 평가에 활용할 수 있다.
      • 평가에 사용되는 데이터 편중을 막을 수 있다.
      • 평가 결과에 따라 좀 더 일반화된 모델을 만들 수 있다.
  • 단점
    • Iteration 횟수가 많기 때문에, 모델 훈련/평가 시간이 오래 걸린다.

 

교차 검증 기법 종류

  • K-Fold Cross Validation ( k-겹 교차 검증 )
  • Stratified K-Fold Cross Validation ( 계층별 k-겹 교차 검증 ) 등

1. K-Fold Cross Validation ( k-겹 교차 검증 )

  • K-Fold는 가장 일반적으로 사용되는 교차 검증 방법이다.
  • 보통 회귀 모델에 사용되며, 데이터가 독립적이고 동일한 분포를 가진 경우에 사용된다.
  • 자세한 K-Fold 교차 검증 과정은 다음과 같다.
    1. 전체 데이터셋을 Training Set과 Test Set으로 나눈다.
    2. Training Set를 Traing Set + Validation Set으로 사용하기 위해 k개의 폴드로 나눈다.
    3. 첫 번째 폴드를 Validation Set으로 사용하고 나머지 폴드들을 Training Set으로 사용한다.
    4. 모델을 Training한 뒤, 첫 번 째 Validation Set으로 평가한다.
    5. 차례대로 다음 폴드를 Validation Set으로 사용하며 3번을 반복한다.
    6. 총 k 개의 성능 결과가 나오며, 이 k개의 평균을 해당 학습 모델의 성능이라고 한다.
  • 예제 코드
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes

diabetes = load_diabetes()
X_train, X_test, y_train, y_test = train_test_split(diabetes.data, diabetes.target, test_size=0.3) # test_size=0.3: train- 7대 test- 3으로 비율 나눠줌

model = LinearRegression()
model.fit(X_train, y_train)

print("학습 데이터 점수: {}".format(model.score(X_train, y_train)))
print("평가 데이터 점수: {}".format(model.score(X_test, y_test)))​
from sklearn.model_selection import cross_val_score, cross_validate
import numpy as np

scores = cross_val_score(model, diabetes.data, diabetes.target, cv=5)

print("교차 검증 정확도: {}".format(scores))
print("교차 검증 정확도: {} +/- {}".format(np.mean(scores), np.std(scores)))

 

KFold 상세 조정하기

  • 위 cross_val_score 함수에서는, cv로 폴드의 수를 조정할 수 있었다.
  • 만약 검증함수의 매개변수를 디테일하게 제어하고 싶다면
  • 따로 검증함수 객체를 만들고 매개변수를 조정한 다음, 해당 객체를 cross_val_score의 cv 매개변수에 넣을 수도 있다.
  • 이를 '교차 검증 분할기' 라고도 한다.
from sklearn.datasets import load_iris 
from sklearn.model_selection import KFold 
from sklearn.model_selection import cross_val_score 

iris_data = load_iris() 

# 모델 
logreg = LogisticRegression() 

# n_split : 몇개로 분할할지 
# shuffle : Fold를 나누기 전에 무작위로 섞을지 
# random_state : 나눈 Fold를 그대로 사용할지 

kfold = KFold(n_splits=6, shuffle = True, random_state=0) 

# 파라미터는 (모델, Traingdata의 feature, Trainingdata의 target, 폴드수) 이다. 
scores = cross_val_score(logreg , iris.data , iris.target ,cv=kfold) 

# Trainingdata에 대한 성능을 나타낸다. 
print('교차 검증별 정확도:',np.round(scores, 4)) 
print('평균 검증 정확도:', np.round(np.mean(scores), 4))

 

 

+ Recent posts