예를 들어 3*3을 주고 라벨 데이터 셋을 입력 데이터 셋의 정답인 9를 알려주면 주어지지 않은 데이터 셋 9*3도 해결할 수 있음
▪️ 비지도학습
지도 학습과 달리 정답이 없는 데이터
비슷한 특징끼리 군집화하여 새로운 데이터에 대한 결과를 예측하는 방법
라벨링이 되어 있지 않은 데이터로부터 패턴이나 형태를 찾아야 하기 때문에 지도학습보다는 조금 더 난이도가 있음
비지도 학습의 대표적인 종류로는 클러스터링(Clustering), 차원 축소(Dimentionality Reduction)이 있음
2️⃣ 차원 축소
데이터에서 차원 = 변수의 수 (차원이 크다는 것은 변수가 많다는 것)
차원이 크면 시각화가 어렵고, 이해하기 어렵고, 분석하기도 어렵다
그래서 이 차원을 줄이는 다양한 기법들을 차원 축소라고 한다
▪️ PCA (주성분 분석, Principal Component Analysis)
대표적인 차원 축소 알고리즘
PCA는 시각화를 위해 사용되며, 다차원의 시각화도 가능해진다
차원을 줄이기 위해서 축을 회전시켜 새로운 축을 찾아내는 방법이다
몇 개의 점은 서로 겹치게 되는 문제점이 발생하는데 이 경우 정보의 유실이 있을 수 있다
그러므로 분산이 가장 넓은 지역을 찾는다
분산이 가장 넓은 지역을 직선으로 표시해 점을 옮겨 점들이 퍼져있는 정도를 지켜준다
각 점들이 겹치지 않도록 하는 방법
Scree Plot
PCA 분석 후 주성분 수를 선정하기 위해 고유값-주성분의 분산 변화를 보는 그래프
설명된 분산의 비율이 완만하게 감소되는 차원들은 버림
Python
seaborn.scatterplot(x='petal_length', y = 'petal_width', hue='species', data=iris)
from sklearn.decomposition import PCA
# 2차원으로 축소
pca = PCA(n_components=2) # n_components = 주성분의 갯수를 결정
pca.fit(x) # 각도를 찾음
# 축소된 차원으로 데이터를 변환
z = pca.transform(x)
# 축소된 차원을 이용해 시각화
# 4가지 변수를 잘 보여줄 수 있는 2차원으로 축소함
# 모든 변수가 다 반영이 되어있다
seaborn.scatterplot(
x=z[:, 0],
y=z[:, 1],
hue=iris.species
)
import matplotlib.pyplot as plt
# MDS를 이용해 거리를 좌표로 바꾸기
mds = MDS(n_components=2, dissimilarity='precomputed')
z = mds.fit_transform(d)
# 시각화
seaborn.scatterplot(
x = z[:, 0],
y = z[:, 1],
)
for c, p in zip(name2id, z):
plt.text(p[0], p[1], c,)
▪️ 차원 축소 정리
PCA
NMF
MDS
시각화, 단점 가중치가 -인 경우가 있어서 해석이 어려울 때가 있다
PCA와 비슷하지만 해석이 좀 더 잘 됨
방향에 대한 해석이 필요가 없고, 원래의 거리를 가능한 지켜서 그리고 싶을 때
3️⃣ 군집 분석(Clustering)
비슷한 사례들을 군집으로 묶음
고객을 성별, 연령 등 인구학적 변수에 따라 그룹화 → 그러나 고객들은 단순하게 나눠지지 않으며, 정확성도 떨어짐
구글, 넷플릭스 등의 서비스는 인구학적 변수를 사용하지 않음
데이터에 기반해서 고객들을 그룹화할 필요가 있을 때 군집 분석을 사용함
분류분석은 label이 있을 때 새로운 데이터 그룹을 예측하기 위한 목적이며, 군집분석은 label이 없을 때 데이터 자체의 특성에 대해 알고자 하는 목적
k-Means
k개의 평균이라는 뜻으로 가장 널리 사용되는 클러스터링 방법
군집의 평균(중심점)을 구함
사례를 중심점이 가장 가까운 군집에 포함시킴
# 데이터
iris = pd.read_excel('iris.xlsx')
x = iris.iloc[:, 0:4]
# 학습
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3)
km.fit(x)
# 예측
cluster = km.predict(x)# 같은 번호가 있으면 같은 그룹
# 시각화
seaborn.scatterplot(x=z[:,0], y=z[:,1], hue=cluster, data=iris)