본문 바로가기

KHUDA

KHUDA Data business 04

chatper 13.4 선형 판별분석과 이차 판별분석(분류모델)

 

판별분석
로지스틱 회귀분석처럼 질적 척도로 이루어진 종속변수를 분류할 떄 쓰이는 분석 기법이다. 
기계 학습보다는 통계기반의 데이터 분류 모델에 더 가깝다. 회귀 분석처럼 최소 제곱법을 사용하는 추정방법을 통해 독립변수의 최적 가중치를 구한다.

종속 변수의 범주가 두 개일 경우 : 두 집단 판별분석

종속 변수의 범주가 세 개 이상 : 다중 판별분석

 

결정경계선 산출 방식에 따라 선형 판별 분석, 이차 판별분석 으로 나뉜다. 

 

선형 판별분석
전체 범주의 분류 오차를 최소화하는 선형 판별 함수를 도출한 다음 모든 관측치의 분류점수를 도출한다. 
집단 내 분산에 비해 집단 간 분산의 차이를 최대화하는 독립변수의 함수를 찾는 것이다.  

이렇게 최적의 분류손인 결정경계선을 찾아내는 것이 판별분석의 핵심 로직이다. 두 집단의 오분류 크기를 최소화하기 위해 분류선의 각도를 정해주는 함수 z를 만드는 것이다. 

 

두개의 독립견수로 이차원 공간에서의 예시

판별분석도 독립변수들 간의 조합을 통해 최적의 분류식을 만드는 방식이기 때문에, 모든 독립변수를 다 넣는 것보다는 분류에 유의미한 변수를 선택하여 모델을 만드는 것이 좋다. 

 

이차 판별분석
선형판별분석이 공분산 구조가 많이 다른 범주의 데이터를 잘 분류하지 못한다는 단점을 보완한 방법 
범주 간의 공분산 구조가 다를 떄는 이차 판별분석을 사용한다. 
비선형 분류가 가능하다는 장점이 있지만, 독립변수가 많을 경우 추정해야 하는 모수가 많아져서 선형 판별분석에 비해 연산량이 큰 단점이 있다. 

기본적인 원리는 선형 판별 분석과 유사하지만, 이름에서 알 수 있듯이 변수에 제곱을 취한 추가적인 변수들을 사용해 결정경계선을 곡선의 형태로 만든다. 

실습

# 성별 분포 시각화 (키X몸무게)

# 성별 구분 데이터셋 생성
df_man = df.loc[df['gender'] == 'M']
df_woman = df.loc[df['gender'] == 'F']

# 그래프 설정
f, ax = plt.subplots(figsize=(10, 10))
ax.set_aspect("equal")

# 가로길이, 세로길이 변수 축 설정
ax = sns.kdeplot(df_man.height_cm, df_man.weight_kg, cmap="Blues",
                 shade=False, shade_lowest=False, cbar=False)
ax = sns.kdeplot(df_woman.height_cm, df_woman.weight_kg, cmap="Reds",
                 shade=False, shade_lowest=False)

red = sns.color_palette("Reds")[-2]
blue = sns.color_palette("Blues")[-2]

# 독립변수 정규화

# 독립변수, 종속변수 분리
df_x = df.drop(['gender','age','class'],axis=1)
df_y = df[['gender']]

# 데이터 정규화 적용
MinMaxScaler = MinMaxScaler()
df_minmax = MinMaxScaler.fit_transform(df_x)

# 컬럼명 결합
df_x = pd.DataFrame(data=df_minmax, columns=df_x.columns)

df_x.head()

 

# 학습셋과 테스트셋 분리하여 생성(7:3)
x_train, x_test, y_train, y_test = train_test_split(
    df_x,df_y,test_size=0.3,random_state=10)

# 학습셋과 검증셋이 잘 나뉘었는지 확인
print('train data 개수: ', len(x_train))
print('test data 개수: ', len(x_test))
# 선형 판별분석 모델 적용

LDA_1=LinearDiscriminantAnalysis(store_covariance=True)

LDA_1.fit(x_train, y_train) # LDA 적합
y_train_pred=LDA_1.predict(x_train)
y_test_pred=LDA_1.predict(x_test)

