본문 바로가기
python/MLDL

캐글 Regression with an Abalone Dataset 도전 (2)(클러스터링 실험)

by 포잉띠 2024. 4. 25.

object type 컬럼만 인코딩 진행하고 모델을 돌려서 제출했더니 당연하게도 점수가 매우 낮게 나왔다.

 

전처리를 진행하는데 heigh, 키가 0인 레코드들이 있었다.

날려야하나 채워야하나 고민하다가 최근 프로그래머스 데이터분석 데브코스 과정에서 배운 클러스터링을 한번 써봐야겠다는 생각이 들어서 클러스터링을 시도해 보았다.

 

우선은 K means 클러스터링을 진행하기 전에 적절한 K값을 찾기 위해 inertia값과 실루엣 계수를 구해보았다.

inertia 가 완만하게 줄어들고 실루엣 계수도 상승하는, k=7을 주고 클러스터링을 진행했다.

빨간 클러스터가 보이지 않는데 이유는 잘 모르겠다...

다만 height가 0인건 일단 날리는게 맞아보이고, 0.4 이상도 이상치로 봐야하나 고민했었는데 1에 근접한 레코드들만 이상치로 판단하고 진행해야겠다.

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

silhouette_scores = []
inertia = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, random_state=42, n_init="10")
    kmeans.fit(features)
    inertia.append(kmeans.inertia_)


for i in range(2, 11):  
    kmeans = KMeans(n_clusters=i, random_state=42, n_init="10")
    kmeans.fit(features)
    if len(set(kmeans.labels_)) > 1:  
        silhouette_scores.append(silhouette_score(features, kmeans.labels_))
    else:
        silhouette_scores.append(-1)

 

코드는 이렇게 사용했다.

두번째 for문은 검색해보고 사용했는데

for i in range(2, 11) 에서 2를 주는 이유는 실루엣 계수가 클러스터가 두개 이상일 때 의미가 있기때문에 2개 이상일때부터 작동하게 하기 위해 2를 주었고

첫번째 for문과 다르게 조건문이 들어가 있는데 이건 2개 이상일때부터 작동하게 하기 위해, 클러스터가 1개일때 실루엣 스코어를 계산하지 않기 위함인데, 애초에 2부터 시작하기에 항상 참이라 필요없는 부분이긴 하다.

다만 이런 부분은 알아두면 좋을 것 같다는 생각이 들어 기억하기 위해 작성했다.

 

 

클러스터링으로 이상치를 처리했더니 0에 아주 조금이나마 더 가까워졌다!!!