2.3 지도 학습 알고리즘

2.2 일반화, 과대적합, 과소적합 | 목차 | 2.3.2 k-최근접 이웃

­

이제 가장 인기인 머신러닝 알고리즘들을 둘러보면서 데이터로부터 어떻게 학습하고 예측하는지 설명하겠습니다. 또한 이런 모델들에서 모델의 복잡도가 어떤 역할을 하는지 이야기하고 각 알고리즘이 모델을 어떻게 만드는지 소개하겠습니다. 그리고 모델들의 장단점을 평가하고 어떤 데이터가 잘 들어맞을지 살펴보겠습니다. 가장 중요한 매개변수와 옵션의 의미도 설명하겠습니다.1 분류와 회귀 모델을 모두 가지고 있는 알고리즘도 많은데, 이런 경우 둘 다 살펴보겠습니다.

각 알고리즘의 자세한 설명을 모두 읽을 필요는 없지만, 모델을 이해하면 여러 머신러닝 알고리즘의 작동 방식을 더 잘 알 수 있습니다. 이 장은 특정 알고리즘의 작동 방식이 궁금할 때 다시 돌아와서 확인하는 참고 자료로 사용하면 좋습니다.

2.3.1 예제에 사용할 데이터셋

여러 알고리즘을 설명하기 위해 데이터셋도 여러 개 사용하겠습니다. 어떤 데이터셋은 작고 인위적으로 만든 것이며, 알고리즘의 특징을 부각하기 위해 만든 것도 있습니다. 실제 샘플로 만든 큰 데이터셋도 있습니다.

두 개의 특성을 가진 forge 데이터셋은 인위적으로 만든 이진 분류 데이터셋입니다. 다음 코드는 이 데이터셋의 모든 데이터 포인트를 산점도로 그립니다(그림 2-2). x 축은 첫 번째 특성이고 y 축은 두 번째 특성입니다. 모든 산점도가 그렇듯이 점 하나가 각 데이터 포인트를 나타냅니다. 점의 색과 모양은 데이터 포인트가 속한 클래스를 나타냅니다.

In[3]:

# 데이터셋을 만듭니다.
X, y = mglearn.datasets.make_forge()
# 산점도를 그립니다.
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
plt.legend(["클래스 0", "클래스 1"], loc=4)
plt.xlabel("첫 번째 특성")
plt.ylabel("두 번째 특성")
print("X.shape: {}".format(X.shape))

Out[3]:

X.shape: (26, 2)

2-2

그림 2-2 forge 데이터셋의 산점도

X.shape 값에서 알 수 있듯이 이 데이터셋은 데이터 포인트 26개와 특성 2개를 가집니다.
회귀 알고리즘 설명에는 인위적으로 만든 wave 데이터셋을 사용하겠습니다. wave 데이터셋은 입력 특성 하나와 모델링할 타깃 변수(또는 응답)를 가집니다. [그림 2-3]은 특성을 x 축에 놓고 회귀의 타깃(출력)을 y 축에 놓았습니다.

In[4]:

X, y = mglearn.datasets.make_wave(n_samples=40)
plt.plot(X, y, 'o')
plt.ylim(-3, 3)
plt.xlabel("특성")
plt.ylabel("타깃")

2-3

그림 2-3 x 축을 특성, y 축을 타깃으로 한 wave 데이터셋의 그래프

종이는 2차원이라 둘이 넘는 특성은 표현하기 어려우니 손쉽게 시각화하기 위해서 간단한 저차원 데이터셋을 사용하겠습니다. 특성이 적은 데이터셋(저차원 데이터셋)에서 얻은 직관이 특성이 많은 데이터셋(고차원 데이터셋)에서 그대로 유지되지 않을 수 있습니다. 하지만 이런 사실을 유념해둔다면 알고리즘을 배울 때 저차원 데이터셋을 사용하는 것이 매우 좋습니다.

인위적인 소규모 데이터셋 외에 scikit-learn에 들어 있는 실제 데이터셋도 두 개를 사용하겠습니다. 하나는 유방암 종양의 임상 데이터를 기록해놓은 위스콘신 유방암Wisconsin Breast Cancer 데이터셋입니다(줄여서 cancer라고 하겠습니다). 각 종양은 양성benign(해롭지 않은 종양)과 악성malignant(암 종양)으로 레이블되어 있고, 조직 데이터를 기반으로 종양이 악성인지를 예측할 수 있도록 학습하는 것이 과제입니다.

이 데이터는 scikit-learn에 있는 load_breast_cancer 함수를 사용하여 불러올 수 있습니다.

In[5]:

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
print("cancer.keys(): \n{}".format(cancer.keys()))

Out[5]:

cancer.keys():
dict_keys(['feature_names', 'data', 'DESCR', 'target', 'target_names'])

노트_ scikit-learn에 포함된 데이터셋은 실제 데이터와 데이터셋 관련 정보를 담고 있는 Bunch 객체에 저장되어 있습니다. Bunch 객체는 파이썬 딕셔너리dictionary와 비슷하지만 점 표기법을 사용할 수 있습니다(즉 bunch[‘key’] 대신 bunch.key를 사용할 수 있습니다).

