2 분 소요

※ cluster

■ K-Means Clustering


□ 라이브러리 호출

> from sklearn.cluster import KMeans


□ AGNES

  • parameter
    • n_clusters: 군집 개수
    • max_iter: 최대 이터레이션 횟수
  • attribute
    • .fit(): 데이터에 대한 군집화 모델 학습
    • .fit_predict(): 데이터에 대한 군집화 모델 학습 및 라벨 반환
    • .labels_: fitting한 데이터에 있는 샘플들이 속한 군집 정보 (ndarray)
    • .cluster_centers_: fitting한 데이터에 있는 샘플들이 속한 군집 중심점 (ndarray)


# 기본 구조
# 인스턴스화
> KMeans_model = KMeans(n_clusters, max_iter, ...)

# 모델 학습
> KMeans_model.fit(df)


# Data Frame 형태로 라벨 출력
> pd.DataFrame(KMeans_model.cluster_centers_, columns = df.columns, index = range(...))



■ Agglomerative Clustering (AGNES, 병합 군집)


□ 라이브러리 호출

> from sklearn.cluster import AgglomerativeClustering as AC


□ AGNES

  • parameter
    • n_clusters: 군집 개수
    • metric: 거리 척도 {‘Euclidean’, ‘‘manhattan’, ‘cosine’, ‘precomputed’}
      • linkage가 ward로 입력되면 ‘Euclidean’만 사용 가능
      • ‘precomputed’는 거리 혹은 유사도 행렬을 입력으로 하는 경우에 설정하는 값
    • linkage: 군집 간 거리 {‘ward’, ‘complete’, ‘average’, ‘single’}
      • ‘complete’: 최장 연결법
      • ‘average’: 평균 연결법
      • ‘single’: 최단 연결법
  • attribute
    • .fit(): 데이터에 대한 군집화 모델 학습
    • .fit_predict(): 데이터에 대한 군집화 모델 학습 및 라벨 반환
    • .labels_: fitting한 데이터에 있는 샘플들이 속한 군집 정보 (ndarray)


# 기본 구조
# 인스턴스화
> AC_model = AC(n_clusters, metric, linkage, ...)

# 모델 학습
> AC_model.fit(df)

# 군집 정보 확인
> clusters.labels_
# e.g.
# data frame의 전처리가 필요하다.
> df1.set_index('ID', inplace = True)
> df1 = pd.get_dummies(df1, drop_frist = True)

# data frame의 전처리가 필요하다.
> df2 = pd.crosstab(index = df2['ID'], columns = df2['...'])


# 군집화
> from sklearn.cluster import AgglomerativeClustering as AC
> AC_model = AC(n_clusters = 3, metric = 'euclidean', linkage ='ward') # 인스턴스화
> AC_model(df1) # 모델 학습

> df1['군집정보'] = clusters.label_ # 라벨링



■ DBSCAN (밀도 기반 군집화)를 사용하여 outlier 판별하기

  • 군집에 속하지 않은 샘플을 이상치라고 간주함
  • 파라미터 튜닝이 쉽지 않음


□ 라이브러리 호출

> from sklearn.cluster import DBSCAN


□ DBSCAN

  • parameter
    • eps: 이웃이라 판단하는 반경
    • min_samples: 중심점이라 판단하기 위해, eps내에 들어와야 하는 최소 샘플 수
    • metric: 사용할 거리 척도
  • attribute
    • .labels_: 각 샘플이 속한 군집 정보 (-1: 이상치)


# 기본 구조
# 인스턴스화
> DBSCAN_model = DBSCAN(eps = 0.5, min_samples = 5, metric = 'euclidean', ...)

# 모델 학습
> DBSCAN_model.fit(X_train)
# e.g. DBSCAN으로 이상치 판별하기

# 샘플간 거리 측정하기
> from scipy.spatial.distance import cdist
> DM = cdist(X_train, X_train) # 거리행렬 생성

# 샘플간 거리의 작은 값 상위 10%
> np.quantile(DM, 0.1) # 0.67


> from sklearn.cluster import DBSCAN
> DBSCAN_model = DBSCAN(eps = 0.67, min_samples = 3) # 인스턴스화
> DBSCAN_model.fit(Train_X) # 모델 학습

> DBSCAN_model.labels_
> DBSCAN_model.labels_ == -1 # -1이 되는 값이 이상치

> X_train = X_train[DBSCAN_model.labels_ != -1] # 이상치를 제거하고 새롭게 학습용 데이터 정의

댓글남기기