[2주차] AI with Python 3-4장

cannes7·2024년 3월 30일
post-thumbnail

목차

3장. 앙상블 학습을 이용한 예측 분석
앙상블 학습
+앙상블 학습을 이용한 학습 모델 구축하기
의사 결정 트리
의사 결정 트리 기반 분류기 구축하기
랜덤 포레스트와 극단 랜덤포레스트
__
랜덤 포레스트와 극단 랜덤 포레스트 분류기 만들기
예측 신뢰도 측정하기
클래스 별 데이터 불균형 처리
그리드 검색을 사용해 최적의 학습 매개변수 찾기
특징별 상대적 중요도 계산
극단 랜덤 포레스트 회귀분석을 이용한 교통량 예측
요약

4장. 비지도 학습을 이용한 패턴 추출
비지도 학습
K-평균 알고리즘을 이용한 데이터 군집화
평균 이동 알고리즘으로 군집 개수 예측하기
실루엣 지수로 군집화 품질 측정하기
가우시안 혼합 모델
가우시안 혼합 모델 기반 분류기 만들기
AP 모델로 주식 시장에서 소그룹 찾기
쇼핑 패턴에 따른 시장 세분화
__요약

본문

3장. 앙상블 학습을 이용한 예측 분석

앙상블 학습

  • 앙상블 학습:
    - 하나의 모델만 사용할 때보다 더 좋은 결과를 얻기 위해 여러 가지 모델을 조합하는 방법
    • 모델 간의 상호 보완적인 특징을 활용하여 보다 강력한 예측 성능을 달성할 수 있음

앙상블 학습을 이용한 학습 모델

  • 앙상블 학습의 목적:
    - 성능이 우수한 모델을 선택하는 것뿐만 아니라, 다양한 모델을 활용함으로써 질이 떨어지는 모델을 선택하는 위험을 줄이는 것
    • 이를 위해 각 모델에는 서로 다른 학습 매개변수를 적용해야 함

의사 결정 트리

  • 의사 결정 트리:
    - 데이터를 분할하여 구조화된 분류나 회귀 모델을 만드는 방법
    • 데이터와 타깃 레이블 간의 관계를 트리의 노드로 표현하고, 최종적으로는 트리의 루트 노드부터 최종 노드까지의 의사 결정을 통해 결과 값을 예측함
    • 엔트로피는 불확실성의 척도로 사용되며, 최적의 분할을 결정하는 데에 활용됨

의사 결정 트리 기반 분류기

  • 의사 분류기의 성능 측정:
    - 분류기의 성능은 정확률과 재현율 등의 지표를 사용하여 측정됨
    • 이 두 가지 성능 모두 높으면 좋지만, 둘 사이에는 trade-off 관계가 존재함

랜덤 포레스트와 극단 랜덤포레스트

  • 랜덤 포레스트: 다양한 의사 결정 트리 모델을 구축하고 조합하여 사용하는 방법으로, 오버피팅을 피할 수 있는 장점이 있음
  • 극단 랜덤 포레스트: 임의성을 다음 계층으로 전달하여 모델의 다양성을 높임

예측 신뢰도 측정하기

클래스 별 데이터 불균형 처리

그리드 검색을 사용해 최적의 학습 매개변수 찾기

  • 그리드 검색:
    - 매개변수 값의 범위를 지정하고 최적의 조합을 찾아주는 방법
    • 이를 통해 최적의 학습 매개변수를 자동으로 결정할 수 있음

특징별 상대적 중요도 계산

  • 특징별 상대적 중요도 계산 - 아다부스트 회귀 분석기
    - 각 특징이 의사 결정에 미치는 영향력은 모두 다르기 때문에 이를 반영하여 분석에 활용힘
    • 아다부스트 회귀 분석기는 어려운 데이터에 집중하여 성능을 향상시킴

4장. 비지도 학습을 이용한 패턴 추출

비지도 학습

  • 비지도 학습:
    - 레이블이 없는 학습 데이터를 사용하여 모델을 만드는 기법
    • 주어진 데이터 집합의 유사성에 따라 데이터를 그룹화하거나 패턴을 추출함

