Azure ML Studio 제공 회귀 알고리즘

회귀 알고리즘 설명
Poisson Regression 포아송 분포를 이용하여 만든 회귀 알고리즘
단위 시간 당 특정 사건이 발생할 횟수를 예측함 (양의 정숫값)
예시 : 일주일 고객센터 문의 수, 하루 교통사고 발생 건수 예측
Linear Regression 선형회귀식을 이용하여 예측하는 회귀 알고리즘
독립변수(feature)와 종속변수(label)와의 선형적인 관계 예측
통계적 기법을 활용하며, 복잡하지 않은 선형 관계를 가질 때 유용함
Bayesian Linear Regression 기존의 linear regression과 베이즈 확률 이론을 함께 사용하는 알고리즘
베이즈 확률 : 특정 사건의 발생 확률은 이전에 일어난 사건에 영향을 받는다는 이론
데이터 간 연관 관계가 충분히 나타나 있을 때 사용하면 빠른 모델링이 가능함
Neural Network Regression 인공신경망을 활용한 회귀 알고리즘
선형 회귀로 모델링하기 어려운 복잡한 문제에 적용
인공신경명 모델 특성 상 모델링에 시간이 많이 걸림
Decision Forest Regression 의사결정나무 알고리즘을 이용한 회귀 알고리즘
메모리 효율적인 알고리즘으로 높은 성능을 보임
Boosted Decision Tree Regression 의사결정나무 기반 회귀 알고리즘
결정나무를 순차적으로 강화하여 학습하는 모델
단순 의사결정나무 회귀 알고리즘에 비해 메모리 사용량이 높지만 정확도는 향상됨
Fast Forest Quantile Regression 의사결정나무를 이용하여 범위나 분포를 예측하는 회귀 알고리즘
1/4 , 2/4, 3/4 등 사분위수 위치의 값을 빠르게 예측
예시 : 가격, 온도 등의 분포를 예측할 때 주로 사용함

CART(Classification And Regression Tree)는 나무 기반 알고리즘을 말한다.

그중에서도 특히 분류(범주 예측)와 회귀(수치 예측)에 모두 사용할 수 있는 알고리즘이다.

회귀에 사용할 경우 불순도(gini index)가 아니라 실측값과 예측값의 오차를 이용한다.

 

Decision Tree Regression

Decision Tree Regression로 의사결정나무 알고리즘을 회귀 분석에 적용한 모델이다.

입력 변수의 영역을 여러 구간으로 나누고, 각 구간에 대해 고정 값을 예측하는 방식으로 동작한다.

이를 통해 비선형적인 데이터에 대해 유연한 예측이 가능하다.

 

가령 위와 같은 예시가 있다고 해보자. 좌측이 clf 우측이 reg에 해당한다.

 

그렇다면 분기를 정하는 기준이 무엇일까?

각 노드에서 최적의 분할 기준을 찾기 위해 손실함수 사용한다. 이때 보통 MSE(평균제곱오차)를 사용한다.
손실함수(MSE, MAE 등)를 사용하여 각 분할 구간 내의 데이터 포인트와 평균 간의 오차를 최소화 하는 방향으로 분할한다.

 

데이터 분할 예시 (섭취량 10%일때)

모든 데이터에 대해 각 데이터 포인트들을 각 지역 평균과의 차이를 통해 RSS 계산

잔차제곱합 (RSS, Residual Sum of Squre)

특정 지역(Region) 내에 있는 데이터들의 평균과 데이터의 차이의 제곱합

모든 데이터로부터 손실(RSS)을 계산하여 이를 최소화 하는 방향으로 학습함

모든 데이터에 대해 각 데이터 포인트들을 각 지역 평균과의 차이를 통해 RSS 계산

최소의 RSS를 갖는 변수값을 기준으로 산점도를 분할 후 트리의 노드 생성

 

SVM

데이터를 두 개의 클래스 또는 여러 클래스 중 하나로 나누는 최적의 초평면(hyperplane)을 찾는 알고리즘

두 클래스 간의 경계를 정의하는 것이 SVM의 목표다.

여기서 초평면은 데이터를 나누는 경계를 말한다. 2차원에서는 선이지만 3차원 공간에서는 평면이다.

 

지원 벡터(Support Vector)

각 클래스에서 경계에 가장 가까운 데이터 포인트들, 지원벡터들은 초평면을 정의하는 데 사용

마진(Margin)