print(accuracy_score(y_train, y_train_pred)) # 학습셋 accuracy
print(accuracy_score(y_test, y_test_pred)) # 테스트셋 accuracy

0.9784533333333333

0.9810851169736187

신체 정보는 성별 분류에 명확한 정보이기 때문에 예측력이 매우 높게 나온다. 

# 선형 판별분석 모델 상수와 계수 값 출력

print('Intercept: ', LDA_1.intercept_)
print('Coefficient: ', LDA_1.coef_)
# 선형 판별분석 차원축소 적용

# 주성분 한개로 설정
lda_com = LinearDiscriminantAnalysis(n_components=1)
lda_com.fit(x_train, y_train)
df_lda_com = lda_com.transform(x_train)
df_lda_component = pd.DataFrame(df_lda_com,columns=['lda_component'])

# 종속변수 데이터셋 인덱스 초기화 및 결합
y_train_index = y_train.reset_index()
df_lda_component['target'] = y_train_index['gender']

# 차원축소 요소 분별력 비교 시각화 설정
fig, axs = plt.subplots(figsize=(16,8) , ncols=2 , nrows=1)

# 키 요소의 분별력
sns.distplot(df.loc[df['gender'] == 'M', 'height_cm'],
             hist=True, kde=False, color="blue",
             label = 'man', ax=axs[0])
sns.distplot(df.loc[df['gender'] == 'F', 'height_cm'],
             hist=True, kde=False, color="orange",
             label = 'woman', ax=axs[0])

# 차원축소 주성분의 분별력
sns.distplot(df_lda_component.loc[df_lda_component['target'] == 'M', 'lda_component'],
             hist=True, kde=False, color="blue", label = 'man', ax=axs[1])
sns.distplot(df_lda_component.loc[df_lda_component['target'] == 'F', 'lda_component'],
             hist=True, kde=False, color="orange", label = 'woman', ax=axs[1])

 

선형 판별 분석을 통해 차원축서 9개의 독립변수를 단 하나의 차원으로 축소한다. 

# 이차 판별분석 모델 적용

qda=QuadraticDiscriminantAnalysis(store_covariance=True)

qda.fit(x_train, y_train) # QDA 적합
qda_y_train_pred=qda.predict(x_train)
qda_y_test_pred=qda.predict(x_test)


print(accuracy_score(y_train, qda_y_train_pred)) # 학습셋 accuracy
print(accuracy_score(y_test, qda_y_test_pred)) # 예측셋 accuracy

0.98048

0.9798407167745147

 

이번 실습에서는 선형 판별분석과 이차 판별분석의 분류 예측력이 유사하게 나왔다.

하지만 범주의 공분산이 많이 다른 데이터의 경우 이차 판별분석이 더 높은 성능을 보이는 경우가 많다.  

 

chapter 13.5 서포트벡터머신(분류모델) 

서포트벡터머신(SVM: Support Vector Machin)
판별분석과 같이 범주를 나눠줄 수 있는 최적의 구분선(결정경계선)을 찾아내어 관측치의 범주를 예측해주는 역사 깊은 모델이다. 단점은 이진 분류에만 사용 가능. 로지스틱 회귀나 판별분석에 비해 비선형 데이터에서 높은 정확도를 보이며 과적합 되는 경향이 적어 인기가 많은 분석 방법. 

1~3번 분류선은 두 집단을 오분류 없이 나눠준다. 3번의 결정경계선(Decision boundary)이 가장 넓은 빈 공간을 가지고 있다. SVM은 결정경계선의 양쪽의 빈 공간, 즉 마진(Margin)을 최대화하도록 만들어졌다.

 

거리(distance)를 통해 분류나 회귀 모델을 만들 때는 반드시 데이터 정규화나 표준화를 해줘야 한다.

최적의 결정경계선 찾기 위해서 독립변수가 k개 일 때 최소 K+1개의 서포트벡터가 필요하다. 변수가 3개로 늘어나면 결정경계선은 평면이 되고, 그 이상으로 차원이 증가하면 그림으로 표현할 수 없는 초평면이 결정경계선이 된다. SVM은 MMH(Maximum Marginal Hyperplane), 즉 최대 마진 초편면을 찾아 범주를 분리하는 분류 방법이라 할 수 있다.

 

 

