▷ 오늘 학습 계획: 머신러닝 강의(21~22)
Principal Component Analysis
데이터 집합 내에 존재하는 각 데이터의 차이를 가장 잘 나타내 주는 요소를 찾아 내는 방법
통계 데이터 분석(주성분 찾기), 데이터 압축(차원 감소), 노이즈 제거 등 다양한 분야에서 사용
차원 축소와 변수추출(기존 변수 조합 → 새로운 변수) 기법으로 널리 쓰이고 있다.
데이터의 분산을 최대한 보존하면서 서로 직교하는 새 기저(축)를 찾아 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간으로 변환
특성를 추출해서 새로운 특성를 만들 수 있지만 새로 만들어진 특성을 설명하기는 애매하다.
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: 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)
비지도학습
군집(clustering): 비슷한 샘플 모으기
이상치 탐지(outlier detection): 정상 데이터가 어떻게 보이는지 학습하고 비정상 샘플 감지
밀도 추정: 데이터셋의 확률 밀도 함수(PDF: Probability Density Function) 추정, 이상치 탐지 등에 사용
군집화에서 가장 일반적인 알고리즘(거리 기반 알고리즘)
군집 중심(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: 최대 반복 횟수(모든 데이터의 중심점 이동이 없으면 종료)
군집화 연습을 위한 데이터 생성기
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)