[머신러닝]머신러닝의 이해와 라이브러리 활용 심화_비지도학습

Arin lee·2024년 11월 20일
0

contents

  • 머신러닝 종류 복습
  • 비지도 학습

summary

  1. 머신러닝 종류 복습
  • 지도학습과 비지도학습
    :지도학습은 문제(X)와 정답(Y)가 주어지고 문제(X)가 주어졌을때 정답(Y)을 맞추는 학습.

반면 비지도 학습이란 답(Y)을 알려주지 않고 데이터 간 유사성을 이용해서 답(Y)을 지정하는 방법.

머신러닝 개요

  • 비지도 학습 예시
    - 고객 특성에 따른 그룹화
    - ex) 헤비유저, 일반유저
    - 구매 내역별로 데이터 그룹화
    - ex) 생필품 구매
    ;비지도 학습은 데이터를 기반으로 레이블링을 하는 작업으로 정답이 없는 문제이기 때문에 지도 학습보다 조금 어렵고 주관적인 판단이 개입.
  1. 비지도 학습
  • 붓꽃 데이터를 이용한 군집화 예시
    ;K - 평균 군집화 혹은 알고리즘(K-means clustering)은 가장 일반적으로 사용되는 알고리즘. 쉬운 예시를 위해서 붓꽃 데이터(iris)데이터로 살펴보자.
  • sepal_length: 꽃 받침의 길이
  • sepal_width: 꽃 받침의 너비
  • petal_length: 꽃 잎의 길이
  • petal_width 꽃 잎의 너비
  • species(Y, 레이블): 붓꽃 종(setosa, virginica, versicolor)
    📌꽃에 대한 정보(X)로 종, Species(Y)를 맞추는 문제를 푼다면 지도 학습이라고 한다. 반면, Species가 없다면? 정보에 따라서 데이터를 분류해볼 수 있지 않을까?
  • Labeling이 안된 꽃 받침 길이-너비 산점도
    *그룹화 해보기
    Labeling이 된 꽃 받침 길이 - 너비 산점도
  • (스포) K means를 이용한 군집화
  • K-Means Clustering 이론
    ☑️ K-Means Clustering 수행 순서
    1) K개 군집 수 설정
    2) 임의의 중심을 선정
    3) 해당 중심점과 거리가 가까운 데이터를 그룹화
    4) 데이터의 그룹의 무게 중심으로 중심점을 이동
    5) 중심점을 이동했기 때문에 다시 거리가 가까운 데이터를 그룹화
    (3~5번 반복)
    ;이렇게 임의로 분석가가 선정한 K군집 수(위 그림에서는 3)를 기준으로 데이터 군집화 프로세스를 진행.
  • 장점
    • 일반적이고 적용하기 쉬움
  • 단점
    • 거리 기반으로 가까움을 측정하기 때문에 차원이 많을 수록 정확도가 떨어짐
    • 반복 횟수가 많을 수록 시간이 느려짐
    • 몇 개의 군집(K)을 선정할지 주관적임
    • 평균을 이용하기 때문에(중심점) 이상치에 취약함
  • Python 라이브러리
    • sklearn.cluster.KMeans
      • 함수 입력 값
        • n_cluster: 군집화 갯수
        • max_iter: 최대 반복 횟수
      • 메소드
        • labels_: 각 데이터 포인트가 속한 군집 중심점 레이블
        • cluster_centers: 각 군집 중심점의 좌표

*군집평가 지표
☑️ 실루엣 계수
:비지도 학습 특성 상 답이 없이 때문에 그 평가를 하긴 쉽지 않다. 다만, 군집화가 잘되어 있다는 것은 다른 군집간의 거리는 떨어져 있고 동일한 군집끼리는 가까이 있다는 것을 의미.