대부분의 데이터는 이상치가 있기 마련이다. 두 범주를 정확하게 나눠주기 위해서는 1번과 같은 결정경계선을 만들어야 한다. 하지만 이상치를 허용하지 않는 경우 과적합 문제가 발생할 수 있다. 2번과 같이 두 범주를 정확하게 나누지는 않지만 마진을 최대화하여 과적합을 방지해주는 것이다. 이를 소프트마진(Soft margin)이라 하며 이상치를 허용하지 않는 것을 하드 마진(Hard margin)이라 한다.

이를 조정해주는 매개변수로 C와 Gamma가 사용된다. C값을 낮게 설정하면 이상치들이 있을 가능성을 높게 잡아서 2와 같은 결정경계선을 만들어내고, C값을 높게 설정하면 1번과 같은 결정경계선을 만들어낸다. Gamma는 하나의 관측치가 영향력을 행사하는 거리를 조정해주는 매개변수다.

소프트마진을 높게 설정하더라도 결정경계선을 만들기 힘들고 만든다하더라도 모델 성능이 매우 떨어질 것이다. 그런 경우에 사용하는 것이 커널 기법(Kernal trick)이다.

커널 기법은 기존의 데이터를 고차원 공간으로 확장하여 새로운 결정경계선을 만들어내는 방법이다. Polynomial 커널, Sigmoid 커널, 가우시안 RBF 커널 등 다양한 종류가 있는데 성능이 좋아 가장 널리 쓰이고 있는 가우시안 RBF(Radial Basis Function)커널을 알아볼 것이다.

기존의 저차원 공간상에서 나눠줄 수 없덨던 범주를 고차원으로 확장하여 분류할 수 있도록 유도해 주는 것이 커널 기법이다. 다시 X,Y축 그래프에서 표현해주면 동그랑 원형의 결정경계선이 된다.

Gamma값은 관측치가 영향력을 행사하는 거리를 조정해주는 것이다. 값이 클수록 영향력의 거리는 짧아지게 되고 값이 작을수록 영향력의 거리는 길어지게 된다. 이는 가우시안 분포의 표준편차를 조정해주는 것으로, Gamma값이 클수록 작은 표준편자를 갖게 된다.

C값은 이상치에 대한 민감도를 조정해 주는 것이기 때문에 결정경계선의 유연함을 조정해주는 느낌이라면, Gamma값은 개별 관측치의 결정경계선 범위를 크거나 작게 만들어주는 느낌이다. C값은 크거나 작아도 하나의 결정경계선이 생성되지만 Gamma값은 커질수록 각각의 관측치에 대한 결정 경계선 범위가 작아져서 결국 여러 개의 결정경계선이 생기게 된다.

따라서 SVM모델을 만들 때는 C값과 Gamma값을 잘 조정해 가면서 모델의 복잡도를 적정 수준으로 맞춰줘야 한다. 각 조건의 모델 정확도, 검증 데이터셋의 오분류율 증감을 확인해 과적합과 과소적합 사이의 최적 모델을 만들어야 한다.

 

 

Chapter 13.6 KNN(분류, 예측 모델)

K-근접이웃(K-Nearest Neighbors)
쉽고 직관적인 분류모델로 알려져있지만 의사결정나무처럼 연속형 종속변수의 회귀예측도 가능한 모델이다. 기계학습 중에서 가장 단순한 모델이라 해도 과언이 아니다. 대부분의 기계학습 방법과 다르게 별도 학습 과정이 없다. 미리 저장되어 있는 학습 데이터에다가 예측 데이터를 대조함으로써 직접 결과가 도출되므로 메모리 기반 학습(Memory-based learning)이라고도 불린다. 공간상에 이웃해있는 관측치의 범주나 값을 통해 결과를 출력하기 때문.

KNN은 데이터의 지역 구조(Local structure)에 민감한 특성을 가지고 있다. 범주의 분포가 편향되어 있을 경우에는 예측 데이터의 관측치들이 빈도 높은 범주로 강하게 쏠리는 단점이 있는 것이라 K를 잘 설정해주는 것이 중요하다.

 

