Python의 계층적 클러스터링 [개념 및 분석]
게시 됨: 2020-08-14원시 데이터의 흐름이 증가하고 분석의 필요성이 증가함에 따라 시간이 지남에 따라 비지도 학습 개념 이 대중화되었습니다. 레이블이 지정된 대상 값이 없는 입력 데이터로 구성된 데이터 세트에서 통찰력을 얻는 데 사용됩니다. Python의 계층적 클러스터링에 대해 논의 하고 다양한 데이터 세트에 알고리즘을 적용하기 전에 클러스터링의 기본 아이디어를 다시 살펴보겠습니다.
클러스터링은 주로 원시 데이터의 분류를 다룹니다. 이는 서로 가장 유사한 서로 다른 데이터 포인트를 함께 그룹화하는 것으로 구성됩니다. 이러한 그룹을 클러스터라고 하며 정의된 유사성 또는 클러스터링 메트릭을 기반으로 형성됩니다.
목차
소개
계층적 클러스터링 은 트리 또는 잘 정의된 계층 형태의 데이터를 처리합니다. 이 프로세스에는 한 번에 두 개의 클러스터를 처리하는 작업이 포함됩니다. 알고리즘은 계산 결정을 위해 유사성 또는 거리 행렬에 의존합니다. 어떤 두 클러스터를 병합할지 또는 클러스터를 두 개로 나누는 방법을 의미합니다. 이 두 가지 옵션을 염두에 두고 두 가지 유형의 계층적 클러스터링 이 있습니다. 초보자이고 데이터 과학에 대해 더 자세히 알고 싶다면 최고의 대학에서 제공하는 데이터 과학 과정을 확인하십시오.
알고리즘의 중요한 측면 중 하나는 유사성 행렬(근접 행렬이라고도 함)이며 전체 알고리즘이 이를 기반으로 진행됩니다. 이 기사에서 추가로 논의되는 많은 근접 방법이 있습니다.
유형
계층적 클러스터링에는 두 가지 유형이 있습니다.
- 응집 클러스터링
- 분할 클러스터링
유형은 기본 기능에 따라 다릅니다. 계층 구조를 개발하는 방법입니다. Agglomerative는 상향식 계층 생성기이고 Divisive는 하향식 계층 생성기입니다.
Agglomerative는 모든 포인트를 개별 클러스터로 가져온 다음 각 반복에서 한 번에 두 개씩 병합합니다. 분할은 전체 데이터를 하나의 군집으로 가정하여 시작하고 모든 점이 개별 군집이 될 때까지 데이터를 나눕니다.
그 결과 계층적 트리로 인식될 수 있는 중첩된 클러스터 세트가 생성됩니다. 이를 보는 가장 좋은 방법은 집합 구조를 덴드로그램으로 변환하여 계층 구조를 보는 것입니다.
다음은 덴드로그램 대 클러스터 표현의 간단한 예를 제공합니다.
원천
여기에서 클러스터링은 어느 쪽이든 작동할 수 있지만 결과는 클러스터 모음이 됩니다. 데이터 포인트 1, 2, 3, 4, 5, 6은 한 번에 두 개로 클러스터링됩니다. 그리고 계층 구조 형성은 동일한 덴드로그램을 다루는 왼쪽 그림에서 볼 수 있습니다. 동일한 분석이 클러스터의 결정을 이해하는 데 도움이 될 것입니다.
클러스터 수 결정
이 알고리즘의 가장 유용한 기능 중 하나는 알고리즘이 종료되면 원하는 만큼 클러스터를 추출할 수 있다는 것입니다. K-means 알고리즘과 상당히 다릅니다. K-means에서는 no-of-clusters 하이퍼파라미터를 전달해야 합니다. 알고리즘이 계산을 완료하면 그만큼 많은 클러스터를 갖게 된다는 의미입니다. 그러나 나중에 클러스터가 더 필요하면 쉽게 조정할 수 없습니다. 유일한 옵션은 매개변수를 변경하고 모델을 다시 훈련하는 것입니다.
반면 계층적 클러스터링의 경우 나중에 클러스터 수를 설정할 수 있습니다. 마지막에 2개의 클러스터를 가져갈 수 있습니다. 만족하지 않으면 끝에서 두 번째 또는 상위 단계에서 형성된 5개의 클러스터를 사용할 수 있습니다. 그것은 당신 한테 달려 있어요. 따라서 일단 훈련되면 더 많거나 더 적은 클러스터를 얻기 위해 모델을 다시 훈련할 필요가 없습니다. 원하는 수준에서 덴드로그램을 간단히 절단 하여 수행할 수 있습니다.
개념이 정리 되었으므로 Python 의 계층적 클러스터링 작업에 대해 논의해 보겠습니다 .
실험을 위해 클러스터링 알고리즘에 sci-kit 학습 라이브러리를 사용할 것입니다. 또한 SciPy의 cluster.dendrogram 모듈을 사용하여 클러스터 수를 제한하기 위한 "절단" 프로세스를 시각화하고 이해합니다.
numpy를 np로 가져오기
X = np.array([[3,5],
[12,9],
[13,17],
[14,14],
[60,52],
[55,63],
[69,59],])
플롯에서 다음과 같이 보일 것입니다.
글쎄, 우리는 상단과 하단 모서리에 두 개의 결정적인 클러스터가 있음을 알 수 있습니다. 알고리즘이 알아낼 수 있는지 여부를 봅시다.
우리는 sklearn.clustering 모듈에서 AgglomerativeClustering 기능을 사용할 것입니다.
sklearn.cluster에서 가져오기 AgglomerativeClustering
클러스터 = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
cluster.fit_predict(X)
여기서 우리는 하이퍼파라미터가 아닌 클러스터를 지정합니다. 그러나 예측 클래스를 명확하게 하기 위해 전달합니다. fit_predict 함수를 사용하여 X에 대한 클래스를 훈련하고 예측합니다.
응집 클러스터링은 실행이 더 간단하기 때문에 분할보다 더 많이 사용된다는 점에 유의하는 것이 중요합니다. 근접 행렬을 기반으로 클러스터를 병합한다는 아이디어는 어떤 메커니즘을 통해 클러스터를 두 개로 나누는 것보다 쉬워 보입니다.
읽기: Python의 Scikit-learn: 기능, 전제 조건, 장단점
위에서 무슨 일이 일어났는지 명확하게 이해하려면 알고리즘과 관련된 단계를 살펴보세요.
알고리즘 작업
다음은 응집 클러스터링을 실행하는 단계입니다.
- 각 데이터 포인트를 클러스터로 정의
- 초기 근접도 측정항목 계산
- 메트릭을 기반으로 "가장 가까운" 또는 유사한 두 클러스터 병합
- 근접성 메트릭을 수정하고 단일 클러스터가 남을 때까지 세 번째 단계를 반복합니다.
따라서 여기에서 이해해야 할 유일한 것은 다양한 근접 방법의 영향입니다. 아시다시피 계층적 클러스터링에는 주로 4가지 유형의 근접성 방법이 있습니다. 이를 클러스터 간 유사성이라고도 합니다.
메서드(또는 코드에 정의된 연결)에는 다음이 포함됩니다.
- 최소 또는 단일 연결
- MAX 또는 완전한 연결
- 평균 연결
- 중심 연결
- 목적 함수의 전용 함수
덴드로그램을 생성하면서 linkage 옵션을 적용하면 동일한 결과를 쉽게 시각화할 수 있습니다.
모델의 출력을 시각화하려면 다음과 같은 작은 코드 스니펫만 있으면 됩니다.
plt.scatter(X[:,0],X[:,1], c=cluster.labels_, cmap='겨울')
보시다시피 반대쪽 모서리에 두 개의 서로 다른 클러스터가 있습니다. 클러스터 번호를 가지고 놀고 다른 결과를 볼 수도 있습니다. 모든 것은 덴드로그램을 절단하여 구동할 수 있습니다. 이를 이해하기 위해 덴드로그램 생성의 시각화를 위한 작은 스니펫을 작성해 보겠습니다.
scipy.cluster.hierarchy 모듈의 덴드로그램 및 연결 기능을 사용할 것입니다. 여기에서 사용하려는 연결을 정의합니다. 계층을 생성하려면 해당 개체를 덴드로그램 함수에 전달해야 합니다.
scipy.cluster.hierarchy에서 덴드로그램 가져오기, 연결
연결된 = linkage(X, '완료')
레이블 목록 = 범위(1, 8)
plt.Figure(figsize=(10, 7))
덴드로그램(연결된,
방향 = '상단',
레이블 = 레이블 목록,
distance_sort='내림차순',
show_leaf_counts=참)
plt.show()
여기에서 각 반복에서 클러스터가 어떻게 형성되는지 시각화할 수 있습니다. 따라서 원하는 수준에서 덴드로그램을 잘라낼 수 있으며 결국 그렇게 많은 클러스터가 생성됩니다. 따라서 이 계층 구조 생성으로 인해 알고리즘 및 데이터를 한 번만 실행한 후 클러스터 수를 변경할 수 있습니다. K-평균과 같은 다른 알고리즘에 비해 계층적 클러스터링에 우위를 제공하는 것입니다.
이제 일반적으로 사용되는 데이터 세트인 IRIS 에서 Python의 계층적 클러스터링 을 사용하는 방법을 살펴보겠습니다 . 로컬 CSV에서 데이터 세트를 읽습니다. 데이터 세트가 어떻게 보이고 분류해야 하는지 한 눈에 살펴보세요.
numpy를 np로 가져오기
pandas를 pd로 가져오기
matplotlib.pyplot을 plt로 가져오기
%matplotlib 인라인
데이터 = pd.read_csv('iris.csv')
data.head()
보시다시피 대상 변수는 'variety' 클래스입니다. 모델에 인코딩된 레이블이 필요하므로 숫자로 변환해야 하는 문자열 형식입니다. 이를 위해 sklearn의 전처리 라이브러리에서 레이블 인코더를 사용합니다. 간단한 맞춤 및 변환을 통해 숫자로 변환합니다.
sklearn에서 가져오기 전처리
le = 전처리.LabelEncoder()
le.fit(데이터['다양성'])
데이터['다양성'] = le.transform(데이터['다양성'])
이제 이것에 대한 덴드로그램을 생성하면 다양한 반복과 맵을 찾을 수 있습니다. 이것은 단일 연결로 보이는 방법입니다. 동일한 코드를 사용하고 전체 또는 중심 연결로 실행하면 덴드로그램이 약간 다릅니다. 논리는 동일하게 유지되지만 서로 다른 연결은 클러스터 병합 순서에 확실히 영향을 미칩니다.
scipy.cluster.hierarchy에서 덴드로그램 가져오기, 연결

