신경망 이론 이해하기 – 1 ) perceptron

로보리포트 서비스에서는 부동산 가격 예측을 하기 위해 MLP (다층 신경망)을 사용합니다. 대표적인 기계 학습 알고리즘이라 생각해서 그동안 따로 설명을 하지 않았지만 신경망 알고리즘이 무엇이냐는 질문을 많이 받아서 최대한 쉽게 설명을 해볼까 합니다.

신경세포의 구조

신경망 알고리즘은 실제로 신경세포(뉴런, neuron)의 모양과 작동 방식을 따라 만들어졌습니다. 뉴런이 두개 이상 모이면 신경이 되며, 모든 뉴런은 수상돌기, 신경세포체, 축색돌기로 구성되어 있습니다. 뉴런의 구조는 아래 그림을 확인해주세요.

뉴런의 기본 기능은 자극을 받았을 경우 전기를 발생시켜 다른 세포에 정보를 전달하는 것으로 이렇게 발생하는 전기 신호를 활동전위(action potential)이라고 합니다.

뉴런에서 수상돌기로 입력받은 신호들의 강도의 합이 어느 설정치(threshold, 역치 값) 이상이면 축색돌기로 신호를 전달하고 이하면 전달(출력)하지 않습니다. 이렇게 전달된 축색돌기의 신호는 시냅스로 이어진 다른 뉴런들에게 전달되게 됩니다.

Perceptron

Perceptron은 위에 설명한 neuron의 구조를 그대로 본따서 만들어졌습니다.

neuron이 수상돌기에서 입력을 받는 부분은 perceptron에서는 X 값으로 표현되고, neuron의 세포체의 가중합은 X의 각 유닛과 연결된 연결 가중치의 곱의 합으로 표현되고, 마지막으로 임계치를 넘으면 신호를 전달하는 부분은 활성화 함수라고 하는 함수에 의하여 출력 값을 얻도록 표현되었습니다. (아래 표 참조)

 neuronperceptron
입력수상돌기에 들어온 입력들X
연결수상돌기로 입력받은 신호들의 강도의 합X의 각 유닛과 연결된 연결 가중치의 곱의 합
출력가중합이 threshold를 넘으면 축색으로 출력가중합을 활성화 함수에 입력하여 출력 값(a) 출력

그럼 perceptron의 실제 작동 방식을 확인해보겠습니다.

  1. input A의 값들은 각 unit(a1, a2, a3 …) 의 각자의 가중치(w1, w2, w3 … ) 값에 곱해져서 더해집니다. (weighted sum)
  2. 1의 값에 bias가 더해집니다.
  3. 이렇게 더해진 값은 활성화 함수(activation function)의 input값이 되서 최종 출력 값이 나오게 됩니다.

아래는 perceptron의 예시입니다.

input으로 티셔츠 이미지의 각 픽셀의 값이 들어가고 최종적으로 티셔츠의 색이 밝은 색인지, 어두운 색인지 판결하는 perceptron이 있다고 해보겠습니다. X 값과 weight를 더해서 나온 식의 값이 -0.1을 넘으면 밝은 색 (+1)으로 아니면 어두운 색(-1)이라고 분류하고 있습니다. 여기서 weight는 각 연결의 강도를 의미합니다.

X의 양수의 값들이 더해졌으니 당연히 예시로 들어온 티셔츠는 밝은 색으로 분류가 됩니다.

기계학습으로 클래스 예측을 한다는 것은 간단하게 말하자면 인스턴스들의 클래스를 구분짓는 선(decision boundary) 을 찾는 것입니다. perceptron은 linear combination을 f(x)로 사용하기 때문에 linear binary classifier 입니다.

위와 같이 직선으로 클래스를 구분할 수 있는 데이터라면 문제가 없지만 클래스가 뒤섞여 있을 때도 직선인 decision boundary를 사용할 수 밖에 없다는 한계가 존재합니다.

이런 perceptron의 한계점을 극복하기 위해 MLP(다층 신경망)이 나오게 됩니다. 다음 포스팅에서는 신경망의 훈련과정을 시각적으로 표현해주는 웹 사이트 소개에 이어서 MLP 설명이 들어가겠습니다.

Reference

https://towardsdatascience.com/what-the-hell-is-perceptron-626217814f53

sklearn에서 missing value 처리하기 ( by pandas)

sklearn 에서 missing value 처리하기

실험에서 사용하는 데이터의 속성 필드 값이 비어있을 때

아래와 같은 에러 메세지를 확인할 수 있다.

Input contains NaN, infinity or a value too large for dtype(‘float64’).

sckit-learn 알고리즘은 기본적으로

모든 데이터가 다 값을 가지고 있을 거라 간주하기 때문에

비어있는 값을 발견하면 에러 메세지를 내고 종료를 한다.

이럴 경우 두 가지 방법 중 하나를 선택할 수 있다.

  • 비어있는 값을 가지고 있는 데이터를 제거 하거나 (데이터의 양이 충분한 경우)
  • 비어있는 값을 다른 값으로 치완할 수 있다.  (데이터가 부족하거나 아니면 그 데이터를 사용해서 실험을 해야 하는 경우)

각각의 케이스에 대해 어떻게 처리를 하는지 하나씩 확인해보겠다.

비어있는 값을 가지고 있는 데이터를 제거하는 것은

pandas 패키지의 dropna() 함수를 사용하면 간단하다.

아래는 read_csv 함수를 사용해서 임의의 csv 데이터를 읽어와서

pandas 의 dataframe으로 저장 후

dropna()함수를 사용해 본 예시이다.

dropna()를 사용하면 하나의 속성이라도

비어있는  열이 있으면  모두 드랍한다.

예시에서 사용한 데이터에는 중간 중간 비어있는 예시들이 많아서

dropna()를 사용하니

하나도 남아있는 데이터가 없었다 ; – ;

그럼 조건을 완화해서 함수 인자로 how=’all’을 지정하면

모든 속성이 다 비워져있는 열들만 삭제를 할 수 있다.

또는 N/A 값을 가질 수 있는 최소 개수를 thresh 인자로 명기할 수도 있다.

예시에서는 빈 값을 가질 수 있는 필드를 최소 2개 로 설정해 보았다.

조건에 맞는 데이터들이 노출되는 것을 확인 할 수 있다.

마지막으로 빈 값을 검사하는 필드 이름도 subset 인자로 지정할 수 있다.

사실 비어있는 데이터를 포함하고 있는 것은 지가지수 속성이었기 때문에

전체적으로 빈 값이 리턴되고 있다.

이 외 자세한 내용은 아래 pandas 웹 페이지를 확인 할 수 있다.

다음 포스팅에서는 빈 값을  다른 값으로 대체하는 방법을 확인해보겠다.

참고:  https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html