최적의 K를 선택하는 것은 의사결정나무에서 최적의 나무 가지 분기 수를 찾아내는 방법과 같다. 교차 검증(cross validation)을 하여 오분류율이 가장 낮아지는 K수를 탐색하는 것이다.

 

Chapter 13.7 시계열 분석(예측 모델)

 

관측치의 통계량 변화를 시간의 흐름에 따라 순차적으로 데이터화하고 현황을 모니터링하거나 미래의 수치를 예측하는 분석 방법이다. 주가 전망, 수요 예측 등에 사용. 기본 개념만 훑을 것이다.

시계열 분석의 목적은 크게 탐색(Explanation)과 예측(Prediction)으로 나눌 수 있다.

이렇게 시계열 요소를 나누는 것을 ‘시계열 분해’라 한다. 시계열 분해를 통해 숨겨진 요소를 파악하고 분석을 진행해야 예측력을 높일 수 있다. 시계열 분해 방법으로는 SEATS(Seasonal Extraction in ARIMA Time Series)분해 방법, STL(Seasonal and Trend decomposition using Loess)방법 등이 있다.

 

회귀 기반 시계열 분석
비즈니스 분야에서 주로 사용되는 시계열 분석 기법은 회귀 기반 방법과 지수평활법 그리고 ARIMA 모델 방법이 있다. 회귀 기반 모델은 예측하고자 하는 시점 t의 값이 종속변수가 된다. 그리고 t시점에 해당하는 요소(해당 요일, 월 등)들이 독립변수가 된다. 물론 요일, 월 등의 변수는 실제로는 더미변수로 변환해야 모델을 학습시킬 수 있다.

그림처럼 비선형이라면 일반 선형 회귀식으로 표현하는 것이 어렵다. 추세가 지수적으로 증가하는 경우 독립변수에 제곱을 취하여 회귀선을 보정해줘야 한다.

또는 종속변수나 독립변수에 로그를 취해주어 비선형적 관계를 적합시킬 수 있다. 로그변환을 위해 모든 관측치의 값이 0보다 커야한다. 변수에 0이 포함되어 있다면 log(x+1)과 같은 변환을 해줘야한다. 종속변수를 로그변환 해주었을 때 다른 일반 선형 모델과 비교하거나 예측값을 해석할 때 역산하여 기준을 맞춰줘야 한다. 다만 과도한 변수 변형은 모델의 예측력을 저하시킬 수 있다.

회귀모형 기반의 시계열 분석의 장점 중 하나는 외부 요소를 변수로 추가해주는 것이 용이하다. 예를 들어 쇼핑몰에서 부정기적인 할인행사 여부 정보를 알 수 있는 독립변수를 추가해주면 할인행사에 따른 수요 증가분을 모델에 적용할 수 있다. 공휴일이나 명정 등도 독립변수로 추가 가능. 부정기적인 노이즈 요소를 최소화 할 수 있다.

 

자기상관함수인 ACF(Autocorrelation function)를 이용하면 시계열 데이터의 주기성을 수치적으로 확인할 수 있고, 어떠한 특정 시차가 어떠한 영향을 주는지 알 수 있다. ACF는 자기상관함수로써 Y수치와 각 t_0~T_-k 시점과의 상관관계를 0.05 유의수준 안에서 나타낸 것이다. 점선으로 되어있는 가로선을 벗어나면 해당 시차가 Y값과 상관성이 있다는 것을 의미한다. 이는 주관적인 기준으로 상황에 따라 살짝만 나온 지점은 무시하기도 한다. 선막대가 0보다 크면 양의 상관관계, 작으면 음의 상관관계가 있음을 나타낸다.

 


ARIMA모델

Auto regressivre integrated moving average의 약자. 이동평균을 누적한 자기회귀를 활용하여 시계열 분석을 하는 것이다. 자기회귀(AR)모델과 이동평균(MA)모델을 이해해야 한다.

시계열 데이터가 정상성(Stationarity)을 가지도록 변환해줘야 한다. 정상성이란 모든 시점에 대해서 일정한 평균을 갖도록 하는 것. 추세나 계절성이 없는 시계열 데이터로 만들어 주는 것. 시계열 데이터의 주기성은 정상성과 관련이 없다. 주기의 고점이나 저점을 알 수 없고 고정된 길이를 갖고 있지 않기 때문이다. 정상성을 나타내는 시계열은 평균과 분산이 안정되어 있는 상태이다.