두 클래스 간의 거리 (마진을 최대화하는 것이 SVM의 목표), 마진이 클수록 모델의 일반화 능력 높음

 

초평면을 찾기 위해서, 초평면과 가장 가까운 지원 벡터들과의 거리래르 최대화하게끔 찾는다.

수학적으로는 𝑤𝑥 + 𝑏 vs 0라고 쓴다. 이때 𝑤는 가중치 벡터, 𝑏는 편향(bias)이다.

다르게 표현하자면 class 1 : 𝑤𝑥 + 𝑏 > 0 , class 0 : 𝑤𝑥 + 𝑏 < 0라고 할 수 있다.

 

이상치(outlier) 허용 여부에 따라서 초평면을 크게 2가지로 나눌 수 있다.

하나는 Hard Margin이고 다른 하나는 Soft Margin이다.

 

하드 마진(Hard Margin)

데이터가 완벽하게 분리 되도록 함

모든 데이터 포인트가 초평면으로부터 일정 거리 이상 떨어져 있어야 함

마진의 폭이 줄어들 수 있으며, 과적합 문제 야기 가능

 

소프트 마진(Soft Margin)

일부 데이터 포인트가 초평면에 가까이 있거나 초평면을 넘을 수 있음

실제 데이터는 완벽하게 분리되지 않는 경우가 많기 때문에 소프트 마진이 실용적

마진이 커지는 반면, 과소적합 문제 우려

 

참고로 SVM 알고리즘은 과대적합이 쉬운 알고리즘이다.

따라서 적절한 규제(regularization)를 통하여 과대적합 최소화가 반드시 필요하다.

SVM에서는 규제 파라미터 (C)를 활용하는데, 마진 폭(하드마진, 소프트마진)을 조절하여 과대적합을 줄인다.

 

정규화

SVM 알고리즘은 변수 간 스케일 차이에 민감하게 동작한다.

따라서, SVM 적용 전에 데이터의 정규화가 필수적인 알고리즘 중 하나다.

Unscaled 차트의 데이터는 x의 스케일이 x보다 크며, SVM이 수치적 비율에 따라 결정 경계 구성한다.

Scaled 차트는 두 변수의 스케일을 맞춰 주어, 비율에 따라 더 여유로운 마진의 결정 경계를 구성한다.

 

 

커널 트릭은 직선으로 구분할 수 없는 데이터 세트의 경우에 사용되는 변환 방법이다.

 

일반적으로 비선형 데이터를 처리할 때 사용하는 방법이다.

SVM은 커널 트릭을 사용하여 비선형 데이터를 고차원 공간으로 변환하고, 변환된 공간에서 데이터를 선형적으로 분리한다.

커널 종류로는 선형 커널, 다항 커널, RBF(가우시안) 커널 등이 있다.

 

  Min-Max 정규화 Max Abs 정규화 tanh 정규화
정의 데이터를 0과 1사이로 변환 데이터의 절대 최대값을 기준으로,
-1에서 1의 범위로 변환하는 방법
하이퍼볼릭 탄젠트(tanh) 함수를 이용
공식 𝑋 = 𝑋−𝑋𝑚𝑖𝑛 / 𝑋𝑚𝑎𝑥−𝑋𝑚𝑖𝑛 𝑋 = 𝑋  / | 𝑋𝑚𝑎𝑥 | 데이터 표준화 후 tanh 함수를 적용 후
값을 [-1, 1] 범위로 변환
장점 특정 속성에 대해 편향되지 않도록 함 ㆍ 중심을 유지하며 크기만 조정 가능
ㆍ 양수와 음수가 섞인 데이터에 유용
ㆍ 데이터의 분포가 중간값을 중심으로 대칭적이지 않을 때 유용
ㆍ 이상치의 영향을 적게 받음
단점 이상치에 매우 민감함
(데이터 범위가 왜곡 가능성 있음)
절댓값 최대치에 민감
(여전히 이상치가 문제 있음)
계산이 상대적으로 복잡함

여러 가지 정규화 방법을 비교한 표

 

시그모이드와 비교했을 때 tanh가 훨씬 가파르다.

이처럼 중앙에 있는 값들을 더 상사하게 확인하고 싶을 때 tanh를 사용한다.

 

Logistic Regression

로지스틱 회귀(Logistic Regression)는 종속 변수가 이진(0 또는 1)인 경우에 사용되는 회귀 분석 기법이다.

가령 환자의 질병 유무를 구한다든가, 이메일의 스팸 여부를 판단한다든가 할 때 사용한다.

