초간단_Python_계층형 클러스터링_

초간단 시리즈는 이번에 계층 군집을 초간단하게 기술해 보려고 한다.
사전 처리 단계의 경험이 있기 때문에 이번에도kaggle Titanic의 데이터를 사용합니다.
전처리에 관해서는 아래를 참조하십시오. (이번 데이터 처리도 이 블로그에 기재되어 있습니다.)
[Beginner] [AI] [기계 학습] Light GBM: Titanic: Machine Learning from Disaster
마케팅 업무를 진행할 때, 사용자를 임의의 집단으로 나누다
그걸 바탕으로 반복해서 분석하는 경우도 있어요.
대부분의 경우 K-means 같은 것을 자주 사용하지만 그렇게 큰 데이터가 아니라면 실제로 층을 나누어 분류하는 것도 간단한 조정을 들을 수 있기 때문에 실용성이 풍부한 경우가 있다.
그래서 이번에는 간단하게 층을 나누어 분류하는 곳을 소개한다.

1. 사전 준비


우선 예처럼 자주 사용하는 라이브러리를 가져오세요.

import numpy as np
import numpy.random as random
import scipy as sp
from pandas import Series,DataFrame
import pandas as pd
import csv
import math
import string
import gensim
from gensim import corpora, models, similarities
import os
#下記が階層クラスタリングのライブラリ
from scipy.cluster.hierarchy import linkage,dendrogram
위에도 링크가 있지만 전처리 코드를 간단하게 기재할 수 있다.
df000 = pd.read_csv("train.csv",encoding="CP932")
#欠損値状況を確認(アウトプットは省略しますので実行してみてください)
df000.isnull().sum()
#まずは年齢の欠損値を平均値で補完
df001 = df000
df001["Age"] = df000["Age"].fillna(df000["Age"].describe()["mean"])
#すいません何故がこのタイミングで説明変数を精査(必要なものをdrop)
df003 = df002.drop(["PassengerId","Name","Ticket","Cabin","Embarked"],axis=1)
#カテゴリ変数のダミー化(性別をダミー化します)
df004 = pd.get_dummies(df003["Sex"])
#ダミー化した性別情報を元のデータフレームに結合し、カテゴリ"Sex"を削除します
df005 = pd.concat([df003,df004],axis=1)
df006 = df005.drop("Sex",axis=1)
예.여기까지는 간단한 데이터 예처리입니다.
물론 다른 효과적인 방법도 많으니 용서해 주십시오.

2. 계층형 클러스터링 수행


다음은 층별 분류를 실행하고 한 줄로 끝냅니다.
아래와 같다.
#階層クラスタリングの実行
df007 = linkage(df006,metric = 'euclidean',method="ward")
데이터 프레임의 계층화는 여기서 끝납니다.(빨리)
이 부분은 "metric"과 "method"부분에서 조정할 수 있습니다.
각 변수 일람은 이 블로그의 마지막에 실릴 것이다.
참고로 층별 결과도 가시화할 수 있다.
흔히 말하는 덴마크 녀석이야.
실제 업무에서는 잘 사용되지 않지만 군집된 것 같다.
#階層結果のビジュアライズ
plt = dendrogram(df007)
output:

다음은 자신이 나누고 싶은 임의의 수량으로 묶을 때의 코드를 소개한다.
K-mean과 달리 분층 집합은 나누고 싶은 수량에 따라 집합을 구분할 수 있기 때문에 사용하기 쉽다.
#cut_treeファンクションでクラスタを任意のクラスタに分けれるようにします
cuttree = cut_tree(df007)
#下記の例では3つのクラスタに分けます
df008 = cuttree[:,-3]
#元のファイルにクラスタ数を結合(
df006["cluster"] =df008
3으로 나눌 때'-3'이라고 쓰는 데는 좀 주의하세요.
마지막으로 통합된 파일을 csv로 출력하고 레이더 도표나 도표로 EDA(Exploratory Data Analysis)를 해서 가장 적합한 그룹을 찾으십시오.
"어떻게 하면 가장 적합한 군집을 찾을 수 있습니까?"이런 상황에서
주로 3개로 진행됩니다.
1. linkage () 의 metric 및 method 모드를 변경합니다.
2. 마지막 cuttree () 의 묶음 수를 변경해 보기
3. 입력 데이터의 특징량 변경
상술한 실험을 진행하여 집단의 특징을 명확하게 구분할 수 있는 집단을 찾으십시오.

Ref.linkage()의 조화 요소


linkage () 함수의 조화 요소metric과method의 목록은 다음과 같습니다.

metric


euclidean: 유클리드 거리
minkowski:minkowski 거리
시티블록: 맨해튼 거리
표준화 유클리드 거리
qeuclidean: 곱하기 유클리드 거리
cosine: 여현 거리(1벡터 여현 빼기)
correlation: 층간 거리(1표본 관련성 제외)
hamming: 서로 다른 좌표 비율을 나타내는 한명 거리
jaccard:1 플러그인 계수 값 빼기
chebychev: 체비셰프 거리(최대 좌표차)
캔버라 거리
braycurtis: 브레 커티스 거리
마하라노비스: 마하라노비스 거리

method


single
complete
average
weighted
centroid
median
ward
참고는 아래의 링크입니다.
metric
https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html
method
https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html
조합은 임의의 것이지만 데이터가 밀집되어 잘 분리되지 않는 상황에서
metric=euclidean
method=ward
조합하면 잘 갈라지는 경우가 많아요.

후기


현재 상황 아래 두 가지는 잘 모르겠습니다. 조사 중입니다.
왜 cuttree가 때때로 효력을 잃는지 모르겠다...
·method=ward를 사용할 때 metric은 euclidean만 사용할 수 있습니다.
→ 다른 조합도 있고 사용하는 방법도 있다.
혹시 아시는 분 있으면 쌀 주세요.

좋은 웹페이지 즐겨찾기