중학교 수학 시간에 일차함수를 배운 기억이 있을 거에요. y = ax + b (a는 직선의 기울기) 형태로 나타내는 일차함수를 x, y축에 그래프로 나타내면 일차적인 선형 관계를 나타내는 직선으로 표시됩니다.

일차함수 관계식을 알고 있다면, x값에 어떤 수를 대입하여 y값이 얼마인지 계산할 수 있습니다. 다시 말하면, 우리가 x값과 관계식을 알고 있는 상태에서 y값을 예측하는 것이 가능하다는 뜻입니다.

그렇다면, 머신러닝은 무엇일까요? 머신러닝은 기계(machine)가 학습(learning)한다는 뜻입니다. 컴퓨터는 일차함수 관계식을 알지 못하는 상태에서, x값과 대응되는 y값을 학습해서 두 변수 x, y 사이의 관계식을 찾습니다. x 변수의 값과 일차함수 관계식의 계수 a, b 위치에 다양한 후보값들을 대입하여 y 변수의 예측값을 계산합니다. y 예측값과 원래 y값의 오차가 가장 작을 때의 a, b 값을 찾아서, 일차함수 관계식인 y = ax + b를 완성합니다.

이처럼, 설명변수(x)와 목표변수(y)에 해당하는 데이터셋이 주어졌을 때 두 변수 사이의 관계식을 찾는 과정을 머신러닝에서 훈련(training)이라고 말합니다. 머신러닝을 이용하여 관계식을 찾고 나면, 새로운 데이터(x)에 대해서 목표값(y)을 찾을 수 있는데, 이 과정을 예측(prediction)이라고 합니다.

한편, 딥러닝은 머신러닝에 속하는 하위개념입니다. 딥러닝은 인간의 신경망을 본뜬 알고리즘을 사용하여 관계식을 찾는 머신러닝 방법이라고 생각하면 됩니다. 따라서, 학습하고 예측하는 과정은 머신러닝과 차이가 없습니다.

일차함수 관계식을 찾는 간단한 실습 예제를 통해서 머신러닝 개념을 이해합니다. 먼저, 데이터셋을 준비하는 과정부터 살펴 봅니다.

 

 

1. 먼저, x값 데이터를 만들겠습니다. -10부터 9까지 20개의 정수 배열을 만들고, 변수 x에 저장합니다.

 

import 명령을 사용하여 nupmy 라이브러리를 불러옵니다. "as np"는 numpy를 np라는 약칭으로 사용한다는 뜻입니다. arange 함수는 (범위 시작, 범위 끝, 숫자 간격) 순으로 인수를 입력받는데, 예제에서는 -10부터 10 사이의 숫자를 1 간격으로 생성합니다. 범위의 끝인 10은 제외되는 점에 유의합니다.

>>> import numpy as np
>>> x = np.arange(-10, 10, 1)
>>> x