k-평균 알고리즘을 이용한 데이터 군집화

  • k-평균 알고리즘
    - 데이터를 비슷한 속성을 가진 그룹으로 묶는 군집화 기법 중 하나
    • 미리 정의된 군집의 수를 기반으로 데이터를 여러 그룹으로 나누며, 반복적으로 중심점의 위치를 조정하여 최적의 군집을 찾음

평균 이동 알고리즘으로 군집 개수 예측

  • 평균 이동 알고리즘
    - 모집단의 분포에 대한 가정을 하지 않는 비모수적 기법 중 하나
    • 중심점의 위치를 찾기 위해 데이터 포인트의 이동을 통해 군집을 형성하며, 이를 통해 군집의 개수를 예측함

실루엣 지수로 군집화 품질 측정

  • 실루엣 지수
    - 데이터의 군집화 품질을 측정하는 지표 중 하나
    • 이를 통해 특정 데이터가 자신이 속한 군집에 얼마나 가까운지를 측정하여 군집화의 일관성을 검사함

가우시안 혼합 모델

  • 가우시안 혼합 모델
    - 여러 개의 성분 분포를 혼합하여 데이터를 모델링하는 방법
    • 멀티 모달 밀도 함수를 만들어 여러 개의 성분 분포를 혼합하여 데이터의 패턴을 모델링함
    • 다양한 특성을 가진 데이터를 모델링하는 데 유용
      • e.g., 다양한 쇼핑 성향을 모델링하는 데에 활용될 수 있음

설명할 부분

#3장. 앙상블 학습을 이용한 예측 분석

그리드 검색을 사용해 최적의 학습 매개변수 찾기

  • 분류기 사용 시 최적의 매개변수 찾기 어려움 <- 그리드 검색 유용

  • 하이퍼파라미터 최적화 (Hyperparameter Optimization): 머신 러닝 모델의 성능은 하이퍼파라미터에 크게 의존함 / 코드에서는 ExtraTreesClassifier 모델의 두 가지 주요 하이퍼파라미터인 n_estimators와 max_depth를 조정하여 모델의 성능을 최적화하고자 함

  • 그리드 검색 (Grid Search): 가능한 모든 하이퍼파라미터 조합을 시도하여 최적의 조합을 찾는 탐색 기법 / 매개변수 값의 범위를 지정하면 자동으로 다양한 매개변수를 조합해 최적의 값을 찾아줌 / 코드에서는 GridSearchCV를 사용하여 parameter_grid에 정의된 다양한 하이퍼파라미터 조합을 탐색하고, 각 조합에 대한 성능을 평가함

  • 교차 검증 (Cross-Validation): 교차 검증은 모델의 일반화 성능을 더 정확하게 평가하기 위한 기법으로, 훈련 데이터를 여러 개의 서브셋으로 나누고 각각을 사용하여 모델을 평가하는 것 / 코드에서는 GridSearchCV의 cv 매개변수를 통해 5-fold 교차 검증을 사용함

  • 성능 평가 (Performance Evaluation): 모델의 성능을 평가하기 위해 여러 지표를 사용할 수 있음 / 코드에서는 precision과 recall을 가중치를 고려하여 평가하는 precision_weighted와 recall_weighted 지표를 사용함 / 이러한 성능 지표를 통해 모델이 각 클래스에 대해 얼마나 잘 분류되는지 평가할 수 있음

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
from sklearn import cross_validation, grid_search
from sklearn.ensemble import ExtraTreesClassifier
from sklearn import cross_validation
from sklearn.metrics import classification_report

from utilities import visualize_classifier

# Load input data
input_file = 'data_random_forests.txt'
data = np.loadtxt(input_file, delimiter=',')
X, y = data[:, :-1], data[:, -1]

# Separate input data into three classes based on labels
class_0 = np.array(X[y==0])
class_1 = np.array(X[y==1])
class_2 = np.array(X[y==2])