회귀식은 y = β0 + β1x + ε로 쓰고,  각 데이터 포인트는 y = β0 + β1xi + εi이다.

 

오즈비(Odds ratio)

실패 대비 성공 확률의 비율이다. 성공 확률을 p로 실패 확률을 1 - p로 정의할 때 식을 아래와 같다.

Odds = p / (1 - p), p = Odds / (1 + Odds)

 

로짓 변환(Logit)

0에서 Odds에 자연로그를 취해 분석과 해석으로 다루기 쉬운 형태로 바꾼 그래프다.

Logit(p) = log(p / 1 - p)

로짓 변환을 더 사용하기 쉽게 역함수를 취해 변환해주었다.

이 함수를 시그모이드(sigmoid) 함수라고 부른다.

 

표현하는 방법(그래프 서식 형태)가 다를 뿐 전부 같은 함수식을 갖는다.

가장 왼쪽부터 로짓 변환 역함수이며, 시그모이드 함수이고, 로지스틱 회귀 함수다.

각 데이터에 시그모이드 함수에 넣어 로지스틱 계수를 구한다.

데이터를 잘 구분하기 위해(결정 경계를 잘 구하기 위해) 사용한다.

 

Feature Selection

Filter Methods

전처리 과정(모델 학습 이전 과정)에서 특성을 선택한다.

통계적 방법을 통해 각 특성들의 관련성을 계산하여 특성을 선택하는 방법이다.

피어슨 상관관계 분석, 카이제곱 검정 등을 방법으로 상관관계를 파악하여 선택한다.

 

Wrapper Methods

모델 학습 및 검증을 반복하여 특성을 선택한다.

특성들의 다양한 조합으로 모델의 학습을 진행하며, 성능 지표를 바탕으로 특성 조합을 구성한다.

최적의 특성 조합을 찾는 방법으로 Forward Selection, Backward Elimination 등이 있다.

 └ Forward Selection: 변수를 하나씩 추가하는 방법

 └ Backward Elimination: 모든 컬럼을 넣고 하나씩 제거하는 방법

 

Embedded Methods

모델 자체에 있는 특성 선택 기능을 이용하는 방법

학습 알고리즘 내에서 특성들의 영향력을 축소하는 방식으로 특성을 선택한다.

LASSO(L1 규제), Ridge(L2 규제) 등의 기법이 대표적이다.

 

Sampling Method

방법 설명
단순 무작위 추출
(Simple Random Sampling)
모집단의 각 구성원이 동일한 확률로 표본으로 선택되는 방법
모든 구성원이 같은 확률로 선택되지만 모집단의 특정 특성이 고르게 반영되지 않을 수 있음
모집단이 균질할 때 주로 사용
층화 추출법
(Stratified Sampling)
모집단을 여러 하위 집단(층)으로 나눈 다음 각 층에서 표본을 무작위로 추출
모집단이 이질적일 경우 특성을 더 잘 반영하기 위해 사용함
오버 샘플링
(Over Sampling)
불균형한 데이터세트에서 소수 클래스의 데이터를 증가시켜 클래스 간의 불균형을 조정하기 위해 사용되는 기법
랜덤 오버 샘플링
(Random Oversampling)
소수 클래스의 기존 데이터를 무작위로 복제하여 샘플 수를 늘리는 방법
장점: 소수 클래스의 샘플 수를 손쉽게 증가시킬 수 있음
단점: 데이터의 다양성을 늘리지 않고 단순 복제하기 때문에 모델이 복제된 샘플에 과적합될 수 있음
SMOTE
(Synthetic Minority Over-sampling Technique)
소수 클래스 샘플들을 이용하여 새로운 샘플을 합성하여 생성하는 방법
기존 샘플과 그 이웃 샘플들 간의 선형 결합을 통해 새로운 샘플을 만듦
장점: 데이터 다양성을 증가시켜 과적합 감소 가능, 소수 클래스의 분포를 더 자연스럽게 확장 가능
단점: 노이즈 데이터가 포함될 수 있습니다.
ADASYN
(Adaptive Synthetic Sampling Approach for Imbalanced Learning)
소수 클래스 샘플의 난이도에 따라 가중치를 다르게 부여하여 새로운 샘플 생성
어려운 샘플(근접한 다수 클래스 샘플들이 많은 샘플)을 더 많이 생성하는 접근법
장점: 학습이 어려운 샘플을 더 많이 생성하여 모델의 학습 능력을 향상시킴
데이터의 균형을 맞추면서도 어려운 샘플에 대해 더 잘 대응함
단점: 과적합 위험이 있으며, 노이즈가 포함될 가능성이 높음
알고리즘이 복잡하여 실행 시간이 길어질 수 있음

