Machine Learning 54

12. 서포트 벡터 머신 - 선형 SVM 분류

서포트 벡터 머신(SVM)은 매우 강력하고 선형이나 비선형 분류, 회귀, 이상치 탐색에도 사용할 수 있는 다목적 머신러닝 모델이다. SVM은 특히 복잡한 분류 문제에 잘 들어맞으며 작거나 중간 크기의 데이터셋에 적합하다. 다음 그림은 앞에서 소개한 붓꽃 데이터셋의 일부를 나타냈다. 두 클래스가 직선으로 확실히 잘 나뉘어 있다. 왼쪽 두 선은 분류를 잘 할 수 있지만 결정 경계가 샘플에 너무 가까워 새로운 샘플에 대해서는 아마 잘 작동하지 못할 것이다. 오른쪽 그래프에 있는 실선은 SVM 분류기의 결정 경계이다. 이 직선은 두 개의 클래스를 나누고 있을 뿐만 아니라 제일 가까운 훈련 샘플로부터 가능한 멀리 떨어져 있다. SVM 분류기를 클래스 사이에 가장 폭이 넓은 도로를 찾는 것으로 생각할 수 있다. 그..

11. 모델 훈련 - 로지스틱 회귀

어떤 회귀 알고리즘은 분류에서도 사용할수 있다. 로지스틱 회귀는 샘플이 특정 클래스에 속할 확률을 추정하는 데 널리 사용된다. 추정 확률이 50%가 넘으면 모델은 그 샘플이 해당 클래스에 속한다고 예측한다. (즉, 레이블이 '1'인 양성 클래스). 아니면 클래스에 속하지 않는다고 예측한다(즉, 레이블이 '0'인 음성 클래스). 이를 이진 분류기라고 한다. 선형 회귀 모델과 같이 로지스틱 회귀 모델은 입력 특성의 가중치 합을 계산한다.(그리고 편향을 더한다). 대신 선형 회귀처럼 바로 결과를 출력하지 않고 결과값의 로지스틱을 출력한다. 로지스틱 회귀를 설명하기 위해 붓꽃 데이터셋을 사용하겠다. 이 데이터셋은 세 개의 품종 Iris-setosa, Iris-Versicolor, Iris-Virginica에 속..

10. 모델훈련 - 규제가 있는 선형 모델

과대적합을 감소시키는 좋은 방법은 모델을 규제하는 것이다. 다항 회귀 모델을 규제하는 간단한 방법은 다항식의 차수를 감소시키는 것이다. 선형 회귀 모델에서는 보통 모델의 가중치를 제한함으로써 규제를 가한다. 각기 다른 방법으로 가중치를 제한하는 '릿지'회귀, '라쏘'회귀, 엘라스틱넷을 살펴보겠다. 릿지 회귀는 규제가 추가된 선형 회귀 버전이다. 규제항이 비용함수에 추가된다. 다음 그림은 선형 데이터에 몇 가지 다른 a를 사용해 릿지 모델을 훈련시킨 결과이다. a를 증가시킬수록 직선에 가까워지는 것을 볼 수 있다. 즉, 모델의 분산을 줄지만 편향은 커지게 된다. from sklearn.linear_model import Ridge ridge_reg=Ridge(alpha=1,solver='cholesky')..

9. 모델 훈련 - 학습 곡선

고차 다항 회귀를 적용하면 보통의 선형 회귀에서보다 훨씬 더 훈련 데이터에 잘 맞추려 할 것이다. 다음 그림은 300차 다항 회귀 모델을 이전의 훈련 데이터에 적용한 것이다. 단순한 선형 모델이나 2차 모델(2차 다항 회귀 모델)과 결과를 비교해보자. 300차 다항 회귀 모델은 훈련 샘플에 가능한 한 가까이 가려고 구불구불하게 나타난다. 이 고차 다항 회귀 모델은 심각하게 훈련 데이터에 과대적합되었다. 반면에 선형 모델은 과소적합이다. 이 경우 가장 일반화가 잘된 모델은 2차 다항 회귀이다. 일반적으로는 어떤 함수로 데이터가 생성됐는지 알 수 없다. 그러면 얼마나 복잡한 모델을 사용할지 어떻게 결정할 수 있을까? 어떻게 모델이 데이터에 과대적합 또는 과소적합되었는지 알 수 있을까? 훈련 데이터에서는 성능..

8. 모델훈련 - 다항 회귀

