본문 바로가기
Data Science/머신러닝 기초

머신러닝 기초 (1) - 데이터 이해하기

by 싸코 2018. 1. 19.

가천대 최성철 교수님의 '밑바닥부터 시작하는 머신러닝 입문'을 수강하며 노트 필기를 목적으로 포스팅합니다.


예전에 심심해서 유투브에서 우연히 파이썬을 가르치시는 동영상을 봤는데 핵심적인 꼭 필요한 내용들을 쉽게 전달하는 것을 보고 관심을 갖고 있다가 또 우연히(!) 와디즈에서 크라우드 펀딩으로 강좌를 여는 것을 보고 바로 지르게 되었습니다... 복습할 목적으로 강의를 들으면서 다시 보고 싶은 내용을 정리하려고 합니다.


아직까지는 크게 배우는 내용이없어서 조금씩 정리하고 싶은 내용만 정리할 것 같습니다.


Chapter 2. An Understanding of Data

머신러닝 기초(1) - 데이터 이해하기


데이터의 타입에 따라서 문제가 생길 수 있는데...

데이터의 최대/최수가 달라 scale에 따라서 y 값에 영향을 주는 정도가 달라질 수 있습니다. 이말은 데이터의 scale을 맞춰줄 필요가 있다는 이야기입니다. 서로 다른 데이터 scale을 사용하면 그만큼 y 값이 영향을 받는 정도가 달라지기 때문입니다. 이는 인공신경망에서 상당히 중요하게 다루는 내용입니다. 파이썬에서는 standardization, min_max scaling 등으로 sikit-learn에서 이를 쉽게 해주는 것들이  


ordinary 및 nominal 값의 표현은 어떻게 해야할까... categorical 변수인데 이를 숫자로 표현된다고 해서 그게 어떤 numerical 타입은 아니며 따라서 get_dummy() 등을 사용하여 더미변수 형식으로 범주형을 표현할 수 있도록 해야할 것입니다.


또는 잘못 기입된 값들을 어떻게 처리할 것이고 값이 없는 결측치에 대해서는 어떻게 처리해야할지 단순히 그냥 제거하는게 맞는건지 다른 값으로 대체한다면 어떻게 대체해야 할 것인지 그런 고민들이 모여야 합니다.


또한 이상치라고 불리는 극단적으로 큰 값이나 작은 값들은 어떻게 처리해야할지... 회귀분석 같은 이상치에 민감한 알고리즘을 사용하게 되면 모델의 정확도가 많이 떨어질 수 있는데 이럴 때는 이상치들을 제거하고 모델을 학습할 수도 있습니다.


데이터 타입에 따른 데이터 전처리 문제는 너무나 중요하며 전통적인 머신러닝 영역에서는 변수(feature)의 선정 및 구성 등이 매우 중요한 이슈입니다. 딥러닝에서는 이러한 feature에 대한 작업이 덜 필요해지는데 데이터 자체로부터 feature를 학습시켜 패턴을 만들게 하기 때문에 조금 덜 중요해집니다.



데이터베이스에 대해서 알면 feature 별 데이터 유형에 대해서 아는 것처럼 말씀하시는데 이는 데이터 모델링을 하고 데이터베이스를 구축하거나 retrieval 하기 위해서는 데이터 자체에 대한 공부를 많이 하게 됩니다. 기본적인 자료구조를 익히게 되고 데이터의 타입등을 공부하며 데이터의 크기 등에 대한 고민을 하기도 합니다.


데이터 분석의 기본적인 재료가 되는 데이터 자체에 대한 충분한 고민이 많이 되어야 좋은 분석이 많이 되는 것 같습니다. 그만큼 데이터 타입에 대한 이해와 데이터 수집의 이해, 자료 구조에 대한 이해가 높다면 그만큼 풍부한 데이터 분석이 될 수 있고 아는 만큼 설명하기가 용이해집니다. Kaggle의 우승자들의 코드를 보면 데이터를 충분히 이해하고 데이터를 변형하고 만져보며 모델의 성능을 높이기도 합니다.


또 한 례로, MNIST 데이터의 숫자 인식을 높이기 위해 이미지의 각도를 조금씩 조절해서 학습 데이터로 사용하는 것만으로도 성능 상승의 효과를 보이는 사례를 봤을 때 이러한 발상을 하는 중에는 데이터에 대한 이해가 많은 영향을 미치는 것 같습니다.




Pandas로 데이터 불러오기

pandas는 데이터를 쉽게 읽고 처리하기 좋은 파이썬 라이브러리입니다. R에서는 dplyr이 pandas와 비슷한 기능을 제공해줍니다. RDB를 생각하고 pandas를 다루면 편합니다. Pandas에 대한 포스팅은 "파이썬으로 데이터 분석하자"에서 관련된 내용을 제공하고 있습니다.

