오늘은 머신러닝 비지도학습, 군집화, 차원축소 등
머신러닝에서 남은 파트를 수업하였다.
내일부터는 딥러닝에 들어갈 시간이다.
25.12.10 45일차는 세미나 특강이 있었는데
관련 내용에 업무적인 점도 있고 아직 진도를 나가지 않은 부분의 수업도 겹쳐있어
추후 자료를 다시 살펴보며 정리하고 업로드할 예정이다.
머신러닝_비지도학습_군집화_차원축소
개요
- 비지도 학습
- 데이터 상에 정답 x
- 종류
- 클러스터링(군집화)
- 주어진 데이터를 기반으로 몇개의 그룹으로 데이터를 나누는 과정(범주형,카테고리형으로 컬럼(피처) 생성)
- 파생변수 혹은 피처 1개 생성됨
- 데이터 준비 - 데이터 전처리 관점으로 위치가 배치됨
- 차원축소
- 특정 피처들을 통해 데이터가 진행되는 방향성, 추세등등 포착해서 피처 생성
- 내제된 의미,데이터가 의미하는 핵심방향을 표현
- PCA -> 주성분 분석
- 결과적으로 피처가 줄어듬
- 특정 피처들을 통해 데이터가 진행되는 방향성, 추세등등 포착해서 피처 생성
- 클러스터링(군집화)
클러스터링 - 군집화
K-Mean : 거리기반
- 기본 알고리즘
- 원리
- 군집 중심점
- 데이터 분포상의 특정한 위치(지점)을 선택(위치됨)
- 중심점 위치되면 그 거리를 기반으로 데이터 포인트들을 같은 그룹으로 선택
- 군집 중심점
'''
1번 그림
- A ~ F : 데이터 포인트(화면에 데이터를 표현)
- 2개의 군집중심점 : 임의로 2개 설정(차후 3개, 4개 등등 제시할 수 있음) -> 최적화/평가 포인트
2번 그림
- 데이터 포인트와 중심점간에 거리 계산 (두 점 사이)
- 가까운 군집중심점에 소속됨
- A,B,는 1그룹, C,E,F는 2그룹
3번 그림
- 그룹 안에서 중심위치를 계산 -> 군집중심점 이동시킴
4번 그림
- 군집 중심점의 위치가 바꼈으므로 -> 다시 소속에 대한 재배치(거리 계산 다시 함)
- C와 군집중심점 거리를 비교해보니, C는 1그룹에 가까웠음(다른 포인트는 모두 이상 없음)
- C 소속 변경
이후
- 3번 4번 공정을 계속 반복 => 언제까지(최적화포인트)
완료
- 군집중심점의 데이터포인트 간에 그룹별 센터에 위치하게 됨 공정을 계속 반복 => 언제까지(최적화포인트)
완료
- 군집중심점의 데이터포인트 간에 그룹별 센터에 위치하게 됨
'''
Image('/content/drive/MyDrive/GoodNotes/t아카데미/7. data_analysis_ml_dl_llm/clu/k-mean_0.png',width=800)

- 특징
- 가장 많이 활용됨(쉽고, 직관적)
- 단점
- 데이터가 많을수록 -> 시간 많이 소요됨
- 군집 정확도는 경우에 따라 정확도가 떨어질 수 있음
- 군집 평가가 필요함 (2개 그룹? 3개 그룹? 적절한지 평가)
- 최초 그룹의 개수를 선택하기가 힘듬

먼저 실습을 위한 밑 준비를 실행해준다. 데이터는 자주쓰던 IRIS를 사용한다.

알고리즘을 구성한 후 학습시킨다.

이 데이터에 현재 TARGET 데이터는 없다, 하지만 데이터가 모여있는 거리를 계산해서 데이터의 종류를 파악해서 군집화한것이다.

실제 타겟데이터와 비교해보기 위해서 TARGET 컬럼과 CLUSTER 컬럼을 추가해준다.