# Split the data into training and testing datasets 
X_train, X_test, y_train, y_test = cross_validation.train_test_split(
        X, y, test_size=0.25, random_state=5)

# Define the parameter grid 
parameter_grid = [ {'n_estimators': [100], 'max_depth': [2, 4, 7, 12, 16]},
                   {'max_depth': [4], 'n_estimators': [25, 50, 100, 250]}
                 ]

metrics = ['precision_weighted', 'recall_weighted']

for metric in metrics:
    print("\n##### Searching optimal parameters for", metric)

    classifier = grid_search.GridSearchCV(
            ExtraTreesClassifier(random_state=0), 
            parameter_grid, cv=5, scoring=metric)
    classifier.fit(X_train, y_train)

    print("\nGrid scores for the parameter grid:")
    for params, avg_score, _ in classifier.grid_scores_:
        print(params, '-->', round(avg_score, 3))

    print("\nBest parameters:", classifier.best_params_)

    y_pred = classifier.predict(X_test)
    print("\nPerformance report:\n")
    print(classification_report(y_test, y_pred))
  • ExtraTreesClassifier를 사용하여 분류를 수행하고, GridSearchCV를 사용하여 최적의 하이퍼파라미터를 찾음
  • 과정:
  1. 데이터 로드: 'data_random_forests.txt' 파일에서 데이터를 로드한다.
  2. 데이터 분할: 훈련 및 테스트 데이터셋으로 데이터를 분할한다.
  3. 하이퍼파라미터 그리드 정의: parameter_grid에는 ExtraTreesClassifier에 대한 다양한 하이퍼파라미터 조합이 포함되어 있다.
  4. 평가 지표 정의: metrics 리스트에는 평가 지표로 사용할 지표들이 포함되어 있다.
  5. 그리드 서치 및 성능 평가: for 루프를 통해 각 평가 지표에 대해 그리드 서치를 수행하고, 최적의 하이퍼파라미터를 찾는다. 그 후, 테스트 데이터셋에 대해 예측을 수행하고 분류 보고서를 출력한다.

특징별 상대적 중요도 계산

  • AdaBoost (Adaptive Boosting): 약한 학습기(weak learner)를 이용하여 강력한 앙상블 모델을 구축하는 알고리즘 / AdaBoostRegressor 클래스를 사용하여 회귀 분석을 수행함 / 이전 학습기가 잘못 분류한 샘플에 더 많은 가중치를 부여하여 다음 학습기가 더 잘 분류할 수 있도록 학습함
  • 결정 트리 회귀자 (DecisionTreeRegressor): 결정 트리는 트리 구조를 사용하여 데이터를 분할하는 분류 및 회귀 모델임 / 회귀 분석을 위한 결정 트리는 각 노드에서 최적의 분할을 찾아 훈련 데이터를 더 작은 영역으로 분할함
  • 모델 학습 및 평가: 코드에서는 훈련 데이터를 사용하여 AdaBoost 회귀 모델을 학습하고, 테스트 데이터를 사용하여 모델의 성능을 평가함 / 성능 평가 지표로는 평균 제곱 오차(mean_squared_error)와 설명된 분산 점수(explained_variance_score)를 사용하고 있음
  • 특성 중요도: AdaBoost는 각 특성의 상대적 중요도를 추정할 수 있음 / 특성 중요도는 각 특성이 예측에 얼마나 중요한 역할을 하는지를 나타냄 / 코드에서는 feature_importances_ 속성을 사용하여 각 특성의 중요도를 추출하고 시각화하고 있음
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn import datasets
from sklearn.metrics import mean_squared_error, explained_variance_score
from sklearn import cross_validation
from sklearn.utils import shuffle

# 주택 데이터 로드
housing_data = datasets.load_boston()

# 데이터 셔플
X, y = shuffle(housing_data.data, housing_data.target, random_state=7)

# 데이터를 훈련 및 테스트 데이터로 분할
X_train, X_test, y_train, y_test = cross_validation.train_test_split(
    X, y, test_size=0.2, random_state=7)