가지고 있는 데이터가 단순한 직선보다 복잡한 형태라면 어떨까? 비선형 데이터를 학습하는 데 선형 모델을 사용할 수 있다. 이렇게 하는 간단한 방법은 각 특성의 거듭제곱을 새로운 특성으로 추가하고, 이 확장된 특성을 포함한 데이터셋에 선형 모델을 훈련시키는 것이다. 이런 기법을 다항 회귀(polynominal regression)이라고 한다. 먼저 간단한 2차방정식으로 비선형 데이터를 생성해보자. m=100 X=6*np.random.rand(m,1) - 3 y=0.5 * X**2 + X + 2 + np.random.randn(m,1) 직선은 이 데이터에 잘 맞지 않을 것이다. 그러므로 사이킷런의 PolynomialFeatures를 사용해 훈련 데이터를 변환해보자. 훈련 세트에 있는 각 특성을 제곱(2차 다..

7. 모델훈련 - 경사하강법

경사 하강법(gradient descent, GD)는 여러 종류의 문제에서 최적의 해법을 찾을 수 있는 일반적인 최적화 알고리즘이다. 경사 하강법의 기본 아이디어는 비용 함수를 최소화하기 위해 반복해서 파라미터를 조정해가는 것이다. 경사 하강법에서 중요한 파라미터는 스텝의 크기로, 학습률(learning rate)하이퍼 파라미터로 결정된다. 학습률이 너무 작으면 알고리즘이 수렴하기 위해 반복을 많이 진행해야 하므로 시간이 오래 걸린다. 아래 그림은 경사 하강법의 두가지 문제점을 보여준다. 무작위 초기화 때문에 알고리즘이 왼쪽에서 시작하면 전역 최솟값(global minimum) 보다 덜 좋은 지역 최솟값(local minimum)에 수렴한다. 알고리즘이 오른쪽에서 시작하면 평탄한 지역을 지나기 위해 시간..

6. 모델훈련 - 선형 회귀

일반적으로 선형 모델은 다음 식 처럼 입력 특성의 가중치 합과 편향(bias)(또는 절편)이라는 상수를 더해 예측을 만든다. 이 식은 벡터 형태로 더 간단하게 쓸 수 있다. 훈련 세트 X에 대한 선형 회귀 가설 h(세타)의 MSE는 다음 식 처럼 계산한다. 비용 함수를 최소화하는 세타값을 찾기 위한 해석적인 방법이 있다. 이를 정규방정식 이라고 한다. 이 공식을 테스트하기 위해 선형처럼 보이는 데이터를 생성해보자. import numpy as np import matplotlib.pyplot as plt X=2*np.random.rand(100,1) y=4+3*X+np.random.randn(100,1) X_b=np.c_[np.ones((100,1)),X] #모든 샘플에 x0=1을 추가한다. theta_..

5. 머신러닝 프로젝트 - 머신러닝 알고리즘을 위한 데이터 준비

이제 머신러닝 알고리즘을 위해 데이터를 준비할 차례이다. 이 작업은 수동으로 하는 대신 함수를 만들어 자동화해야 하는 이유가 있다. 예측 변수와 타깃값에 같은 변형을 적용하지 않기 위해 예측 변수와 레이블을 분리한다. (drop()은 데이터 복사본을 만들며 strat_train_set에는 영향을 주지 않는다) housing=strat_train_set.drop('median_house_value',axis=1) # median_house_value 를 뺀 데이터 housing_labels=strat_train_set['median_house_value'].copy() # median_house_value 데이터만 추출 대부분의 머신러닝 알고리즘은 누락된 특성을 다루지 못한다. 이를 고치는 방법에는 세 가..

4. 머신러닝 프로젝트 - 데이터 이해를 위한 탐색과 시각화

먼저 테스트 세트를 떼어놓았는지 확인하고 훈련 세트에 대해서만 탐색을 한다. 훈련 세트를 손상시키지 않기 위해 복사본을 만들어 사용한다. housing=strat_train_set.copy() 지리 정보(위도와 경도)가 있으니 모든 구역을 산점도로 만들어 데이터를 시각화하는 것은 좋은 생각이다. # housing.plot(kind='scatter',x='longitude',y='latitude') plt.scatter(housing['longitude'],housing['latitude']) 이 그림은 캘리포니아 지역을 잘 나타내지만 어떤 특별한 패턴을 찾기는 힘들다. alph 옵션을 0.1로 주면 데이터 포인트가 밀집된 영역을 잘 보여준다. housing.plot(kind='scatter',x='lon..

3- 머신러닝 프로젝트 - 데이터 가져오기

import os import tarfile import urllib.request DOWNLOAD_ROOT = "https://raw.githubusercontent.com/rickiepark/handson-ml2/master/" HOUSING_PATH = os.path.join("datasets", "housing") HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz" # 압축파일 다운 def fetch_housing_data(housing_url=HOUSING_URL, housing_path=HOUSING_PATH): if not os.path.isdir(housing_path): os.makedirs(housing_path) tgz_path..