집계를 확인해보면 SETOSA가 가장 차이가 크니 잘 골라낸거같다, 하지만 나머지 두 종에서는 잘못 분류한 데이터들이 좀 보인다, 그리고 우리는 정답을 알지만 정답을 모른다고 가정하고 학습을 시켰다면 데이터가 잘 들어간건지 평가를 할 수 가 없다, 그래서 실루엣 계수를 활용한 평가가 필요하다.
군집평가
- 군집 수행이 적절했는가?
- 몇개로 군집하는게 맞는가? => 레이블링 개수
- 방법
- 실루엣 계수 활용
- 실루엣 평가
- 각 군집간의 거리가 얼마나 효율적으로 나눠졌는지 평가
- 다른 군집과 잘 떨어져 있다.
- 균형 ...
- 실루엣 평가
- 시각화 체크
- 실루엣 계수 활용


사이킷런에 실루엣 계수 획득 함수도 있다, 산출식은 저렇게 되어있 고 현재 KMEAN에 관련된 피처 데이터만 따로 담아준다.


현재 클러스터링 결과물의 평가값이다, 수치가 그닥 좋진 않다. 컬럼에 실루엣계수를 담아준다.

각 군집별 실루엣계수의 평균값을 내봤다, 1은 잘 골라낸 편이지만 나머지 두 군집은 썩 좋진 않다.
실루엣 계수 평가에 대한 시각화
- 군집 중심점을 다양하게 테스트 (2, 3, 4, 5)
- 데이터는 sklearn더미데이터 활용
from sklearn.datasets import make_blobs
# 평가함수
def show_sil_per_cluster(군집중심점후보군, 피처데이터):
# 군집중심점 후보군 개수만큼 반복 KMeans 훈련 => 실루엣 계수 = 시각화
# 시각화 한개차트에서 군집중심점후보군 개수만큼 표현 (가로가 길게)
ncols = len(군집중심점후보군)
_ , ax = plt.subplots(nrows=1, ncols=ncols, figsize=(5*ncols, 5 ) )
# 군집 후보개수만큼 군집화 -> 실루엣계수 -> 시각화
for idx, n_cluster in enumerate(군집중심점후보군):
# print(idx,n_cluster) # 차트 번호, 군집중심점 개수
# 1. 군집 후보 개수만큼 알고리즘 생성
model = KMeans( n_clusters=n_cluster, max_iter=500, random_state=0)
labels = model.fit_predict(피처데이터) # 훈련 -> 군집 레이블값 반환
# 2. 실루엣 계수 계산
score_sil_samples = silhouette_samples(피처데이터, labels) # 데이터 수 만큼 500개 계산됨
# n개 군집중심점을 가진 클러스터의 실루엣 평균값(대표값)
sil_avg = silhouette_score(피처데이터, labels)
# print(idx,n_cluster,sil_avg)
# 3. 시각화
# 3-1. 계수값 분포 표현 -> 각 그룹별로 표현
# 3-1-1. 각 그룹별 실루엣 계수 데이터 추출
y_std_value = 10
for i in range(n_cluster): # 2번 -> 3번 -> 4번 -> 5번 : 군집중심점 개수만큼 감
print(f'클러스터 개수{n_cluster} {i}번째 그룹')
# print(i == labels) # i = 현재 그룹 번호, labels = 데이터별 그룹 번호를 보은 배열
temp = score_sil_samples[ i == labels ]
temp.sort() # 정렬
# 해당 그룹의 실루엣 계수값을 시각화 -> 수평선 표현 데이터별로 가로선을 계속 표시
ax[idx].fill_betweenx( # y축, 좌표로 표기( )
np.arange( y_std_value,y_std_value + temp.shape[0] )
,0
# x축의 값
,temp # 실루엣 계수 데이터
)
# break
y_std_value = y_std_value + temp.shape[0] + 10
# 3-2. 실루엣 계수 평균값 표현
# 각 그룹의 실루엣 계수값들의 분포가 기준선을 일단 다 넘겨야 함(대체적으로)
ax[idx].axvline(x=sil_avg, color='red', linestyle='--')
# break
plt.show()
pass
# 테스트용 실험 내용
candidate_cluster_nums = [2, 3, 4, 5]
# 더미데이터 준비 => 향후 데이터 교체하면 됨
# 답을 미리 알고 데이터를 준비하겠음
X , y = make_blobs(n_samples=500,
n_features=2,
centers=4,
cluster_std=1.0, # 군집 표준편차 1.0, 군집의 개수 4개 지정
random_state=1)
# 평가 및 시각화
show_sil_per_cluster(candidate_cluster_nums, X)