# 아다부스트 회귀 분류기 모델 생성
regressor = AdaBoostRegressor(DecisionTreeRegressor(max_depth=4),
                              n_estimators=400, random_state=7)
regressor.fit(X_train, y_train)

# 아다부스트 회귀 분류기 성능 평가
y_pred = regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
evs = explained_variance_score(y_test, y_pred)
print("\nADABOOST REGRESSOR")
print("Mean squared error =", round(mse, 2))
print("Explained variance score =", round(evs, 2))

# 특성 중요도 추출
feature_importances = regressor.feature_importances_
feature_names = housing_data.feature_names

# 중요도 값 정규화
feature_importances = 100.0 * (feature_importances / max(feature_importances))

# 값 정렬 및 뒤집기
index_sorted = np.flipud(np.argsort(feature_importances))

# X축 틱 정렬
pos = np.arange(index_sorted.shape[0]) + 0.5

# 막대 그래프 플롯
plt.figure()
plt.bar(pos, feature_importances[index_sorted], align='center')
plt.xticks(pos, feature_names[index_sorted])
plt.ylabel('Relative Importance')
plt.title('Feature importance using AdaBoost regressor')
plt.show()
  • AdaBoost 알고리즘을 사용하여 회귀 분석을 수행하고, 그 결과를 시각화하여 특성의 상대적 중요도를 확인함
  • 과정:
  1. 데이터 로드 및 전처리: 보스턴 주택 데이터셋을 로드하고, 데이터를 셔플하여 훈련 및 테스트 데이터로 분할한다.
  2. AdaBoost 회귀 모델 생성: AdaBoostRegressor 클래스를 사용하여 회귀 모델을 생성한다. 이 모델은 기본적으로 결정 트리 회귀자(DecisionTreeRegressor)를 기반으로 하며, 약한 학습기(weak learner)를 연속적으로 학습시켜 강력한 모델을 생성한다.
  3. 모델 학습 및 성능 평가: 훈련 데이터로 모델을 학습하고, 테스트 데이터를 사용하여 모델의 성능을 평가한다. 평균 제곱 오차(mean_squared_error)와 설명된 분산 점수(explained_variance_score)를 사용하여 회귀 모델의 성능을 평가하고 있다.
  4. 특성 중요도 추출 및 시각화: AdaBoost 알고리즘은 각 특성의 중요도를 추정할 수 있다. featureimportances 속성을 사용하여 각 특성의 상대적 중요도를 추출하고, 막대 그래프를 사용하여 중요도를 시각화하고 있다. 이를 통해 어떤 특성이 예측에 가장 중요한 역할을 하는지를 확인할 수 있다.

극단 랜덤 포레스트 회귀분석을 이용한 교통량 예측

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report, mean_absolute_error
from sklearn import cross_validation, preprocessing
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.metrics import classification_report

# Load input data
input_file = 'traffic_data.txt'
data = []
with open(input_file, 'r') as f:
    for line in f.readlines():
        items = line[:-1].split(',')
        data.append(items)

data = np.array(data)

# Convert string data to numerical data
label_encoder = [] 
X_encoded = np.empty(data.shape)
for i, item in enumerate(data[0]):
    if item.isdigit():
        X_encoded[:, i] = data[:, i]
    else:
        label_encoder.append(preprocessing.LabelEncoder())
        X_encoded[:, i] = label_encoder[-1].fit_transform(data[:, i])

X = X_encoded[:, :-1].astype(int)
y = X_encoded[:, -1].astype(int)

# Split data into training and testing datasets 
X_train, X_test, y_train, y_test = cross_validation.train_test_split(
        X, y, test_size=0.25, random_state=5)

# Extremely Random Forests regressor
params = {'n_estimators': 100, 'max_depth': 4, 'random_state': 0}
regressor = ExtraTreesRegressor(**params)
regressor.fit(X_train, y_train)

# Compute the regressor performance on test data
y_pred = regressor.predict(X_test)
print("Mean absolute error:", round(mean_absolute_error(y_test, y_pred), 2))