불균형한 데이터 (Imbalanced data)

데이터세트의 각 클래스 간 데이터 수가 많이 차이나면, 학습된 모델의 성능에 좋지 않은 영향을 줌

분류 모델의 학습 데이터의 클래스 간 비율 차이가 큰 경우, 비율이 높은 쪽으로 분류 결과를 출력하는 경향 있음

 

K-Fold Cross Validation

Training Dataset : 모델을 학습시키기 위해 사용되는 데이터

Validation Dataset : 학습 과정 중에 모델의 하이퍼파라미터 등을 미세조정하기 위한 검증에 사용하는 데이터

Test Dataset : 학습이 완료된 모델을 평가할 때 사용되는 데이터

 

교차 검증(Cross Validation)은 학습 데이터 세트를 여러 부분으로 나눈다.

그리고 각 부분을 학습과 검증 용도로 번갈아 사용하여 모델을 학습 및 평가하는 방법을 의미한다.

 

장점

모든 학습 데이터를 훈련에 활용할 수 있다(학습 데이터의 편향 최소화, 더 많은 데이터를 모델 학습에 사용)

모든 학습 데이터를 검증에 활용할 수 있다(검증의 정확도 향상, 검증 데이터의 편향 최소화).

데이터의 양이 부족한 경우 과대적합 및 과소적합을 방지할 수 있다.

 

단점

반복 실행으로 인한 연산량이 많아, 모델 학습 및 검증에 많은 시간이 걸린다.

 

전체 데이터세트를 K개의 fold로 나누어 각 fold마다 평가하는 방법

 

Regression - Automobile - Decision Tree

회귀용 실습 링크에서 데이터 다운받기

어제의 실습을 그대로 이용했다.

 

DT

 

BDT

 

두 모델 비교하기

위에가 DT 아래가 BDT

 

3개 이상의 모델 결과를 묶어서 결과를 같이 볼 수 있다.

Evaluate Model의 결과가 데이터프레임이기에 Add rows로 묶어서 볼 수 있다.

 

파이썬 코드를 추가해서 뭐가 뭔지 구분하기

 

import pandas as dp

def azureml_main(dataframe1=None, dataframe2=None):

    new_cols = pd.DataFrame(
        columns=["Algorithm"],
        data=[
            ["Boosted DT Reg"],
            ["Decision Forest Reg"],
            ["Linear Reg"],
            ["NN Reg"]
        ]
    )
    result = pd.concat([new_cols, dataframe1], axis=1)
    return result,

결과 깔끔하게 보여주는 코드

 

결과 비교 가능

 

Classification - Adult Sensus Income - Feature Selection

개인 수입 예측 분류 실습 데이터, 해당 데이터셋 Kaggle 링크를 따라가서 가져온다.

혹은 UCI 원본 데이터셋 링크에서 가져와도 괜찮다.

해당 실습에서는 기존에 사용한 파이프라인을 재활용한다.

 

Feature Selection 디자인 블록

 

유추 파이프라인을 고려하여 Feature Selection을 Split data 이후에 사용한다.

 

만약 새로운 데이터가 들어온다면 파랑쪽 파이프라인을 만들어두는 것이 좋다.

새로운 target label 없는 Input에 대해 처리하는 inference pipieline에 해당한다.

빨간색은 학습할 때 사용하는 general pipeline에 해당한다.

 

결과 확인

 

Regression - Statlog

해당 데이터셋 링크를 참고하자.

 

UCI에서 받은 데이터라 No Header를 주의하면 데이터를 올리자.

 

비용이 민감한(cost-sensitive) 상황에서 데이터 간의 불균형을 해소하기 위한 데이터 전처리가 필요하다.

비용 민감 학습 (Cost-Sensitive Learning)

오예측 비용(Cost)이 다를 때 사용한다. 복제 같은 방법으로 비용에 민감한 데이터의 비중을 높여서, 더 신중하게 예측하게 조정함

샘플링 기법 (Sampling Techniques)

불균형 문제를 해결하기 위한 방법으로, 소수의 클래스의 데이터를 오버샘플링하여 소수 클래스에 대한 예측 성능을 향상시킴

비용 민감 로지스틱 회귀 (Cost-Sensitive Logistic Regression)