실루엣 계수를 시각화한 코드와 결과값이다.
차트 순서대로 군집 클러스터의 개수를 2, 3, 4, 5개를 써봤고 각 클러스터별로 평균값 이상으로 표기되어야 효율이 좋은 개수이다.
현재는 2번, 혹은 4번이 가장 효율적일 것으로 보인다.

함수를 한번 정의해두면 기존에 넣은 더미데이터가 아니라 IRIS 데이터를 넣어도 바로 시각화할 수 있게 된다.
현재로서는 2개가 가장 효율 좋아보이는데 다 좀 별로다
Mean-Shift : 밀도기반
- 특정 대역폭(bandwidth, 원형 반경)내에 데이터포인트를 체크 -> 밀도 체크 군집 수행
- 확률 밀도 지표를 중심으로 밀도가 높은 쪽으로 군집 중심점 이동시키면서 군집화 진행



- 결론
- 장점
- 군집의 개수를 알아서 계산함
- 유연함, 이상치 데이터가 영향 미치지 않음
- 단점
- 대역폭 영향을 크게 미침
- 케이스에 따라서는 오랜시간 학습 필요할 수 있음
- 기본값 중심에서 변동시킬수 밖에 없음(한계)
- 활용분야
- 영상, 이미지분야 활용
- 장점
GMM : 확률기반
- Gaussian Mixture Model
- 데이터 분포 상 여러개의 가우시안(혹은 정규분포) 모델이 mix 섞여있다고 가정
- 그 여러개의 분포를 추출하면 -> 군집화됨
- 데이터 분포 상 여러개의 가우시안(혹은 정규분포) 모델이 mix 섞여있다고 가정






현재 iris에는 3개의 종이 있다, 그것을 알고있기 때문에 정규분포가3개 있다고 가정하고 gmm에 iris를 학습시키고 결과를 예측해봤다.
결론적으로는 gmm이 kmean보다 iris에서는 성능이 더 좋았다.
그래서 한 가지뿐이 아니라 여러가지 도구들을 사용해보는것이 더 좋다.
DBSCAN : 밀도기반 + 기하학적분포
- 데이터 분포가 기하학적일 경우 (비연속적, 단절) 적절함
- 정규분포 X, 비연속적
- 이상치 검출 시 많이 사용함









참고 - 이상치 탐지
- 결론
- 추츨해서 제거(통상적인 처리법)
- 검출
- Tukey Fences (NumbericOutlier)
- 4분위수를 이용 이상치 탐지
- Z-Score
- DBSCAN
- Isolation Forest
- LOF (Local Outlier Factor)
- Tukey Fences (NumbericOutlier)
- IQR = Q3 - Q1 (3사분위수 - 1사분위수)
- 이상치
- 이상치 > Q3 + (1.5 * IQR) : 초과
- 이상치 < Q1 - (1.5 * IQR) : 미만