# Testing encoding on single data instance
test_datapoint = ['Saturday', '10:20', 'Atlanta', 'no']
test_datapoint_encoded = [-1] * len(test_datapoint)
count = 0
for i, item in enumerate(test_datapoint):
    if item.isdigit():
        test_datapoint_encoded[i] = int(test_datapoint[i])
    else:
        test_datapoint_encoded[i] = int(label_encoder[count].transform(test_datapoint[i]))
        count = count + 1 

test_datapoint_encoded = np.array(test_datapoint_encoded)

# Predict the output for the test datapoint
print("Predicted traffic:", int(regressor.predict([test_datapoint_encoded])[0]))
  • 과정:
  1. 데이터 불러오기 및 전처리: 주어진 트래픽 데이터를 불러와서 범주형 데이터를 숫자형 데이터로 변환한다. 범주형 데이터는 LabelEncoder를 사용하여 숫자로 변환된다.
  2. 훈련 및 테스트 데이터셋 분리: 변환된 데이터를 훈련 및 테스트 데이터셋으로 분리한다.
  3. ExtraTreesRegressor를 사용한 회귀 모델 학습: ExtraTreesRegressor를 사용하여 회귀 모델을 학습한다. 이 모델은 훈련된 데이터에 대한 예측을 수행한다.
  4. 성능 평가: 테스트 데이터셋을 사용하여 회귀 모델의 성능을 평가한다. 이 코드에서는 평균 절대 오차(mean absolute error)를 사용하여 모델의 성능을 평가한다.
  5. 단일 데이터 인스턴스에 대한 예측: 트래픽 데이터에 대한 단일 데이터 인스턴스의 트래픽을 예측한다. 입력 데이터는 문자열 형태로 주어지고, 이를 모델이 이해할 수 있는 형태로 변환한 후 예측을 수행한다.

#4장. 비지도 학습을 이용한 패턴 추출

비지도 학습

  • 비지도(비교사) 학습(Unsupervised Learning):
    • 머신러닝의 한 분야로, 입력 데이터에 대한 명시적인 출력 레이블이나 지도가 없는 상태에서 데이터의 구조나 패턴을 발견하거나 모델링하는 기술
    • 이러한 알고리즘들은 주어진 데이터 집합에 담긴 데이터의 유사도에 따라 소그룹으로 나누는 방식으로 학습 모델을 만듦
    • 데이터 간의 숨겨진 구조를 발견하거나 데이터를 클러스터링, 차원 축소, 이상치 탐지 등의 작업을 수행함
    • 시장 세분화, 주식 시장 분석, 자연어 처리, 컴퓨터 비전 등 분야에서 활용됨
    • 이 장의 가정: 주어진 데이터 집합은 레이블이 달려 있지 않고, 데이터의 분포에 영향을 미치는 잠재(latent) 변수를 통해 생성함

e.g.,

  • 군집화(Clustering): 비슷한 특성을 가진 데이터들을 같은 그룹으로 묶는 작업 / 주어진 데이터를 여러 개의 클러스터로 나누는 것이 목표이며, k-means, DBSCAN 등이 대표적인 군집화 알고리즘임
  • 차원 축소(Dimensionality Reduction): 데이터의 특성(feature) 수를 줄이면서 데이터의 복잡성을 감소시키는 작업 / 주성분 분석(PCA), t-SNE 등이 널리 사용되는 차원 축소 알고리즘임
  • 이상치 탐지(Outlier Detection): 데이터 집합 중에서 다른 데이터들과 크게 다른 패턴을 보이는 특이한 데이터를 찾는 작업 / 이상치는 데이터 집합의 질을 나타내는데 도움이 될 수 있음
  • 원시적인 데이터 표현(Latent Representation): 비지도 학습은 종종 데이터의 내재된(latent) 구조를 학습하여 데이터를 더 간결하고 의미 있는 방식으로 표현함 / 이는 신경망의 자동 인코더(autoencoder)와 같은 기법에서 자주 사용됨
  • 연관 규칙 학습(Association Rule Learning): 대량의 데이터 세트에서 특정 항목 간의 흥미로운 관계를 찾는 데 사용됨 / 이는 장바구니 분석과 같은 마케팅 분석에 유용함