로지스틱 회귀 모델을 이용하여 클래스 별 다른 가중치를 부여하는 방식

임계값 이동 (Threshold Moving)

예측의 임계값을 조정하여 고위험 클래스를 더 쉽게 예측할 수 있도록 함

 

import pandas as pd

def azureml_main(dataframe1=None, dataframe2=None):
    df_label_1 = dataframe1[dataframe1.iloc[:, 7] == 1]
    df_label_2 = dataframe1[dataframe1.iloc[:, 7] == 2]
    result = df_label_1.append([df_label_2] * 5, ignore_index=True)
    return result,

고위험(df_label_2)에 해당하는 데이터를 5배 복제하여 추가한다.

이렇게 위험도 비용을 고려한 모델 학습을 진행한다.

 

위의 배치를 참고하여 진행하면 된다.

 

이후 헷갈리지 않도록 SVM + 비용민감, SVM, BDT(Boosted Decision Tree Regression) + 비용민감, BDT를 잘 잇자.

 

위험인자를 찾아내는 게 중요하기에 재현율(recall)이 중요하다.

위 사진 결과는 SVM에 대한 결과다.

 

위 사진 결과는 BDT에 대한 결과다.

 

한 번에 통합하여 데이터를 보고자 Add rows와 Python script를 추가하였다.

 

import pandas as pd

def azureml_main(dataframe1=None, dataframe2=None):
    new_cols = pd.DataFrame(
        columns=["Algorithm", "Training"],
        data=[
            ["SVM", "Weighted"],
            ["SVM", "Unweighted"],
            ["BDT", "Weighted"],
            ["BDT", "Unweighted"],
        ]
    )
    result = pd.concat([new_cols, dataframe1], axis=1)
    return result,

파이썬 코드

 

최종 비교 결과

 

Classficiation - Loan Prediction Problem Dataset

해당 데이터셋 링크를 참고

 

전체적인 파이프라인 설계도는 위와 같다.

사용한 모델은 Two-Class-Logistic-Regression이고 Seed는 42를 사용했다.

빈 값들은 0이나 unknown으로 채우고, 데이터셋은 8:2로 분리했다.

 

그냥 split_data한 것과 층화 추출하여 split_data한 것을 비교하기 위해 블록을 추가했다.

 

비교한 결과는 위와 같다.

 

Classficiation - CRM

해당 데이터셋 링크를 참고

 

Azure ML Studio에서는 기본으로 제공

 

다음과 같은 과정으로 병합한다.

 

SMOTE로 데이터 증강

다변량 데이터라 Number of nerest neighbors(k)로 증강하기보다는 percentage로 증강하는 게 효율적이다.

 

Two Class BDT로 SMOTE 유무에 따른 점수 차이

 

Two Class Linear Regression으로 SMOTE 유무에 따른 점수 차이

점수가 너무 안 좋게 나와 0이나 NaN 값이 70% 이상인 행과 열을 전부 지우고 다시 테스트한다.

 

import pandas as pd

def azureml_main(dataframe1=None, dataframe2=None):
    rate = 0.7
    nan_ratio_per_row = dataframe1.isna().mean(axis=1)
    df_cleaned = dataframe1[nan_ratio_per_row < rate]
    return df_cleaned,

70% 이상 NaN 값을 가진 레코드 삭제

 

import pandas as pd

def azureml_main(dataframe1=None, dataframe2=None):
    rate = 0.7
    zero_ratio_cols = (dataframe1 == 0).mean()
    df_cleaned = dataframe1.drop(columns = zero_ratio_cols[zero_ratio_cols >= rate].index)
    return df_cleaned,

70% 이상 NaN 값을 가진 columns 삭제

이 두 Python Script는 Add Columns과 Clean Missing Data 사이에 넣으면 된다.

 

 

Classficiation - Adult Census Income

기존의 Train - Score - Evaluate 대신 Cross Validate를 사용하면 된다.

 

위와 같이 fold별로 결과가 나온다.

 

점수 그래프를 보고 싶다면 Evaluate Model에 이어서 볼 수 있다.

 

개인 실습 - Mushroom

해당 데이터셋 링크 참고

 

뭔 짓을 해도 잘 나오니 참고하자.

이말인즉 결과와 아주 강한 연결이 있는 column이 있다는 말과 같다.

이런 경우에는 오히려 feature selection을 해서 상위로 나오는 값을 제거하고 보기도 한다.

 

+ Recent posts