< 군집(Clustering) 분석 >
- 비지도 학습 방법
- 군집 분석은 분류를 위한 분석
- 패턴이 유사한 데이터들끼리 묶는 작업
- 묶음 단위를 군집(Cluster)라고 한다.
- 대표 모델 : KMeans(k평균)
< KMeans(K평균) 군집 모델 >
- 모델 스스로 패턴이 유사한 특성(컬럼)들을 묶으면서 중심 평균을 구하는 방식
- 점진적으로 패턴이 유사한 특성들끼리 묶어나가는 방식
- 특성들이 묶이면서 중심에 대한 평균이 이동됨
- 가장 대표적인 군집모델
(특징)
- 군집할 개수를 미리 정의해야함
- 군집할 개수는 종속변수의 범주의 개수와 동일함
( 이미 종속변수를 알고있는 경우도 있고 아닌 경우도 있음)
- 군집의 개수를 이미 알고있는 경우에는 직접 개수 정의
- 군집의 개수를 모르는 경우에는 하이퍼파라메터 튜닝을 통해 적절한 개수 선정
(작동 방식)
1. 데이터들을 이용해서 무작위로 k개의 클러스터 중심을 정함
2. 각 샘플에서 가장 가까운 클러스터 중심을 찾아서 해당 클러스터의 샘플로 지정
3. 특정 클러스터에 속한 "샘플들의 평균값"으로 클러스터 중심을 변경
4. 클러스터 중심에 변화가 없을 때까지 2번~3번을 반복수행하게 되는 모델임
○ 사용할 라이브러리
# KMeans 군집모델
from sklearn.cluster import KMeans
○ 데이터셋 - 와인데이터
data = pd.read_csv("./data/08_wine.csv")
X = data.iloc[:,:-1]
y = data.iloc[:,-1]
X.shape , y.shape
((6497, 3), (6497,))
○ 정규화
- 정규화 클래스 변수명 : scaler
- 독립변수 정규화 변수명 : X_scaled
scaler = StandardScaler()
scaler.fit(X,y)
X_scaled = scaler.transform(X)
X_scaled
○ 훈련 : 테스트 = 8 : 2 로 분리
X_train , X_test , y_train , y_test = train_test_split(X_scaled, y , test_size=0.2 , random_state=42)
X_train.shape , X_test.shape , y_train.shape , y_test.shape
((5197, 3), (1300, 3), (5197,), (1300,))
○ 하이퍼파라메터 튜닝을 위한 매개변수 정의하기
n_clusters : 군집 개수
n_init : 초기 중심점 설정 횟수
max_iter : 최대 반복 횟수
tol : 중심점의 이동이 설정값보다 작으면 종료
param_grid = {
"n_init" : [10,30,50],
"max_iter" : [10,30,50],
"tol" : [0.0001,0.001,0.01,0.1]
# "n_clusters" : [2,3,4,5]
}
▶ 군집의 개수는 2개인 것을 알고 있으므로 주석처리.. 모르면 위처럼 군집개수 찾아야함
○ 튜닝 및 훈련모델 생성
# 튜닝에 사용할 훈련모델 생성
kmeans = KMeans(n_clusters=2,random_state=42)
# GridSearchCV 생성하여 베스트 모델 찾기
grid_search = GridSearchCV(kmeans,param_grid,cv = 5 , scoring="accuracy")
grid_search
# 튜닝 시작하기
grid_search.fit(X_train , y_train)
○ 최적의 매개변수를 가지는 모델 추출하기
best_model = grid_search.best_estimator_
best_model
○ 훈련 및 검증(테스트) 모델 평가하기
- 훈련 및 테스트 예측
- 훈련 및 테스트 정확도 확인
- 오차행렬(혼동행렬) 추출
train_pred = best_model.predict(X_train)
test_pred = best_model.predict(X_test)
train_acc = accuracy_score(y_train,train_pred)
test_acc = accuracy_score(y_test , test_pred)
cm = confusion_matrix(y_test , test_pred)
print(f"훈련정확도 : {train_acc} / 검증정확도 : {test_acc}")
print(cm)
훈련정확도 : 0.5460842793919569 / 검증정확도 : 0.5392307692307692
[[329 12]
[587 372]]
○ 오차행렬도 시각화
from sklearn.metrics import ConfusionMatrixDisplay
disp = ConfusionMatrixDisplay(confusion_matrix =cm)
disp.plot()
▶ 튜닝을 했음에도 정확도가 낮고 부정적오류의 개수가 587건으로 매우 높기 때문에
이 군집 모델로는 분류하는것이 적절하지않다.
○ 시각화 하기
데이터 프레임에 넣기
data = {
"alcohol" : X_train[: , 0],
"sugar" : X_train[: , 1],
"pH" : X_train[: , 2],
"class" : y_train,
"cluster" : train_pred
}
train_data = pd.DataFrame(data = data)
train_data
sns.pairplot(train_data,hue="cluster")
plt.show()
▶ 예측한 값 파란색 : 0, 주황색 : 1 인데 파란색이 1에도 있으므로 분류가 제대로 되지 않았음
< Iris(붓꽃) 데이터 셋을 이용한 군집분석 >
① 라이브러리
- 군집분석 평가 방법 : 실루엣 score로 평가함
- 값의 범위 : -1~1 사이의 값
- 0에 가까울 경우 : 이도저도아닌 상태(섞여있는 경우가 많음)
- 1에 가까울 경우 : 군집이 잘 된 경우
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 다양한 데이터셋 가져올수 있음 load_
from sklearn.datasets import load_iris
○ 데이터 불러들이기
iris = load_iris()
iris
< 독립변수 특성 설명 >
- sepal length : 꽃받침 길이
- sepal width : 꽃받침 너비
- petal length : 꽃잎 길이
- petal width : 꽃잎 너비
< 종속변수 특성 설명 >
- 0, 1, 2 의 값
- 0 : 세토사(setosa)
- 1 : 버시컬러(versicolor)
-2 : 버지니카(verginica)
< 분석 주제 >
- 4가지 독립변수 특성을 이용하여 붓꽃의 품종 종류별로 군집(클러스터) 분류하기
② 독립변수와 종속변수 데이터 추출하기
독립변수명 : X , 종속변수명 : y
# X = iris["data"]
# y = iris["target"]
X = iris.data
y = iris.target
X.shape , y.shape
((150, 4), (150,))
▶ 딕셔너리의 key값에 . 을 통해 접근 가능하다
- 군집분류에서는 별도로 훈련과 검증데이터로 분류하지 않고 전체 데이터를 사용하여 군집한다.
③ 군집모델 생성하기
- 군집개수 지정
- n_init : 초기 중심점 설정횟수는 10으로 설정
- 랜덤규칙 : 42번
kmeans_model = KMeans(n_clusters=3,n_init=10 , random_state=42)
kmeans
④ 모델 훈련 및 군집하기(예측)
- 군집분석에서는 훈련과 동시에 예측이 수행됨
kmeans_labels = kmeans_model.fit_predict(X)
kmeans_labels
⑤ 군집결과 시각화하기
- 주성분분석(PCA)을 통해 시각화하기
- 주성분분석(PCA)
: 훈련에 사용된 특성들 중에 특징을 가장 잘 나타낼 수 있는 특성을 추출하는 방식
: 특성을 추출하여 특성을 축소시키는 방식으로 "차원축소"라고 한다.
: 주요 성분의 특성만을 사용하기 때문에 빠른 성능을 나타낸다.
○ 라이브러리
# 주성분분석(차원축소) 라이브러리
from sklearn.decomposition import PCA
○ 주성분 분석 클래스 생성하기
- n_components : 주성분 몇개로 차원을 축소할지 정의
pca = PCA(n_components=2)
pca
○ 주성분 찾기
pca.fit(X)
X_pca = pca.transform(X)
X_pca
(150, 2)
▶ 컬럼의 개수가 2개로 축소된 것을 확인할 수 있다.
○ 시각화하기
plt.title("k평균 군집화 결과")
plt.scatter(X_pca[:,0], X_pca[:,1], c = kmeans_labels)
plt.show()
⑥ 군집분석 평가하기 : 실루엣 평가
s_score = silhouette_score(X,kmeans_labels)
s_score
0.5528190123564097
▶ 세가지 중에 한가지 범주는 잘 분류하였지만 나머지 두개는 섞여있는 형태를 보임
이 모델을 사용하여 분류하기에는 미흡함
지도 학습의 분류 모델을 이용하여 분류해볼 필요성이 있다. (종속변수가 있기에 가능)
'머신러닝&딥러닝' 카테고리의 다른 글
[머신러닝] 실습 - Load Type 분류 (0) | 2023.12.29 |
---|---|
[머신러닝] 모델 저장 및 불러오기 (0) | 2023.12.29 |
[머신러닝] 분류 앙상블 모델 (0) | 2023.12.27 |
[머신러닝] 회귀모델 추가내용 (0) | 2023.12.26 |
[머신러닝] 회귀분석 모델 (0) | 2023.12.22 |