K-평균 알고리즘을 이용한 데이터 군집화

  • 군집화(Clustering): 데이터를 분석해서 그 안에 형성된 군집을 찾을 때 사용함 / 군집 분류 기준은 유사도(similarity) 또는 비유사도(disimilarity; e.g., 유클리드 거리)이며, 이를 통해 군집의 응집도(tightness) 측정 가능함
  • K-Means 클러스터링:
    • 데이터 군집화에서 대표적인 비지도 학습 알고리즘으로, 주어진 데이터를 K개의 클러스터로 그룹화하는 알고리즘
    • 각 클러스터는 중심(centroid)이라는 하나의 포인트를 가지며, 데이터 포인트는 가장 가까운 중심에 할당됨
    • 이후 중심을 클러스터의 평균값으로 업데이트하고, 할당된 포인트가 바뀌지 않을 때까지 (모든 중심점이 최적의 위치에 자리잡을 때까지) 이 과정을 반복함
    • 참고) K-Means++: 기본 K-Means 알고리즘을 변형한 것으로, 중심점의 시작 위치를 정할 때 중심점들이 서로 최대한 멀리 떨어지도록 지정함 -> 중심점의 위치를 무작위로 결정하는 기본 K-Means보다 결과가 빠르게 수렴할 수 있음
    • first iteration이 끝났다: 전체 데이터 집합에 대해 한 번 작업을 수행한 상태
    • 각 반복으로 K개의 중심점을 구하면 데이터 집합에 대해 루프를 돌며 각각의 데이터를 가장 가까운 중심점에 할당하는 작업을 다시 반복함 -> 횟수가 늘어날수록 중심점의 위치는 평행 상태(equilibrium)의 위치를 향해 점차 이동함 -> 일정 수 이상 반복하면 중심점이 최종 위치에 도달하여 더 이상 위치가 변경되지 않음; 이러한 상태에 도달한 K개의 중심점이 예측(추론)에 사용할 최종 K Means임
  • KMeans 클래스: scikit-learn 라이브러리에서 제공하는 K-Means 클러스터링 모델을 생성하기 위한 클래스 / 이 클래스를 사용하여 클러스터의 수, 초기 중심 선택 방법 등을 설정할 수 있음
  • 시각화: 코드는 입력 데이터를 산점도로 시각화하고, K-Means 모델에 의해 생성된 결정 경계와 클러스터의 중심을 시각화함 / 이를 통해 데이터의 클러스터링 결과를 시각적으로 확인할 수 있음
  • 클러스터의 수 선택: 코드에서는 num_clusters 변수를 사용하여 클러스터의 수를 설정함 / 이 값은 사용자가 지정하며, 적절한 클러스터의 수를 선택하는 것이 중요함
  • 평가 지표: 코드에서는 클러스터링의 성능을 평가하기 위해 추가적인 평가 지표를 사용하지 않았지만 실제 응용에서는 클러스터링 결과를 평가하기 위해 실루엣 점수(silhouette score) 등의 지표를 사용할 수 있음
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import metrics

# Load input data
X = np.loadtxt('data_clustering.txt', delimiter=',')
num_clusters = 5

# Plot input data
plt.figure()
plt.scatter(X[:,0], X[:,1], marker='o', facecolors='none', 
        edgecolors='black', s=80)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
plt.title('Input data')
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())

# Create KMeans object 
kmeans = KMeans(init='k-means++', n_clusters=num_clusters, n_init=10)

# Train the KMeans clustering model
kmeans.fit(X)

# Step size of the mesh
step_size = 0.01

# Define the grid of points to plot the boundaries
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
x_vals, y_vals = np.meshgrid(np.arange(x_min, x_max, step_size), 
        np.arange(y_min, y_max, step_size))

# Predict output labels for all the points on the grid 
output = kmeans.predict(np.c_[x_vals.ravel(), y_vals.ravel()])

