반응형

파이썬 머신러닝 / k-최근접 이웃 알고리즘(KNN) 알아보기

 

k-최근접 이웃 알고리즘은 가장 간단한 지도학습 머신러닝 알고리즘으로 가장 가까운 훈련 데이터 포인트 하나를 최근접 이웃으로 찾아 예측합니다. 가장 가까운 이웃을 k개를 선택할 수 있고, 둘 이상의 이웃을 선택하였을 경우 레이블을 정하기 위해 더 많은 클래스를 레이블의 값으로 정합니다. 

 

간단하게 파이썬으로 k-최근접 이웃 알고리즘의 성능을 평가해보겠습니다. 

 

 

먼저 필요한 라이브러리를 가져옵니다. 

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt

 

분석을 위한 scikit-learn 라이브러리의 유방암에 대한 데이터셋을 가져오겠습니다. 

그리고 데이터는 학습 세트와 테스트 세트로 나누었습니다. 

cancer = load_breast_cancer()
x_train, x_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.3, stratify=cancer.target, random_state=100)

 

k-최근접 이웃의 수에 따라 train 세트와 test세트의 정확도를 살펴보기 위해 아래와 같이 변수를 생성하였습니다.

training_accuracy = []
test_accuracy = []
neighbors_settings = range(1, 101)

 

최근접 이웃의 수를 1부터 101까지 설정하여 학습 데이터를 가지고, 테스트 데이터의 성능을 평가해보겠습니다. 

for n_neighbors in neighbors_settings:
    clf = KNeighborsClassifier(n_neighbors=n_neighbors)
    clf.fit(x_train, y_train)
    training_accuracy.append(clf.score(x_train, y_train))
    test_accuracy.append(clf.score(x_test, y_test))

 

그리고 이것을 그래프로 그려보겠습니다. 

plt.plot(neighbors_settings, training_accuracy, label='train_accuracy')
plt.plot(neighbors_settings, test_accuracy, label='test_accuracy')
plt.ylabel('accuracy')
plt.xlabel('n_neighbors')
plt.legend()
plt.show()

 

이것을 실행해보면 아래 그래프가 출력됩니다. 

그래프로 봐서는 n_neighbors가 10정도일 때, train_accuracy와 test_accuracy가 어느 정도 높게 나오는 것을 볼 수 있습니다. 

 

 

 

전체 코드

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt

cancer = load_breast_cancer()
x_train, x_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.3, stratify=cancer.target, random_state=100)

training_accuracy = []
test_accuracy = []
neighbors_settings = range(1, 101)


for n_neighbors in neighbors_settings:
    clf = KNeighborsClassifier(n_neighbors=n_neighbors)
    clf.fit(x_train, y_train)
    training_accuracy.append(clf.score(x_train, y_train))
    test_accuracy.append(clf.score(x_test, y_test))

plt.plot(neighbors_settings, training_accuracy, label='train_accuracy')
plt.plot(neighbors_settings, test_accuracy, label='test_accuracy')
plt.ylabel('accuracy')
plt.xlabel('n_neighbors')
plt.legend()
plt.show()
반응형
반응형

파이썬 머신러닝 - Kernel PCA를 이용한 비선형 특성의 수 줄이기

 

PCA는 특성 행렬의 차원을 축소하고, 표준 PCA는 샘플을 선형적으로 투영하여 특성을 축소합니다. 데이터가 선형적으로 구분되지 않으면 선형 변환이 잘 되지 않습니다. 하여 커널 함수를 이용하여 선형적으로 구분되지 않은 데이터를 선형적으로 구분되는 고차원 공간에서 주성분으로 투영된 결과를 반환하도록 합니다. 

 

Kernel PCA에 사용할 수 있는 커널은 rbf(가우시안 방사 기저 함수 커널), poly(다항식 커널), sigmoid(시그모이드 커널), linear(선형 투영 커널) 등이 있습니다. linear를 이용하면 표준 PCA와 동일한 효과를 나타냅니다. 

 

 

rbf 커널을 이용하는 코드를 구현해보겠습니다.

먼저 scikit-learn 의 함수를 이용하여 swiss roll data를 만들어 보겠습니다.

이는 선형적으로 구분되지 않은 데이터입니다.

features, t = make_swiss_roll(n_samples=1000, noise=0.1, random_state=42)

 

방사 기저 함수 rbf를 사용하여 Kernel PCA를 적용시킵니다. 

kpca = KernelPCA(n_components = 1, kernel="rbf", gamma=15)
features_kpca = kpca.fit_transform(features)

아래와 같이 3개의 특성을 1개의 특성으로 축소한 것을 볼 수 있습니다.

print("원본 : ", features.shape[1])
print("축소 : ", features_kpca.shape[1])

 

전체 코드

from sklearn.datasets import make_swiss_roll
from sklearn.decomposition import KernelPCA


features, t = make_swiss_roll(n_samples=1000, noise=0.1, random_state=42)

kpca = KernelPCA(n_components = 1, kernel="rbf", gamma=15)
features_kpca = kpca.fit_transform(features)

print("원본 : ", features.shape[1])
print("축소 : ", features_kpca.shape[1])

 

반응형
반응형

파이썬 머신러닝 - PCA를 이용한 특성의 수 줄이기