연결된 = linkage(데이터, '와드')
plt.Figure(figsize=(10, 7))
덴드로그램(연결됨)
plt.show()
이제 데이터 세트에 클러스터링을 적용하면 두 개의 서로 다른 연결이 사용되며 클러스터를 정의할 때 실제로 어떤 차이점이 있는지 명확하게 알 수 있습니다. 레이블 인코더에서 이미 3개의 다른 클래스가 있음을 보았으므로 처음에는 3개의 클러스터를 적용할 수 있습니다.
sklearn.cluster에서 가져오기 AgglomerativeClustering
클러스터 = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='complete')
cluster.fit_predict(데이터)
plt.Figure(figsize=(10, 7))
plt.scatter(data['sepal.length'], 데이터['petal.length'], c=cluster.labels_)
위의 그림에서 볼 수 있듯이 3-군집 분류에서 연결은 예측에서 가시적인 변화를 보여줍니다. 먼저 와드 연결을 보십시오. 두 클러스터에 값이 약간 섞여 있어도 위의 클러스터를 정의된 상태로 유지하여 레이블을 올바르게 예측합니다. 그러나 완전한 연결을 볼 때 클러스터를 분해하고 일부 값을 잘못 분류합니다.
근접 방법에서 알 수 있듯이 완전한 연결은 위에서 볼 수 있듯이 더 큰 클러스터를 끊는 경향이 있습니다. 와드의 방법이나 단일 연결 방법은 이러한 문제에 덜 취약합니다. 이것은 단순한 데이터 세트를 위한 것이었습니다. 알고리즘이 일부 노이즈 데이터 세트의 영향을 받는 방식을 살펴보겠습니다.
그러한 데이터 세트 중 하나는 Pulsar 예측 데이터 세트 또는 HTRU2 데이터 세트 입니다. 데이터 세트는 약 18,000개의 샘플을 포함하므로 더 큽니다. ML 관점에서 보면 데이터 세트는 상당히 일반 크기이거나 더 작습니다. 그러나 비교적 IRIS 데이터셋보다 무겁습니다. 다양한 데이터 세트에 대한 구현의 필요성은 Python에서 계층적 클러스터링 의 성능을 분석하는 것 입니다. 구현 방법과 이점을 명확하게 이해하려면
pulsar_data = pd.read_csv('pulsar_stars.csv')
pulsar_data.head()
극단적인 값으로 인해 편향되지 않도록 데이터 세트를 정규화해야 합니다.
sklearn.preprocessing에서 가져오기 정규화
pulsar_data = 정규화(pulsar_data)
우리는 표준 코드를 사용할 것이지만 이번에는 두 계산의 타이밍을 측정합니다.
%%시각
scipy.cluster.hierarchy에서 덴드로그램 가져오기, 연결
연결된 = linkage(pulsar_data, '와드')
plt.Figure(figsize=(10, 7))
덴드로그램(연결됨)
plt.show()
IRIS 데이터셋에서 덴드로그램을 생성하는 타이밍은 6초였습니다. HTRU2 데이터 세트에서 덴드로그램을 생성하는 타이밍은 13분 54초였습니다. 그러나 이것은 HTRU2 데이터 세트로 훈련된 모델에서 관찰되는 서로 다른 연결로 인한 예측의 변화에 비하면 아무것도 아닙니다.
이전에 했던 것과 동일한 절차를 따르도록 합시다. 이번에는 모든 연결에 대해 예측을 수행합니다.
다음 그림은 각 연결에 대한 클러스터링의 예측을 보여줍니다.
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='average') #완전한, 와드 및 단일뿐만 아니라
cluster.fit_predict(pulsar_data)
plt.Figure(figsize=(10, 7))
plt.scatter(pulsar_data[:,1], pulsar_data[:,7], c=cluster.labels_)
예, 예측이 서로 얼마나 다른지 정말 놀랍습니다. 이것은 계층적 클러스터링에서 근접 행렬의 중요성을 보여줍니다.
보시다시피 단일 연결은 두 클러스터 사이의 최소 거리가 근접 메트릭을 정의하므로 거의 모든 포인트를 차지합니다. 이로 인해 노이즈가 있는 데이터에 취약합니다. 완전한 연결이 보이면 데이터를 두 개의 클러스터로 확실히 분할하지만 근접성으로 인해 큰 클러스터를 깨뜨렸을 수 있습니다.
평균 연결은 둘 사이의 절충점입니다. 노이즈의 영향을 덜 받지만 여전히 큰 클러스터를 깨뜨릴 수 있지만 확률은 낮습니다. 그리고 분류를 더 잘 처리합니다.
와드의 방법과 같은 목적 함수는 K-평균과 같은 다른 클러스터링 방법을 초기화하는 데 때때로 사용됩니다. 이 방법은 평균 연결과 마찬가지로 단일 연결 방법과 전체 연결 방법 간에 절충점이 있습니다. 와드의 방법과 같은 목적 함수는 주로 오분류 가능성을 줄이기 위해 맞춤형 솔루션에 사용됩니다. 그리고 우리는 그것이 잘 수행되는 것을 봅니다.
학습: 데이터 마이닝의 클러스터 분석: 응용 프로그램, 방법 및 요구 사항
시간 및 공간 복잡성
이해를 돕기 위해 근접성 메트릭이 정의되고 계산되는 방식을 고려하십시오. 근접성 메트릭은 데이터 맵 내부의 모든 클러스터 쌍 사이의 거리를 저장해야 합니다. 그것은 공간 복잡도를 만듭니다: O(n2). 큰 숫자입니다. 관점에서 보면 1,000,000포인트가 있다고 상상해 보십시오. 그렇게 하면 공간 요구 사항이 1012포인트가 됩니다. 한 포인트의 크기를 바이트로 근사하여 대략적이고 무거운 평균을 취하면 1TB의 데이터 크기를 얻습니다. 그리고 이것은 하드 드라이브가 아닌 RAM에 저장해야 합니다.
둘째, 시간 복잡도가 발생합니다. 모든 반복에서 근접 행렬을 스캔할 필요가 있고 n 단계를 수행하는 것을 고려할 때 복잡성을 O(n3)로 얻습니다. 특히 큰 데이터 세트에서 계산 비용이 많이 듭니다.
O(n2logn)로 낮추는 것이 가능할 수도 있지만 K-means와 같은 다른 클러스터링 알고리즘에 비해 여전히 너무 비쌉니다. 알고리즘의 공간 및 시간 복잡성을 분석하고 비용 함수를 최적화하는 방법에 대해 자세히 알아보려면 upGrad의 데이터 과학 및 기계 학습 프로그램을 참조하십시오.
제한 사항
- 우리는 이미 첫 번째 한계인 공간 및 시간 복잡성에 대해 논의했습니다. 큰 데이터 세트의 경우 계층적 클러스터링이 바람직하지 않음이 분명합니다. 더 빠른 컴퓨터로 시간 복잡도를 관리하더라도 공간 복잡도는 너무 높습니다. 특히 RAM에 로드할 때. 그리고 파이썬 에서 계층적 클러스터링을 구현할 때 속도 문제가 훨씬 더 커집니다 . Python은 느리고 큰 작업이 관련되면 확실히 어려움을 겪을 것입니다.
- 둘째, 근접성에 최적화된 기술이 없습니다. 각각에 여러 문제와 제한이 있는 경우 알고리즘의 내부 메커니즘이 최적화되지 않습니다.
- 클러스터링 결정을 살펴보면 철회할 수 없습니다. 의미- 일단 클러스터링이 명확한 반복에 적용되면 종료될 때까지 추가 반복에서 변경되지 않습니다. 따라서 구조적 부정확성으로 인해 알고리즘이 어느 시점에서 결합하거나 분할할 잘못된 클러스터를 선택하면 취소할 수 없습니다.
- 알고리즘을 자세히 살펴보면 최소화되고 있는 명확한 목적 함수가 없습니다. 다른 알고리즘에는 최적화하려고 하는 확실한 기능이 있습니다. 예를 들어, K-means에서 우리는 최소화하는 명확한 비용 함수를 가지고 있지만 계층적 클러스터링의 경우에는 그렇지 않습니다.
확인: 모든 데이터 과학자가 알아야 할 상위 9가지 데이터 과학 알고리즘
결론
큰 데이터 세트에 관해서는 특정 제한 사항이 있지만 이러한 유형의 클러스터링 알고리즘은 중소 규모의 데이터 세트를 다룰 때 매력적입니다. Python 의 계층적 클러스터링 알고리즘은 시간 및 공간 복잡성에 대한 놀라운 요구로 인해 아키텍처 또는 스키마에서 많은 발전을 보지 못했습니다.
그리고 지금은 빅데이터 시대인 것도 사실입니다. 그것은 우리가 더 잘 확장되는 알고리즘이 필요하다는 것을 의미합니다. 그러나 여전히 클러스터의 수를 확신할 수 없거나 분석을 효율적으로 세분화해야 하는 경우 Python의 계층적 클러스터링 이 만족스러운 선택이 될 수 있습니다.
이제 Python에서 계층적 클러스터링을 구현하는 방법을 알게 되었습니다.
기계 학습 및 데이터 과학에서 이러한 알고리즘과 방법의 적용을 더 이해하려면 upGrad에서 제공하는 과정을 살펴보십시오. 우리는 당신이 따르고 싶은 모든 경력 경로에 대한 누적 프로그램을 가지고 있습니다.
프로그램은 IIIT-B의 교수뿐만 아니라 최고의 전문가들이 큐레이터합니다. 자세한 내용은 upGrad 로 이동하십시오 . 급변하는 기술 발전의 선두에 서기 위해 데이터 과학을 배우는 것에 대해 궁금하다면 upGrad & IIIT-B의 데이터 과학 PG 프로그램을 확인하십시오.
Python에서 계층적 클러스터링을 수행하는 방법은 무엇입니까?
계층적 클러스터링은 데이터 포인트에 레이블을 지정하는 데 사용되는 일종의 비지도 머신 러닝 알고리즘입니다. 계층적 클러스터링은 특성의 유사성을 기반으로 요소를 그룹화합니다. 계층적 클러스터링을 수행하려면 다음 단계를 수행해야 합니다.
모든 데이터 포인트는 처음에 클러스터로 처리되어야 합니다. 따라서 처음에 클러스터 수는 K가 됩니다. 여기서 K는 총 데이터 포인트 수를 나타내는 정수입니다.
K-1 클러스터가 남도록 두 개의 가장 가까운 데이터 포인트를 결합하여 클러스터를 구축합니다.
계속해서 더 많은 클러스터를 형성하여 K-2 클러스터 등을 만듭니다.
당신 앞에 형성된 큰 클러스터가 있다는 것을 알 때까지 이 단계를 반복하십시오.
하나의 큰 클러스터만 남게 되면 덴드로그램을 사용하여 문제 설명에 따라 해당 클러스터를 여러 클러스터로 나눕니다.
이것은 Python에서 계층적 클러스터링을 수행하는 전체 프로세스입니다.
계층적 클러스터링의 두 가지 유형은 무엇입니까?
계층적 클러스터링에는 두 가지 주요 유형이 있습니다. 그들은:
응집 클러스터링
이 클러스터링 방법은 AGNES(Agglomerative Nesting)라고도 합니다. 이 알고리즘은 상향식 접근 방식을 사용합니다. 여기에서 모든 개체는 단일 요소 클러스터로 간주됩니다. 비슷한 특성을 가진 두 클러스터가 결합되어 더 큰 클러스터를 형성합니다. 이 방법은 하나의 큰 클러스터가 남을 때까지 따릅니다.
분할 계층적 클러스터링
이 클러스터링 방법은 DIANA(Divisive Analysis)라고도 합니다. 이 알고리즘은 AGNES에서 사용하는 것과 반대인 하향식 접근 방식을 따릅니다. 여기서 루트 노드는 모든 요소의 거대한 클러스터로 구성됩니다. 매 단계마다 가장 이질적인 클러스터를 나누어 하나의 클러스터가 남을 때까지 이 과정을 계속합니다.
어떤 유형의 계층적 클러스터링 알고리즘이 더 널리 사용됩니까?
아시다시피 계층적 클러스터링 알고리즘에는 응집 및 분할 클러스터링의 두 가지 유형이 있습니다. 두 알고리즘 중에서 계층적 클러스터링을 수행하는 데에는 응집 알고리즘이 더 일반적으로 선호됩니다.
이 방법에서는 상향식 접근 방식을 사용하여 유사성을 기반으로 모든 개체를 그룹화합니다. 단일 노드에서 시작하여 유사한 특성을 지닌 노드로 채워진 하나의 큰 클러스터에 도달합니다.