# Plot different regions and color them 
output = output.reshape(x_vals.shape)
plt.figure()
plt.clf()
plt.imshow(output, interpolation='nearest',
           extent=(x_vals.min(), x_vals.max(), 
               y_vals.min(), y_vals.max()),
           cmap=plt.cm.Paired, 
           aspect='auto', 
           origin='lower')

# Overlay input points
plt.scatter(X[:,0], X[:,1], marker='o', facecolors='none', 
        edgecolors='black', s=80)

# Plot the centers of clusters
cluster_centers = kmeans.cluster_centers_
plt.scatter(cluster_centers[:,0], cluster_centers[:,1], 
        marker='o', s=210, linewidths=4, color='black', 
        zorder=12, facecolors='black')

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
plt.title('Boundaries of clusters')
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()
  • K-Means 클러스터링 알고리즘을 사용하여 데이터를 클러스터링하고, 클러스터링 결과를 시각화함
  • 과정:
  1. 데이터 로드: 'data_clustering.txt' 파일에서 데이터를 로드한다. 이 데이터는 2차원 공간 상의 점들로 구성되어 있다.
  2. 입력 데이터 시각화: 입력 데이터를 산점도로 시각화한다.
  3. K-Means 모델 생성 및 학습: KMeans 클래스를 사용하여 K-Means 클러스터링 모델을 생성하고 학습한다. 코드에서는 초기 중심점을 무작위로 선택하는 대신, 'k-means++' 방법을 사용하여 초기 중심점을 선정한다.
  4. 결정 경계 시각화: 학습된 K-Means 모델을 사용하여 결정 경계를 시각화한다.
    합니다. 이 데이터는 2차원 공간 상의 점들로 구성되어 있습니다. 이를 위해 입력 공간을 격자로 나누고, 각 격자 점에 대해 해당 클러스터의 레이블을 예측한다. 이 예측 결과를 이미지로 표현하여 결정 경계를 시각화한다.
  5. 클러스터 중심 시각화: 각 클러스터의 중심점을 시각화한다. 이는 학습된 K-Means 모델의 클러스터 중심을 나타내며, 클러스터링의 결과를 살펴볼 수 있도록 해준다.

평균 이동 알고리즘으로 군집 개수 예측하기

  • Mean Shift 클러스터링:
    • 평균 이동 알고리즘은 비지도 학습용 알고리즘 중에서도 성능이 뛰어남
    • 모집단의 분포에 대한 가정을 하지 않는 비모수적(비매개변수 방식, non-parametric) 기법으로서 군집화에서 주로 활용함
      • 참고) 모수적(매개변수 방식, parametric) 기법은 내부 데이터가 표준 확률 분포(standard probability distribution)을 따른다고 가정함 / 상대적으로 학습에 요구되는 계산량이 적으나, 다양한 데이터 분포를 표현하기 어려움
    • 데이터 포인트 주변의 밀도를 측정하여 클러스터 중심을 찾는 알고리즘
    • 전체 특징 공간(feature space)을 확률 밀도 함수(probability density function)로 표현함
    • 확률 밀도 함수에 따라 샘플링된 학습용 데이터 집합 군집들은 데이터 분포에 대한 로컬 맥시마(local maxima, 극댓값, 국소적 최댓값)에 해당함 -> 군집 수가 K개라면 내부 데이터 분포에서 정점(peak)이 K개라는 의미 <- 평균 이동 알고리즘은 이러한 정점을 찾음
    • 목적: 중심점(센트로이드)의 위치를 찾는 것 / 학습 데이터에 있는 모든 개별 데이터마다 윈도우를 정의하고, 각 윈도우의 중심점을 계산한 후 중심점의 위치를 그 결과로 나온 새로운 중심점으로 갱신함 (각 점들은 밀도가 높은 영역을 향해 이동함) / 즉 초기에는 각 데이터 포인트가 자체 클러스터 중심으로 시작하며, 데이터 포인트를 주변의 밀도가 높은 방향으로 이동시키는 과정을 반복하여 수렴할 때까지 클러스터 중심을 찾음
  • 대역폭(bandwidth):
    • Mean Shift 알고리즘에서 사용하는 내부 커널의 밀도 추청 프로세스(density estimation process)에 대한 매개변수
    • 앞서 언급한 윈도우의 크기임
    • 대역폭에 따라 알고리즘의 수렴 속도와 최종 결과로 나올 군집의 수가 달라지기 때문에 가장 중요한 매개변수 중 하나임
    • 대역폭이 작으면 군집 수가 너무 많아지고, 크면 서로 구분해야 할 군집이 합쳐짐
    • quantile 매개변수는 대역폭의 추정 방식에 영향을 미침 / 이 값이 클수록 추정한 대역폭의 값이 커져서 군집의 수가 줄어들음
    • 클러스터링 할 때 주변 데이터 포인트를 고려하는 범위를 결정함
    • 코드에서는 estimate_bandwidth 함수를 사용하여 대역폭을 추정함
  • 클러스터 중심 추정: Mean Shift 알고리즘을 통해 클러스터링된 데이터에서 각 클러스터의 중심을 추정함 / 이 중심은 클러스터의 밀도가 가장 높은 지점으로 간주됨
    클러스터링 결과 시각화: 클러스터링된 데이터와 각 클러스터의 중심을 시각화하여 결과를 이해하고 검토함 / 이를 통해 클러스터링 알고리즘의 성능을 평가하고 데이터의 구조를 파악할 수 있음
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import MeanShift, estimate_bandwidth
from itertools import cycle

