Machine Learning_9

YJ·2023년 5월 24일
0

▷ 오늘 학습 계획: 머신러닝 강의(21~22)

📖 Chapter 09

1) PCA

Principal Component Analysis

데이터 집합 내에 존재하는 각 데이터의 차이를 가장 잘 나타내 주는 요소를 찾아 내는 방법

통계 데이터 분석(주성분 찾기), 데이터 압축(차원 감소), 노이즈 제거 등 다양한 분야에서 사용

차원 축소변수추출(기존 변수 조합 → 새로운 변수) 기법으로 널리 쓰이고 있다.

데이터의 분산을 최대한 보존하면서 서로 직교하는 새 기저(축)를 찾아 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간으로 변환

특성를 추출해서 새로운 특성를 만들 수 있지만 새로 만들어진 특성을 설명하기는 애매하다.

sklearn.decomposition.PCA

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
def get_pca_data(ss_data, n_components=2):
    pca = PCA(n_components=n_components)
    pca.fit(ss_data)
    return pca.transform(ss_data), pca
def print_variance_ratio(pca):
    print('variance_ratio: ', pca.explained_variance_ratio_)
    print('sum of variance_ratio: ', np.sum(pca.explained_variance_ratio_))
# pca.explained_variance_: 설명력
# pca.explained_variance_ration_: 설명력을 비율로 나타내준다

MNIST data using PCA and kNN

MNIST: Modified National Institute of Standards and Technology

28*28 픽셀의 0~9 사이의 숫자 이미지와 레이블로 구성되어 있다.
60,000개의 훈련 데이터, 10,000개의 실험 데이터

from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=5)
clf.fit(X_train, y_train)
# Fit time:  0.20619893074035645
from sklearn.metrics import accuracy_score
pred = clf.predict(X_test)
accuracy_score(y_test, pred) # 0.9688
# Fit time : 15.153321743011475

PCA로 차원 줄이기

from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
from sklearn.model_selection import GridSearchCV, StratifiedKFold
from sklearn.metrics import classification_report, confusion_matrix
pipe = Pipeline([('pca', PCA()), ('clf', KNeighborsClassifier())])
parameters = {'pca__n_components': [2,5,10],
              'clf__n_neighbors': [5,10,15]}
kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=13)
grid = GridSearchCV(pipe, parameters, cv=kf, n_jobs = -1, verbose=1)
grid.fit(X_train, y_train)
grid.best_score_  # 0.931
accuracy_score(y_test, grid.best_estimator_.predict(X_test))  # 0.9288
def results(y_pred, y_test):
	print(classification_report(y_test, y_pred))
results(grid.predict(X_train), y_train)

2) Clustering

비지도학습

군집(clustering): 비슷한 샘플 모으기

이상치 탐지(outlier detection): 정상 데이터가 어떻게 보이는지 학습하고 비정상 샘플 감지

밀도 추정: 데이터셋의 확률 밀도 함수(PDF: Probability Density Function) 추정, 이상치 탐지 등에 사용

K-Means

sklearn.cluster.KMeans

군집화에서 가장 일반적인 알고리즘(거리 기반 알고리즘)
군집 중심(centroid)이라는 임의의 지점을 선택해서 해당 중심에 가장 가까운 포인트들을 선택하는 군집화
속성의 개수가 너무 많으면 군집화의 정확도가 떨어진다.

K-Means 알고리즘

초기 중심점 설정
각 데이터는 가장 가까운 중심점에 소속
중심점에 할당된 평균값으로 중심점 이동
각 데이터는 이동된 중심점 기준으로 가장 가까운 중심점에 소속
다시 중심점에 할당된 데이터들의 평균값으로 중심점 이동
데이터들의 중심점 소속 변경이 없으면 종료

from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
model.fit(feature) # feature = 특성을 담은 dataframe
model.labels_  #군집화 라벨
model.cluster_centers_  #군집 중심값

n_clusters: 군집화 할 개수(군집 중심점의 개수)
init: 초기 군집 중심점의 좌표를 설정하는 방식을 결정
max_iter: 최대 반복 횟수(모든 데이터의 중심점 이동이 없으면 종료)

make_blobs

군집화 연습을 위한 데이터 생성기

from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=200, n_features=2, centers=3,
                  cluster_std=0.8, random_state=0)
print(X.shape, y.shape)  #(200, 2) (200,) 
unique, counts = np.unique(y, return_counts=True)
print(unique, counts)  #[0 1 2] [67 67 66]
# X, y를 이용해서 dataframe 만든 다음에 군집화
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=200, random_state=13)
cluster_labels = kmeans.fit_predict(X)
cluster_df['kmeans_label'] = cluster_labels
# 결과 확인
print(cluster_df.groupby('target')['kmeans_label'].value_counts())

군집 평가

분류기는 평가 기준(정답)을 가지고 있지만 군집은 그렇지 않다.
군집 결과를 평가하기 위해 실루엣 분석을 많이 활용한다.

실루엣 분석

각 군집 간의 거리가 얼마나 효율적으로 분리되어 있는지 나타낸다.
다른 군집과는 거리가 떨어져 있고, 동일 군집간의 데이터는 서로 가깝게 잘 뭉쳐 있는지 확인한다.
군집화가 잘 되어 있을 수록 개별 군집은 비슷한 정도의 여유 공간을 가지고 있다.

  • 실루엣 계수: 개별 데이터가 가지는 군집화 지표
from sklearn.metrics import silhouette_samples, silhouette_score
avg_value = silhouette_score(iris.data, iris_df['cluster'])
score_values = silhouette_samples(iris.data, iris_df['cluster'])
print('avg_value', avg_value)
print('silhouette_samples() return 값의 shape', score_values.shape)
# avg_value 0.5528190123564095
# silhouette_samples() return 값의 shape (150,)
from yellowbrick.cluster import silhouette_visualizer
silhouette_visualizer(kmeans, iris.data, colors='yellowbrick')

군집을 이용한 이미지 분할

  • semantic segmentation (최고 성능: CNN 기반)
    동일 종류의 물체에 속한 픽셀을 같은 세그먼트로 할당

▷ 내일 학습 계획: 머신러닝 강의(23~25)

[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]

0개의 댓글