사이킷런 머신러닝 패키지로 널리 사용된다. Numpy, Scipy와 상호 운용되도록 설계되었다. 사이킷런의 경사 하강법이 구현된 클래스는 SGDClassifier이다. 이 SGDClassifier를 이용하여 로지스틱 회귀 문제를 해결해 보자. 사이킷런으로 경사 하강법 적용 로지스틱 손실 함수 지정 sgd = SGDClassifier(loss = 'log', max_iter=100, tol=1e-3, random_state=42) loss를 'log'로 지정한다. max_iter는 반복 횟수를 나타내는 매개변수로 100번 반복한다. random_state를 통해 난수 초깃값을 42로 설정한다. tol은 반복할 때 로지스틱 손실 함수의 값이 변경되는 정도를 컨트롤한다. 만약 tol에 설정한 값보다 적게 변경..
머신러닝
일반적인 신경망 일반적으로 신경망은 다음과 같이 표현된다. 가장 외쪽이 입력층, 가장 오른쪽이 출력층 그리고 가운데 층들은 은닉층이라고 부른다. 오른쪽에 작은 원은 활성화 함수이다. 단일층은 은닉층이 없이 입력층 출력 층만 존재하는 모델이라 생각하면 된다. 단일층의 모델은 다음과 같다. 앞에서 구현한 LogisticNeruon을 조금 변형하여 단일층 신경망을 만들어 보자. 손실 함수 결과 저장 변수를 추가하여 손실 함수의 결과값을 저장할 리스트 self.losses를 만든다. 샘플마다 손실 함수를 계산하고 평균을 내어 저장한다. 하지만 np.log( )계산을 위해 한번 더 조정해야 한다. a가 0에 가까워지면 -∞에 가까워지고, 1에 가까워 지면 0에 가까워지기 때문에 np.clip( )를 이용해 조정한..
로지스틱 회귀 뉴런 만들기 우선 __init__(), forpass(), backprop()은 앞서 만든 뉴런과 별로 다르지 않다. class LogisticNeuron: def __int__(self): self.w = None self.b = None def forpass(self, x): z = np.sum(x * self.x) + self.b return z def backprop(self, x, err): w_grad = x * err b_grad = 1 * err return w_grad, b_grad forpass에서 np.sum은 numpy모듈에서 sum이라는 메서드를 이용하여 가중치와 입력의 곱을 더하는 것이다. 훈련 활성화 함수라는 것이 추가되었기 때문에 fit()함수를 조정해야 한다...
로지스틱 손실 함수 로지스틱 손실 함수는 다중 분류를 위한 손실 함수인 크로스 엔트로피(cross entropy) 손실 함수를 이진 분류 버전으로 만든 것이다. a를 활성화 함수가 출력한 값이고 y는 타깃이라 하자. L = -( y * log(a) + (1 - y) * log(1-a)) 그렇다(1), 아니다(0)라는 식으로 2개의 정답만 있기 때문에 왼쪽과 오른쪽이 반대가 되는 상황입니다. 식을 최소로 만들다 보면 a의 값이 우리가 원하는 목표치가 된다. 이제 가중치와 절편을 찾기 위해 미분만 하면 된다. 로지스틱 손실 함수 미분하기 로지스틱 손실 함수를 미분하면 다음과 같다. 함수를 기울기(가중치)와 절편에 대해 편미분을 진행하면 다음 식이 나온다. 이 식을 자세히 보면 앞에서 사용한 제곱 오차를 미분..
시그모이드 역할 z = b + ∑ w_i x_i로 표현할 수 있다. z는 활성화 함수를 통과하여 a가 된다. 이때 시그모이드 함수는 z를 0~1 사이의 확률 값으로 변환시켜준다. 시그모이드 함수는 오즈비 → 로짓 함수 → 시그모이드 함수를 거쳐 탄생한다. 오즈비 오즈 비는 성공확률과 실패 확률의 비율을 나타내는 통계이다. 오즈 비를 그래프로 그리면 다음과 같다. 성공 확률이 0부터 1까지 증가할 때 오즈 비의 값은 처음에는 천천히 증가하지만 1에 가까워지면 급격히 증가한다. 로짓 함수 오즈 비에 로그 함수를 취하여 만든 함수를 로짓 함수라고 한다. 로짓 함수는 p가 0.5일 때 0 이되고 p가 0과 1일 때 각각 무한대로 음수와 양수가 된다. 이제부터 logit(p)를 z라 하자 로지스틱 함수 위 식을 ..
로지스틱 회귀를 제대로 이해하기 위해서는 먼저 알아볼 개념이 몇 가지 있다. 그중 하나는 퍼셉트론이다. 퍼셉트론이란? 1957년 코넬 항공 연구소의 프랑크 로젠블라트는 이진 분류 문제에서 최적의 가중치를 학습하는 알고리즘을 발표했다 이것이 퍼셉트론이다. 선형 회귀와 유사하게 직선 방정식을 사용한다. 하지만 퍼셉트론은 마지막 단 게에서 샘플을 이진 분류하기 위하여 계단 함수를 사용한다. 계단 함수를 통과한 값을 다시 가중치와 절편을 업데이트하는 데 사용한다. 위 구조를 방정식으로 표현하면 w1x1 + w2x2 + b = z이다. z가 0보다 크거나 같으면 1로, 0보다 작으면 -1로 분류한다. 이때 1로 분류되는 걸 양성 클래스, -1을 음성 클래스라고 한다. 아달린 퍼셉트론에서 조금 더 개선한 적응형 선..
뉴런 만들기 딥러닝은 뇌에 있는 뉴런을 따라한 것이다. 앞서 공부한 내용으로 뉴런을 만들어 보면 더욱 이해가 빠를 것이다. 생성자 우선, 생성자에서 필요한 변수를 선언하고 초기화한다. def __init__(self): self.w = 1.0 self.b = 1.0 여기서 1.0은 임의로 선정한 수이다. 다른 수여도 아무런 문제가 없다. 정방향 계산 정방향 계산은 예측값을 계산하는 과정이라 생각해도 된다. 즉, 기울기와 절편을 예측하는 것이다. def forpass(self, x): y_hat = x * self.w + slef.b#직선 방정식 계산 return y_hat y = wx + b라는 식을 이용하여 y_hat을 구하는 과정이라 생각하면 된다. 그럼 이제 w와 b를 적절히 조정하여 올바른 모델을..
손실 함수란? 손실 함수는 쉽게 말해 예상한 값과 실제 타깃 값의 차이를 함수로 정의한 것을 말한다. 그 중 하나인 제곱 오차로 이해해보자. 제곱 오차 제곱 오차는 타깃값과 예측값을 뺀 다음 제곱한 것이다. SE = (y - k)^2 그럼 이 함수의 기울기를 구하려면 제곱 오차를 가중치나 절편에 대해 미분하면 된다. 기울기를 구하는 이유는 기울기를 알면 최솟값을 구할 수 있기 때문이다. SE를 w에 대해 편미분을 진행한다면, -(y - k)x라는 값을 구할 수 있다. 손실 함수를 최소화 시키기 위해서는 저 값을 빼면 된다. w = w + (y - k)x 이 형태는 저번 포스트에 작성한 (w + w_rate * err)와 같은 형태이다. 절편도 동일하게 시행한다. 그러면 -(y - k)1이란 값을 구할 수..
경사 하강법이란? 저번 포스트에서 선형 회귀를 다루었다. 데이터에 가장 적합한 함수를 그려나갈 때 어떻게 데이터에 맞춰 나가며 그릴 것인가? 그에 대한 답 중 하나가 경사 하강법이다. 경사 하강법 적용 y = ax + b라는 식이 있다. 이 식을 데이터에 맞는 식으로 바꾸기 위해서는 a, b를 조정해야 한다. 우선 a, b를 임의의 값으로 초기화한다. 나는 모두 1이라 하겠다. a = 1.0 b = 1.0 첫 데이터를 x에 입력한다면 y값을 예측할 수 있다. (예측값 y를 k라 하자) 그다음 우리는 k와 y(실제 답)을 비교하여 얼마나 잘 예측했나 판단할 수 있다. 내가 임의로 초기화한 값이 바로 들어맞을 확률은 거의 0%라고 생각한다. 그럼 이제 a와 b값을 조정하여 더 잘 맞추는 모델을 만들어 보자...
데이터 불러오기(with pandas) import pandas as pd 데이터를 다루는데 유용한 기능을 제공하는 모듈이다. # save filepath to variable for easier access melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv' # read the data and store data in DataFrame titled melbourne_data melbourne_data = pd.read_csv(melbourne_file_path) # print a summary of the data in Melbourne data melbourne_data.describe() 이런 식으로 path를 지정하고..