import pandas as pd
data_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data' #Data URL
df_data = pd.read_csv(data_url, sep='\s+', header=None)
df_data.head()
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 0.00632 18.0 2.31 0 0.538 6.575 65.2 4.0900 1 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 0 0.469 6.421 78.9 4.9671 2 242.0 17.8 396.90 9.14 21.6
2 0.02729 0.0 7.07 0 0.469 7.185 61.1 4.9671 2 242.0 17.8 392.83 4.03 34.7
3 0.03237 0.0 2.18 0 0.458 6.998 45.8 6.0622 3 222.0 18.7 394.63 2.94 33.4
4 0.06905 0.0 2.18 0 0.458 7.147 54.2 6.0622 3 222.0 18.7 396.90 5.33 36.2
df_data.columns = ['CRIM','ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO' ,'B', 'LSTAT', 'MEDV'] 
# Column Header 이름 지정
df_data.head()
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT MEDV
0 0.00632 18.0 2.31 0 0.538 6.575 65.2 4.0900 1 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 0 0.469 6.421 78.9 4.9671 2 242.0 17.8 396.90 9.14 21.6
2 0.02729 0.0 7.07 0 0.469 7.185 61.1 4.9671 2 242.0 17.8 392.83 4.03 34.7
3 0.03237 0.0 2.18 0 0.458 6.998 45.8 6.0622 3 222.0 18.7 394.63 2.94 33.4
4 0.06905 0.0 2.18 0 0.458 7.147 54.2 6.0622 3 222.0 18.7 396.90 5.33 36.2

 



NumPy로 모델 표현하기

다른 포스팅에서도 밝혔지만 NumPy는 파이썬에서 데이터를 Array로 다룰 수 있도록 해주며 벡터 연산을 가능하게 해주고 고성능을 자랑하는 파이썬의 필수 라이브러리입니다.

NumPy가 딥러닝의 프레임워크에서도 표준이 되는데 특히 Broadcasting 기능의 지원은 다차원 배열(벡터) 간의 연산을 쉽게 해주기 때문이라고 볼 수 있습니다. "파이썬으로 데이터 분석하자"에서 이에 대한 내용을 다루고 있습니다.


import numpy as np
weight_vector = np.array([[1], [1], [1]])
x_vector = np.array([[3], [4], [5]])

dot product가 numpy의 연산 메소드로 아주 쉽게 계산된다. 행렬의 내적이라고 부른다.

weight_vector.T.dot(x_vector)
array([[12]])

T는 Transpose의 약자 형태로 column 벡터를 row 벡터로, row 벡터를 column 벡터로 변경해준다.

df_matrix = df_data.as_matrix()
weight_vector = np.random.random_sample((14,1))
print(df_matrix.shape)
print(weight_vector.shape)
print(df_matrix.dot(weight_vector).shape)
(506, 14)
(14, 1)
(506, 1)

행렬의 내적은 (a,b) * (c,d) = (a,d) 로 결과가 나오며, 이 때 b = c 이어야 한다.




보충자료: Linear Algebra 선형대수


선형대수에 대해서 위의 포스팅을 참조하시면 좋습니다.

선형대수...를 모르면 머신러닝이 매우 어렵습니다... 딥러닝에서는 더더욱... 그래서 고등학교 행렬이나마 빠르게 공부해서 그나마 기초적인 내용들은 어느정도 따라갈 수 있었던 기억이 납니다.

선형대수는 간단하게는 벡터 또는 행렬이라고 말할 수 있습니다. 여기서 선형이라 함은 직선 또는 그와 비슷한 성질을 가진 대상을 말하는데 1차함수 형태를 가지고 있어 선형성을 보입니다. "문과생을 위한 딥러닝 수학" 1차함수 형태에 대해서 확인하실 수 있습니다. 다항식도 1차식의 형태라면 선형성을 보입니다.

대수학은 문자를 사용한다고 간단하게 볼 수 있습니다. 따라서 선형대수는 선형으로 된 방정식에 대해서 대수(x, y ..)를 사용하는 것이라고 보시면 됩니다.

이 선형대수는 주로 벡터 또는 행렬의 형태로 많이 표현됩니다. 벡터는 파이썬에 리스트라고 아주 간단하게(?) 생각할 수 있는데 벡터가 순서와 방향을 가진다는 점에서... 파이썬 리스트도 인덱스(순서)가 그리고 오른쪽으로 인덱스가 커진다는 점(방향)에서 그렇게 볼 수 있지 않을까 싶습니다.

Vector

Vector는
n-dimensional column vector [[a],[b],[c]]
n-dimensional row vector [a, b, c]
가 있습니다.


Matrix

m by n (m x n)으로 주료 표현되는 격자 형태를 행렬이라고 합니다. 행렬은 말 그대로 행과 열을 표현합니다. numpy의 array의 shape가 (m, n)이라면 행이 m개, 열이 n개인 행렬이라고 보시면 됩니다.



강의를 듣다보면 이런 걸 안배워서 깜짝 깜짝 놀라신다고 하는데...  저같은 문과 출신들은 잘 모릅니다... 그리고 수학을 공부한지도 오래 돼서 배운 것도 가물가물합니다...ㅠㅜ



댓글