이 데이터셋은 569개의 데이터 포인트를 가지고 있고 특성은 30개입니다.

In[6]:

print("유방암 데이터의 형태: {}".format(cancer.data.shape))

Out[6]:

유방암 데이터의 형태: (569, 30)

569개 데이터 포인트 중 212개는 악성이고 357개는 양성입니다.

In[7]:

print("클래스별 샘플 개수:\n{}".format(
      {n: v for n, v in zip(cancer.target_names, np.bincount(cancer.target))}))

Out[7]:

클래스별 샘플 개수:
{'benign': 357, 'malignant': 212}

feature_names 속성을 확인하면 각 특성의 의미를 알 수 있습니다.

In[8]:

print("특성 이름:\n{}".format(cancer.feature_names))

Out[8]:

특성 이름:
['mean radius' 'mean texture' 'mean perimeter' 'mean area'
 'mean smoothness' 'mean compactness' 'mean concavity'
 'mean concave points' 'mean symmetry' 'mean fractal dimension'
 'radius error' 'texture error' 'perimeter error' 'area error'
 'smoothness error' 'compactness error' 'concavity error'
 'concave points error' 'symmetry error' 'fractal dimension error'
 'worst radius' 'worst texture' 'worst perimeter' 'worst area'
 'worst smoothness' 'worst compactness' 'worst concavity'
 'worst concave points' 'worst symmetry' 'worst fractal dimension']

데이터에 관한 더 자세한 정보는 cancer.DESCR에서 확인할 수 있습니다.

또 회귀 분석용 실제 데이터셋으로는 보스턴 주택가격Boston Housing 데이터셋을 사용하겠습니다. 이 데이터셋으로 할 작업은 범죄율, 찰스강 인접도, 고속도로 접근성 등의 정보를 이용해 1970년대 보스턴 주변의 주택 평균 가격을 예측하는 것입니다. 이 데이터셋에는 데이터 포인트 506개와 특성 13개가 있습니다.

In[9]:

from sklearn.datasets import load_boston
boston = load_boston()
print("데이터의 형태: {}".format(boston.data.shape))

Out[9]:

데이터의 형태: (506, 13)

이 데이터셋에서도 boston 객체의 DESCR 속성에서 더 자세한 정보를 확인할 수 있습니다. 이 데이터셋에서는 13개의 입력 특성뿐 아니라 특성끼리 곱하여(또는 상호작용이라 부름) 의도적으로 확장하겠습니다. 다시 말하면 범죄율과 고속도로 접근성의 개별 특성은 물론, 범죄율과 고속도로 접근성의 곱도 특성으로 생각한다는 뜻입니다. 이처럼 특성을 유도해내는 것을 특성 공학feature engineering이라고 하며 4장에서 자세하게 다루도록 하겠습니다. 유도된 데이터셋은 load_extended_boston 함수를 사용하여 불러들일 수 있습니다.

In[10]:

X, y = mglearn.datasets.load_extended_boston()
 print("X.shape: {}".format(X.shape))

Out[10]:

X.shape: (506, 104)

13개의 원래 특성에 13개에서 2개씩 (중복을 포함해) 짝지은 91개의 특성을 더해 총 104개가 됩니다. 2

여러 머신러닝 알고리즘의 특성들을 보여주고 설명하기 위해 이런 데이터셋들을 사용할 것입니다. 그럼 먼저 앞 장에서 본 k-최근접 이웃(k-NN) 알고리즘을 다시 살펴보겠습니다.


  1. 이 책에서 모든 매개변수와 옵션을 설명하지는 않습니다. 더 상세한 내용은 scikit-learn 문서(http://scikit-learn.org/stable/documentation)를 참고하세요.
  2. 첫 번째 특성으로 13개의 교차항이 만들어지고, 두 번째 특성에서 첫 번째 특성을 제외한 12개의 교차항이 만들어집니다. 그다음 세 번째 특성에서 11개가 되는 식입니다(13 + 12 + 11 + … + 1 = 91).
    옮긴이_ 중복을 고려하지 않은 이항 계수의 공식은 {n \choose k}=\frac{n!}{k!(n-k)!}입니다. 따라서 {13 \choose 2}=\frac{13!}{2!(13-2)!}=78이 됩니다. load_extend_boston 함수는 scikit-learn의 PolynomialFeatures 함수를 사용하여 중복을 포함한 조합을 만듭니다. 중복을 포함한 조합의 수를 구하는 공식은 ({n \choose k})={n+k-1 \choose k}이므로 ({13 \choose 2})={13+2-1 \choose 2}=\frac{14!}{2!(14-2)!}=91이 됩니다.

2.2 일반화, 과대적합, 과소적합 | 목차2.3.2 k-최근접 이웃

이 글은 한빛미디어에서 출간한  “파이썬 라이브러리를 활용한 머신러닝“의 1장과 2장입니다. 이 책의 저작권은 한빛미디어(주)에 있으므로 무단 복제 및 무단 전제를 금합니다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중