:이를 정량화 하기 위해 실루엣 분석(silhouette analysis)이란 간 군집 간의 거리가 얼마나 효율적으로 분리되어 있는지 측정.

  • 실루엣 계수
    • 수식:
      S(i)=b(i)a(i)max(a(i),b(i)) 단 i는데이터S(i) = \frac{b(i)-a(i)}{max(a(i),b(i))} \ 단\ i는 데이터
  • a(i)a(i) : 데이터 포인트 ii 과 같은 군집에 속한 다른 포인트들과의 평균 거리
  • b(i)b(i) : 데이터 포인트 ii 와 가장 가까운 다른 군집 간의 평균 거리
    - 해석: 1로 갈수록 잘 군집화 되어 있음. -1에 가까울수록 잘 못 군집화 되어 있음.
    📌특정한 데이터 i의 실루엣 계수는 얼마나 떨어져있는가(b(i)a(i)b(i) -a(i))가 클 수록 크며, 이를 단위 정규화를 위해 a(i),b(i)a(i), b(i) 값 중에 큰 값으로 나눈다.
  • 좋은 군집화의 조건
    • 실루엣 값이 높을수록(1에 가까움)
    • 개별 군집의 평균 값의 편차가 크지 않아야 함
  • Python 라이브러리
    • sklearn.metrics.sihouette_score: 전제 데이터의 실루엣 계수 평균 값 반환
      • 함수 입력 값
        • X: 데이터 세트
        • labels: 레이블
        • metrics: 측정 기준 기본은 euclidean

➕실습

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

iris_df = sns.load_dataset('iris')
iris_df.head(3)

iris_df.info()

sns.scatterplot(data = iris_df, x = 'sepal_length', y = 'sepal_width')

sns.scatterplot(data = iris_df, x = 'sepal_length', y = 'sepal_width', hue = 'species')

iris_df2 = iris_df[['sepal_length','sepal_width','petal_length','petal_width']]
iris_df2.head(3)

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3, init = 'k-means++', max_iter = 300, random_state= 42)
kmeans.fit(iris_df2)

kmeans.labels_

array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2,
2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2,
2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0])

iris_df2['target'] = iris_df['species']
iris_df2['cluster'] = kmeans.labels_
iris_df2

plt.figure(figsize = (12,6))
plt.subplot(1,2,1)
sns.scatterplot(data = iris_df2, x = 'sepal_length', y = 'sepal_width', hue = 'target')
plt.title('Original')

plt.subplot(1,2,2)
sns.scatterplot(data = iris_df2, x = 'sepal_length', y = 'sepal_width', hue = 'cluster', palette= 'viridis')
plt.title('Clustering')
plt.show()

  • (실습) 고객 세그멘테이션
    ☑️ 고객 세그멘테이션의 정의
    :비지도 학습이 가장 많이 사용되는 분야는 고객 관계 관리(Customer Relationship Management, CRM)분야 이다. 이중 고객 세그멘테이션(Customer Segmentation)은 다양한 기준으로 고객을 분류하는 기법이다. 주로 타겟 마케팅이라 불리는 고객 특서엥 맞게 세분화 하여 유형에 따라 맞춤형 마게팅이나 서비스를 제공하는 것을 목표로 둔다.
  • RFM의 개념
    - Recency(R) 가장 최근 구입 일에서 오늘까지의 시간
    - Frequency(F): 상품 구매 횟수
    - Monetary value(M): 총 구매 금액

    1) UCI 데이터 세트 다운로드 링크
    - retail_df.head()
  • retail_df.info()
  • 컬럼 정보
    - InvoiceNO: 6자리의 주문번호(취소된 주문은 c 로 시작)
    - StockCode: 5자리의 제품 코드
    - Description : 제품 이름(설명)
    - Quantity: 주문 수량
    - InvoiceDate: 주문 일자, 날짜 자료형
    - UnitPrice: 제품 단가
    - CustomerID: 5자리의 고객 번호
    - Country: 국가명
    2) EDA
retail_df.describe(include = 'all')

cond1 = retail_df['Quantity']< 0
retail_df[cond1]

3) 데이터전처리
- customerID 결측치 삭제
- InvoiceNo, UniPrice, Quantity 데이터확인 및 삭제
- 영국데이터만 취함

데이터 전처리전략
# 조건1: customerID 결측치인것은 삭제 
# 조건2: Invoice가 C로 시작하거나, quantity가 음수이거나, unitprice가 음수인것은 모두 삭제

cond_cust = (retail_df['CustomerID'].notnull())
retail_df[cond_cust].isnull().sum()

cond_invo = (retail_df['InvoiceNo'].astype(str).str[0] != 'C')
retail_df[cond_invo].head(3)