예전에 좀 본거같이 생기지 않았나?
- 전제 조건
- 데이터는 모두 정규분포를 따른다는 전제
- 표준 점수
- 데이터 포인트 별로 표준점수를 계산(수식 존재함) 크거나 작으면 이상치 판정
- (데이터 포인트 - 데이터 평균) / (데이터 표준편차)
- -2.5이하거나, +2.5 초과면 이상치
- 클러스터링 기술(머신러닝의 비지도학습)로 탐지
- 다차원 특성 공간에 특화, 비모수적 밀도 기반 이상 탐지
- sklearn에서 제공
- 1, 다차원, 대규모 데이터셋에서 활용
- 비모수적 밀도 기반 이상 탐지
- sklearn에서 제공, KNN (최근접이웃) 알고리즘 계열
- 학습 -> 체크 -> 제거


데이터 훈련 후 이상치 예측한다, 직관적이라서 이해하기 쉽다

특정 범위 내, 혹은 가까우면 정상값으로 나온다, 말도안되는 값을 넣으니까 이상치가 나오는 모습
차원축소
- 개요
- 데이터 전처리
- 특징
- 차원이 많으면(피처수가 많으면) -> 데이터 포인트간 거리가 점점 커짐 -> 희소 구조가 된다 -> 예측 정확도는 떨어질 수 있음 : 해당 성향을 가짐
- 차원이 많으면 -> 학습 비용이 상승함(시간, 전기 등) => 저차원을 유지하는것이 유리하다.
- 알고리즘
- PCA
- 대표 알고리즘, 주성분 분석
- LDA, SVD, NMF
- 자연어 처리에서 주로 사용됨, 언어모델 구축시 잠재적 의미 추출할 때 사용(내부적)
- PCA
PCA
- 원리
- 다차원의 데이터를 새로운 차원으로 투영
- 다차원 => 새로운 차원으로 대체 : 축소
- 다차원의 데이터를 새로운 차원으로 투영
- 차원 축소
- 피처 제거
- feature selection
- 중요 피처 선택
- 제거
- 상관관계 분석 (0.9 이상이면 강한 상관관계) -> 하나만 선택
- VIF (다중공선성 10 이상이면 제거)
- 피처 추출
- feature extraction
- PCA, ...
- feature extraction
- feature selection
- 피처 제거

# 1. 데이터 포인트들 간 강한 추세 방향 기반으로 축 생성
# 변동성이 큰 방향(주성분)으로 축을 생성
# 수학적 표현 : 공분산 행렬 생성, 고유값 분해
# 2. 해당 축으로 데이터를 투영 -> 새로운 좌표값 생성(데이터)
# 수학적 표현 : 고유 벡터에 데이터를 투영
# 3. 해당 축을 중심으로 (투영된 데이터 포인트의 값으로) 표현 -> 새로운 값(value)
# 결론 : 아래 그림 기준으로 2개 좌표값에 의해 새로운 축에 투영된 1개의 데이터로 표현
# 2개 데이터의 핵심정보를 1개의 데이터로 표현한 것이다, 그래서 굳이 2차원일 필요 없어서 1차원으로 줄이는것이다.

PCA 실제 적용 모습, 뭔지는 알 수 없고 데이터를 2D로 바꿔준건 알겠다.

오늘의 수업은 여기까지
리뷰시간에 할게 많다, 스터디도 해야한다 빠이빠
'ASAC-SK플래닛 T아카데미 데이터 엔지니어' 카테고리의 다른 글
| 25.12.15 48일차 [딥러닝_NLP_워크플로우_챗봇구성, 활성화 함수] (0) | 2025.12.15 |
|---|---|
| 25.12.12 47일차 [딥러닝 | 개요, NLP 모델] (0) | 2025.12.15 |
| 25.12.11 SK플래닛 T아카데미 | AI활용 데이터 엔지니어 과정 2기 모집 (0) | 2025.12.11 |
| 25.12.09 44일차 [머신러닝_지도학습_회귀] (0) | 2025.12.10 |
| 25.12.08 43일차 [머신러닝 분류 최적화, 베이지안 최적화 | 머신러닝 주요 알고리즘, 결정트리,앙상블, 스태킹] (1) | 2025.12.08 |