# Load data from input file
X = np.loadtxt('data_clustering.txt', delimiter=',')

# Estimate the bandwidth of X
bandwidth_X = estimate_bandwidth(X, quantile=0.1, n_samples=len(X))

# Cluster data with MeanShift
meanshift_model = MeanShift(bandwidth=bandwidth_X, bin_seeding=True)
meanshift_model.fit(X)

# Extract the centers of clusters
cluster_centers = meanshift_model.cluster_centers_
print('\nCenters of clusters:\n', cluster_centers)

# Estimate the number of clusters
labels = meanshift_model.labels_
num_clusters = len(np.unique(labels))
print("\nNumber of clusters in input data =", num_clusters)

# Plot the points and cluster centers
plt.figure()
markers = 'o*xvs'
for i, marker in zip(range(num_clusters), markers):
    # Plot points that belong to the current cluster
    plt.scatter(X[labels==i, 0], X[labels==i, 1], marker=marker, color='black')

    # Plot the cluster center
    cluster_center = cluster_centers[i]
    plt.plot(cluster_center[0], cluster_center[1], marker='o', 
            markerfacecolor='black', markeredgecolor='black', 
            markersize=15)

plt.title('Clusters')
plt.show()
  • Mean Shift 클러스터링 알고리즘을 사용하여 데이터를 클러스터링하고, 클러스터링 결과를 시각화하는 작업
  • 과정:
  1. 데이터 로드: 'data_clustering.txt' 파일에서 데이터를 로드한다. 이 데이터는 2차원 공간 상의 점들로 구성되어 있다.
  2. 대역폭(bandwidth) 추정: estimate_bandwidth 함수를 사용하여 데이터에 대한 대역폭을 추정한다. 대역폭은 Mean Shift 알고리즘에서 주요 파라미터로, 클러스터링 결과에 영향을 미치는 중요한 요소이다.
  3. Mean Shift 클러스터링: 추정된 대역폭을 사용하여 Mean Shift 클러스터링 모델을 생성하고, 이를 데이터에 적합시킨다. Mean Shift 알고리즘은 데이터 포인트 주변의 밀도를 측정하여 클러스터 중심을 찾는 방법이다.
  4. 클러스터 중심 및 클러스터 수 추정: 클러스터링이 완료되면 클러스터 중심을 추출하고, 클러스터의 수를 추정한다.
  5. 시각화: 클러스터링 결과를 시각화한다. 각 클러스터는 다른 마커와 색상으로 표시되며, 클러스터 중심은 큰 원으로 표시된다.
profile
EunSeo Ko

0개의 댓글