cond_minus = (retail_df['Quantity'] >0 ) & (retail_df['UnitPrice'] >0)
retail_df[cond_minus].head(3)
#영국인것만
cond_uk = (retail_df_2['Country'] =='United Kingdom')
retail_df_2 = retail_df_2[cond_uk]
retail_df_2

4) RFM 기반 데이터 가공
- 날짜 데이터 가공
- 최종목표

import datetime as dt
# 2011.12.10일 기준으로 각 날짜를 빼고 + 1
# 추후 CustomerID 기준으로 Priod의 최소의 Priod를 구하면 그것이 Recency
# 1번사람 100일전, 20일전, 5일전


retail_df_2['Period'] = (dt.datetime(2011,12,10) - retail_df_2['InvoiceDate']).apply(lambda x: x.days+1)
retail_df_2.head(3)

rfm_df = retail_df_2.groupby('CustomerID').agg({
   'Period' : 'min',
   'InvoiceNo' : 'count',
   'Amt' : 'sum'
})
rfm_df

rfm_df.columns = ['Recency','Frequency','Monetary']

sns.histplot(rfm_df['Recency'])

  • StandardScaler 적용
# 데이터정규화
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_features = sc.fit_transform(rfm_df[['Recency','Frequency','Monetary']])

5) 고객 세그멘테이션

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

kmeans = KMeans(n_clusters = 3, random_state = 42)
labels = kmeans.fit_predict(X_features)
rfm_df['label'] = labels

silhouette_score(X_features, labels)

0.592575402996014

from kmeans_visaul import visualize_silhouette
visualize_silhouette([2,3,4,5,6], X_features)

+추가 전처리

#log 스케일을 통한 추가전처리
import numpy as np

rfm_df['Recency_log'] = np.log1p(rfm_df['Recency'])
rfm_df['Frequency_log'] = np.log1p(rfm_df['Frequency'])
rfm_df['Monetary_log'] = np.log1p(rfm_df['Monetary'])

X_features2 = rfm_df[['Recency_log','Frequency_log','Monetary_log']]
sc2 = StandardScaler()
X_features2_sc = sc2.fit_transform(X_features2)

visualize_silhouette([2,3,4,5,6], X_features2_sc)

6) 평가

insight

0.592575402996014 실루엣 계수의 수치가 나쁘지 않지만 시각화를 확인해보는 것이 좋다.


군집이 5개이면, 가장 높은 실루엣 계수를 보이지만, 5개의 굽집이 제대로 보이지 않고 한쪽에 몰려있는 것을 확인할 수 있다.

그래서 추가적인 전처리를 해주고,

결과를 보면 다군집이 잘 보이게 된다. 하지만 실루엣 계수가 낮아진것을 확인할 수 있다.

  • 실루엣 계수는 -1에서 1 사이의 값을 가지며 1에 가까울 수록 근처 군집과 멀리 떨어져 있음을, 0에 가까울수록 근처 군집과 가까움을 의미. -(마이너스)이면 아예 다른 군집에 데이터가 할당됐음을 의미.

각 데이터에 대해 실루엣 계수를 구한 후 평균을 내면 전체 데이터의 실루엣 스코어를 구할 수 있다. 일반적으로 이 값이 크면(1에 가까우면) 군집화가 어느정도 잘 되었다고 판단하는데, 단순히 값이 크다고 해서 군집화가 잘 됐다고 판단할 수는 없다.

전체 실루엣 스코어와 더불어 개별 군집의 평균값의 편차가 크지 않은 경우에만 전체 군집화 성능이 좋다고 판단할 가능성이 생긴다. 개별 군집의 실루엣 스코어가 전체 실루엣 스코어와 크게 다르지 않아야 된다는 뜻이다. 전체 실루엣 스코어가 클지라도 개별 군집의 실루엣 스코어가 들쭉날쭉하다면 군집화가 잘되었다고 할 수 없다는 의미.

군집마다의 실루엣 스코어를 구해보고, 시각화도 해보는 등 여러 검정을 거쳐야 군집화의 성능을 정확하게 판단할 수 있다!

profile
Be DBA

0개의 댓글

관련 채용 정보