차분
추세에 의해 평균이 일정치 않다면 차분(difference)을 해준다. 차분은 연달아 이어진 관측값들의 차이를 계산하여 그 변화 차이를 제거하는 것이다. 다시 말해 현재 상태의 값에서 바로 전 상태의 값을 빼 주는 것이다. 추세만 차분하는 것은 1차 차분 혹은 일반차분(Regular diffence) 시계열에 계절성도 존재하는 경우는 계절성의 시차인 n시점 전 값을 빼 주는 2차 차분 혹은 절차분(Seasonal difference)을 해준다.

 

Chapter 13.8 k-means클러스터링(군집 모델)

 

k-means 기법
비지도학습으로 정답없이 데이터특성과 구조를 발견해내는 방식. 
k는 분류할 군집의 수. 중심점과 군집 내 관측치 간의 거리를 비용함수로 하여 이 함수 값이 최소화되도록 중심점과 군집을 반복적으로 재정의 해준다. 관측치와 중심점 간의 거리를 사용하기 때문에 데이터 표준화나 정규화를 꼭 해줘야한다.

중심점 이동 

이런식으로 중심점이 설정될 수 있다. 이러한 현상을 지역 최솟값(Local minimum) 문제라 한다.

지역 최솟값 문제를 방지하기 위해 초기 중심점 선정 방법을 다양하게 하여 최적의 모델을 선정할 수 있다. 초기 중심점 선정은 랜덤방식, 중심점들을 가능한 서로 멀리 떨어져서 설정하는 방법, 중심점이 밀집되지 않도록 하는 k-means++등이 존재한다.

 

k를 정하는 법

  • 비지니스 도메인 지식을 통한 개수 선정
  • 엘보우 기법 
엘보우 기법 
군집 내 중심점과 관측치 간 거리 합(Inertia value)이 급감하는 구간의 k개수를 선정하는 방법. 군집 수가 k개보다 k+1일 때 거리합이 급감했다는 것은 유사한 속성의 관측치들끼리 잘 묶였다는 것을 뜻한다.
  • 실루엣 계수
실루엣 계수 
군집 안의 관측치들이 다른 군집과 비교해서 얼마나 비슷한지 나타내는 수치. 동일 군집 안에 있는 관측치들 간의 평균 거리와 가장 가까운 다른 군집과의 평균 거리를 구해 실루엣 계수를 구한다.
동일한 군집 내 관측치들 간 평균 거리가 집단 간 평균 거리보다 짧을수록 실루엣 계수는 높아진다.

 

밀도 기반 클러스터링 기법 

DBSCAN
별도의 k수 지정이 필요 없다. 관측치 밀도를 통해 자동으로 적절한 군집의 수를 찾는다. 밀도를 측정하려면 두 가지 기준이 필요하다. 첫 번째로 기준 관측치로부터 ‘이웃’한 관측치인지 구별할 수 있는 거리 기준(epsilon)이 필요하다. 거리 기준값이 크면 데이터 공간상 멀리 있는 관측치도 이웃한 관측치로 인식한다. 두 번째로 거리 기준 내 포함된 이웃 관측치 수(minPts)에 대한 기준이 필요하다.

군집화 모델은 분류된 각 군집의 특성을 파악하여 군집에 이름을 붙여서 그 특징을 정의하는 작업이 중요하다. k-means 클러스터링에 사용한 독립변수들이 다른 군집들에 비해서 어떠한 특성을 가지고 있는지 확인해 군집을 명확하게 정의해야 한다. 정의한 각 군집의 특성에 맞는 비즈니스 전략을 수립해야한다.

 

 

'KHUDA' 카테고리의 다른 글

KHUDA Data Business 05  (1) 2024.04.14
KHUDA Data buisness 03  (0) 2024.03.26
KHUDA Data business 02 practice  (1) 2024.03.26
KHUDA Data business 02 심화발제  (0) 2024.03.20
KHUDA Data buisenss 02  (0) 2024.03.20