array([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

 

2. x값과 일차함수 관계를 갖는 y값 데이터를 만듭니다. (일차함수 y = 2x - 1 사용)

x는 원소 20개를 갖는 배열입니다. 배열에 연산기호(* , -)를 적용하면, 20개 원소 각각에 대하여 연산이 적용됩니다. x 배열의 원소에 2를 곱하고 1을 뺀 결과값의 배열을 순서대로 변수 y에 저장합니다.

>>> y = 2*x - 1
>>> y

array([-21, -19, -17, -15, -13, -11, -9, -7, -5, -3, -1, 1, 3, 5, 7, 9, 11, 13, 15, 17])

 

3. x 배열, y 배열 값을 가지고 그래프를 그립니다.

matplotlib 라이브러리의 pyplot 모듈을 불러오는데, "as plt"는 plt라는 약칭을 사용한다는 뜻입니다. plot 메소드에 x, y 값을 순서대로 입력합니다.

>>> import matplotlib.pyplot as plt
>>> plt.plot(x, y)

 

4. 순서대로 정렬되어 있는 x 배열 원소값들의 순서를 무작위로 바꾸는 작업을 합니다.

x.shape[0]은 x 배열의 크기(원소의 개수)를 나타내는데, 원소 개수는 20개입니다. 대신, len 함수를 사용하여 len(x)로 입력해도 같은 결과를 보입니다.

numpy의 arange 함수에 자연수(양의 정수)를 입력하면, 숫자 0부터 입력된 자연수 갯수만큼의 숫자 배열이 만들어집니다. 예제에서 x.shape[0]은 20이므로, idx 변수에는 0, 1, 2, ..., 19까지 20개의 정수 배열이 저장됩니다.

numpy의 random 모듈은 무작위 추출 작업을 하는데 이용합니다. shuffle 함수를 이용하여 배열의 인덱스(주소)를 나타내는 idx 배열의 순서를 랜덤하게 섞어 줍니다. idx 배열 자체의 순서가 변동되는 점에 유의합니다.

>>> print("x 배열의 원소 개수: ", x.shape[0])
>>> idx = np.arange(x.shape[0])
>>> print("기존 인덱스:", idx)
>>> np.random.shuffle(idx)
>>> print("섞인 인덱스:", idx)

x 배열의 원소 개수: 20
기존 인덱스: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
섞인 인덱스: [11 18 15 9 7 16 8 19 3 4 12 6 2 1 13 0 10 14 17 5]

x[idx]와 같이 x 배열에 새로운 인덱스 배열을 입력하면 x 배열의 순서가 변경됩니다. y 배열에도 같은 인덱스 배열을 입력하면 x 값에 매칭되는 y 값이 순서대로 위치를 찾게 됩니다.

>>> x = x[idx]
>>> print ("x: ", x)
>>> y = y[idx]
>>> print ("y: ", y)

x: [ -1 5 2 -9 -2 4 -6 9 3 -10 -3 -4 6 1 -5 7 8 -7 -8 0]
y: [ -3 9 3 -19 -5 7 -13 17 5 -21 -7 -9 11 1 -11 13 15 -15 -17 -1]

 

5. 1차원 형태의 x 배열을 2차원 형태로 변환합니다.

일반적으로, 머신러닝 알고리즘에서 x 변수의 데이터 값 배열은 가로 방향으로 긴 형태가 아니라 세로 방향으로 긴 형태로 만듭니다. 따라서, x 배열의 형태를 다음과 같이 세로 형태로 변환합니다. 2차원 배열에서 세로 방향의 각 열은 하나의 설명변수(x)에 속하는 데이터 값들의 모임이라고 볼 수 있습니다.

20개의 원소를 갖는 x 배열에 reshape 메소드를 적용하여 배열의 모양을 바꿀 수 있습니다. (-1, 1)에서 왼쪽의 숫자는 행의 개수를 나타내고, 오른쪽의 숫자는 열의 개수를 나타냅니다. 따라서, 열의 개수는 1개가 됩니다. 다만, -1은 정해진 개수를 나타내지 않고, 원래 배열의 개수인 20과 남은 차원(여기서는 열의 개수)인 1로 정해진다는 뜻입니다. 20개의 원소를 1개의 열에 넣으려면 행의 개수는 20개가 되어야 합니다. 결론적으로, 20개의 행과 1개의 열을 가진 2차원 구조로 변환됩니다.

>>> x_new = x.reshape(-1,1)
>>> x_new

array([[ -1],
[ 5],
[ 2],
[ -9],
[ -2],
[ 4],
[ -6],
[ 9],
[ 3],
[-10],
[ -3],
[ -4],
[ 6],
[ 1],
[ -5],
[ 7],
[ 8],
[ -7],
[ -8],
[ 0]])

이것으로 머신러닝(딥러닝) 알고리즘에 입력할 수 있는 데이터셋의 형태를 만들었습니다. 다음 게시글에서는 이 데이터셋을 이용하여 실제로 머신러닝 라이브러리를 통해 훈련-예측하는 과정을 살펴보겠습니다.

+ Recent posts