일련의 특성이 주어졌을 때 데이터의 분산을 유지하면서 특성의 수를 줄이기 위해 사용됩니다. 

 

주성분 분석(PCA, Principal component analysis)는 성형 차원 축소 기법으로 대부분의 분산을 유지하는 특성 행렬의 주성분에 샘플을 투영합니다. 또한 주성분 분석은 비지도 학습 기법이며, Target 벡터의 정보를 사용하지 않고 특성 행렬만을 이용하여 특성을 수를 줄입니다.

 

아래의 순서로 특성을 줄여보겠습니다. 

샘플 가져옴 -> 샘플을 표준화 -> PCA 객체 생성 -> 표준화된 샘플을 생성된 PCA로 특성 줄이기

 

 

숫자 손글씨에 대한 데이터 샘플을 가져옵니다. 이 샘픔을 scikit-learn 라이브러리에서 제공해주고 있습니다. 

digits = datasets.load_digits()

 

특성 행렬을 표준화 시킵니다. 이는 평균이 0이고, 표준편차가 1로 만드는 것입니다. 

features = StandardScaler().fit_transform(digits.data)

 

PCA 객체를 이용하도록 지정합니다. 이 때 n_components를 0과 1 사이로 지정하면 pca는 해당 비율의 분산을 유지할 수 있는 최소한의 특성 개수를 반환합니다. 1 이상이면 입력 개수만큰의 특성이 반환됩니다. whiten을 True로 지정하면 각 주성분의 값을 평균이 0이고 분산이 1이 되도록 변환합니다. 

 

아래는 99%의 분산을 유지하도록 객체를 생성하였습니다.

pca = PCA(n_components=0.99, whiten=True)

 

위에서 만든 pca를 수행합니다. 

features_pca = pca.fit_transform(features)

 

결과를 확인해 보면 원본 특성의 개수 64개가 54개로 줄어든 것을 확인할 수 있습니다. 

print("원본 : ", features.shape[1])
print("축소 : ", features_pca.shape[1])

 

 

전체 코드

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn import datasets

digits = datasets.load_digits()

features = StandardScaler().fit_transform(digits.data)

pca = PCA(n_components=0.99, whiten=True)

features_pca = pca.fit_transform(features)

print("원본 : ", features.shape[1])
print("축소 : ", features_pca.shape[1])
반응형
반응형

파이썬 머신러닝 scikit-learn 데이터셋 종류

 

 

Scikit-learn 라이브러리는 파이썬에서 유명한 머신러닝 라이브러리 중 하나입니다. 이 라이브러리는 머신러닝 알고리즘을 적용할 수 있는 함수들을 제공하며, 다양한 데이터 샘플을 제공합니다. 이번에는 Scikit-learn의 다양한 데이터 샘플을 알아보도록 하겠습니다.

 

 

1) sklearn.datasets.load_iris : 꽃 종류 중 하나인 붓꽃 데이터셋

이 데이터셋은 간단하고 유명한 데이터셋 샘플입니다. 

종류는 3 종류가 있고, 데이터 샘플은 각 종류마다 50개씩 있습니다. 

그리고 모두 150개의 샘플을 가지고 있으며, 특성은 4가지가 있습니다. 

2) sklearn.datasets.load_digits :  0부터 9까지의 숫자를 손으로 쓴 이미지 데이터셋

이 데이터셋은 0-9 까지 총 10개의 클래스를 가지고 있습니다. 각 클래스는 180 여개의 샘플 데이터를 가지고 있으며, 총 샘플 데이터는 1797개가 있습니다. 8x8 이미지라 특성은 총 64가지가 있습니다.  

3) sklearn.datasets.load_diabetes : 당뇨병 진행도에 대한 데이터셋

이 데이터셋은 총 442개의 샘플 데이터를 가지고 있고, 10개의 특성을 가지고 있습니다. 이 데이터셋은 주로 회귀 분석에 사용되는 데이터셋입니다. 

4) sklearn.datasets.load_breast_cancer : 유방암에 대한 데이터셋

이 데이터셋은 총 2개의 클래스를 가지며, 하나의 클래스는 212개의 샘플데이터를 가지고 있으며, 또 다른 하나의 클래스는 357개의 데이터 셋을 가지고 있습니다. 총 30개의 특성을 가지고 있습니다. 

5) sklearn.datasets.load_boston : 보스턴 집값에 대한 데이터셋

이 데이터셋은 총 506개의 샘플 데이터를 가지고 있으며, 13개의 특성을 가지고 있습니다. 주로 회귀 분석에 사용됩니다. 

6) sklearn.datasets.load_wine : 와인에 대한 데이터셋

이 데이터셋은 총 3개의 클래스를 가지며, 각 59, 71, 48개의 샘플 데이터를 가지고 있습니다. 또한 13개의 특성을 가지고 있습니다.

 

Scikit-learn의 데이터셋 뿐 아니라 라이브러리에 대한 정보는 아래 링크에서 확인할 수 있습니다. 

scikit-learn.org/stable/modules/classes.html#module-sklearn.datasets

 

API Reference — scikit-learn 0.23.2 documentation

 

scikit-learn.org

 

반응형

+ Recent posts