본문 바로가기
컴퓨터/파이썬을 활용한 머신러닝 쿡북

2. 데이터 적재

by 하링아 2020. 7. 17.
반응형

2. 데이터 적재

- 머신러닝의 첫 번째 단계는 시스템으로 원본 데이터를 불러오는 것

- 원본 데이터는 로그 파일(log file) 또는 데이터셋, 데이터 베이스(database), 이외 여러 소스에서 데이터 추출.

 

- 이 장에서 CSV 파일, SQL 데이터베이스 등 다양한 소스에서 데이터 적재 방법 소개

- 실험에 필요한 특성을 가진 모의 데이터 생성 방법

 

- 외부 데이터를 적재할 때 사용하는 판다스(pandas) 라이브러리, 모의 데이터를 생성하는데 파이썬 오픈 소스 머신러닝 라이브러리 사이킷런(scikit-learn) 사용

 

샘플 데이터셋 적재하기

- 사이킷런에 포함된 데이터 셋 사용

# 사이킷런에서 데이터셋 불러옴
from sklearn import datasets

# 데이터셋에서 데이터 불러와서 features, target으로 할당 후 features의 첫번째 원소 확인
digits = datasets.load_digits()
features = digits.data
target = digits.target
features[0]
array([ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.,  0.,  0., 13., 15., 10.,
       15.,  5.,  0.,  0.,  3., 15.,  2.,  0., 11.,  8.,  0.,  0.,  4.,
       12.,  0.,  0.,  8.,  8.,  0.,  0.,  5.,  8.,  0.,  0.,  9.,  8.,
        0.,  0.,  4., 11.,  0.,  1., 12.,  7.,  0.,  0.,  2., 14.,  5.,
       10., 12.,  0.,  0.,  0.,  0.,  6., 13., 10.,  0.,  0.,  0.])

- 사이킷런에는 잘 정제되어 바로 적재 가능한 데이터셋이 있음

- 토이 데이터셋이라 부름

- load_boston : 보스턴 주택 가격 503개 샘플. 회귀 알고리즘 배울 때 사용

- load_iris : 150개 붓꽃 샘플 치수. 분류 알고리즘 배울 때 사용

- load_digits : 손으로 쓴 숫자 이미지 1979개. 이미지 분류 작업 배울 때 사용

 

- sklearn.datasets 모듈 아래 함수들은 파이썬 딕셔너리와 유사한 Bunch 클래스 객체 반환

# 딕셔너리의 키 반환
digits.keys()
dict_keys(['data', 'target', 'target_names', 'images', 'DESCR'])

#DESCR 키를 통해 데이터셋의 설명 확인
digits['DESCR'][:70]
.. _digits_dataset:\n\nOptical recognition of handwritten digits dataset

 

- 함수들의 매개변수 return_X_y를 True로 설정하면 Bunch 클래스가 아닌 특성 X와 타깃 y로 반환. 기본값은 False.

- load_digits의 경우 n_class 매개변수(필요한 숫자 개수 지정) 추가

import numpy as np

# return_X_y 매개변수를 True로 지정하여 특성 X와 타깃 y로 반환
X, y = datasets.load_digits(n_class=5, return_X_y = True)

# 타깃 y의 고유값 반환
np.unique(y)
array([0, 1, 2, 3, 4])

 

모의 데이터셋 만들기

- 사이킷런의 모의 데이터셋 만들기 위한 방법 대표적인 세 가지

 

- 선형 회귀에 사용할 데이터 셋 : make_regression 

# 라이브러리 임포트
from sklearn.datasets import make_regression

# make_regression을 사용하여 특성 행렬, 타깃, 회귀 계수를 얻는다.)
features, target, coefficients = make_regression(n_samples = 100,
                                                 n_features = 3,
                                                 n_informative = 3,
                                                 n_targets = 1,
                                                 noise = 0.0,
                                                 coef = True,
                                                 random_state = 1)
# make_regression의 매개변수들에 대한 설명
# n_smaples : 샘플의 개수
# n_features : 출력할 특성 행렬의 개수
# n_informative : 결과를 내기 위해 사용한 특성의 수, 이게 전체 특성 수보다 작으면 만들어진 데이터셋에 여분 특성이 있게 되고 특성 선택 기법을 사용해 구별해야 함
# n_targets : 출력할 타깃의 수
# noise : 가우시안 noise의 '표준 편차' 
# coef : True 지정시 회귀 계수를 출력
# random_state : 동일한 결과를 보기위한 랜덤 시드 조정

# 특성 과 타깃 벡터 출력
print("features\n", features[:3])
print("target\n", target[:3])
features
 [[ 1.29322588 -0.61736206 -0.11044703]
 [-2.793085    0.36633201  1.93752881]
 [ 0.80186103 -0.18656977  0.0465673 ]]
target vector
 [-10.37865986  25.5124503   19.67705609]

 

- 분류에 사용할 데이터 셋 : make_classification 

# 라이브러리 임포트
from sklearn.datasets import make_classification

# make_classification 이용하여 특성, 타깃 반환
features, target = make_classification(n_samples = 100,
                                       n_features = 3,
                                       n_informative = 3,
                                       n_redundant = 0,
                                       n_classes = 2,
                                       weights = [.25, .75],
                                       random_state = 1)
# make_classification 매개변수 (중복 제외)
# n_redundant : 중복 특성 개수 선택 (왜 필요한지 모르겠음)
# n_classes : classification 문제의 클래스 또는 레이블의 개수 
# weights : 각 클래스에 할당되는 샘플의 비율

# 특성과 타깃 출력
print("features\n", features[:3])
print("target\n", target[:3])  
features
 [[ 1.06354768 -1.42632219  1.02163151]
 [ 0.23156977  1.49535261  0.33251578]
 [ 0.15972951  0.83533515 -0.40869554]]
target
 [1 0 0]

 

- 군집에 적용할 데이터 셋 : make_blobs

# 라이브러리 임포트
from sklearn.datasets import make_blobs

# make_blobs를 이용하여 특성, 타깃 반환
features, target = make_blobs(n_samples = 100,
                              n_features = 2,
                              centers = 3,
                              cluster_std = 0.5,
                              shuffle = True,
                              random_state = 1)
# make_blobs 매개변수 설명(중복 제외)
# centers : 생성할 클러스터의 수 결정
# cluster_std : 군집 표준 편차
# shuffle : True면 샘플을 섞음

# 특성, 타깃 출력
print("features\n", features[:3])
print("target\n", target[:3])
features
 [[ -1.22685609   3.25572052]
 [ -9.57463218  -4.38310652]
 [-10.71976941  -4.20558148]]
target
 [0 1 1]

 

- matplotlib 그래프 라이브러리를 사용한 make_blobs 클러스터 시각화

# 시각화 라이브러리 임포트
import matplotlib.pyplot as plt
%matplotlib inline

# 산점도로 시각화
# 매개변수 c : target을 색깔별로 구분
plt.scatter(features[:, 0], features[:, 1], c = target)
plt.show()

 

CSV 파일 적재하기

- read_csv 사용

# 라이브러리 임포트
import pandas as pd

# url 불러오기
url = 'https://tinyurl.com/simulated-data'

# 데이터 적재
dataframe = pd.read_csv(url)

# 데이터 확인
dataframe.head()
	integer	datetime	category
0	5	2015-01-01 00:00:00	0
1	5	2015-01-01 00:00:01	0
2	9	2015-01-01 00:00:02	0
3	6	2015-01-01 00:00:03	0
4	6	2015-01-01 00:00:04	0

- csv 파일 적재 시 주의할 것 두 가지

1. 적재하기 전 파일 내용 확인 : 어떤 매개변수를 설정할지 도움됨

2. read_csv 함수의 매개변수 30개 넘음

- sep 매개변수 : 구분자 지정 가능

- header 매개변수로 제목 행이 몇 번째 줄인 지 지정 가능. 제목 행 없으면 header=None으로 설정

 

- header=None의 경우 names 매개변수로 제목 설정 가능. header 매개변수 기본값은 'infer'로 첫 번째 줄에서 제목 추출

- skiprows  매개변수 : 건너뛸 행의 개수

- nrows 매개변수 : 읽을 행의 개수

# 12번째 줄까지 생략하고 다음 한 줄 출력
dataframe = pd.read_csv(url, skiprows=range(1, 11), nrows=1)
dataframe
integer	datetime	category
0	5	2015-01-01 00:00:10	0

 

엑셀 파일 적재하기
# 라이브러리 임포트
import pandas as pd

# 데이터 url
url = 'https://tinyurl.com/simulated-excel'

# 데이터 적재
dataframe = pd.read_excel(url, sheet_name=0, header=1)

# 확인
dataframe.head()
5	2015-01-01 00:00:00	0
0	5	2015-01-01 00:00:01	0
1	9	2015-01-01 00:00:02	0
2	6	2015-01-01 00:00:03	0
3	6	2015-01-01 00:00:04	0
4	9	2015-01-01 00:00:05	0

- sheet 매개변수 : 시트 이름 문자열이나 시트 위치를 나타내는 정수 또는 이름이나 정수의 리스트도 입력 가능

 

- read_excel 함수 사용하려면 xlrd 패키지 필요

- conda install xlrd 또는 pip install xlrd 명령어 입력하여 xlrd 패키지 다운

 

JSON 파일 적재하기
# 라이브러리 임포트
import pandas as pd

# 데이터 url
url = 'https://tinyurl.com/simulated-json'

# 데이터 적재
dataframe = pd.read_json(url, orient='columns')

# 확인
dataframe.head()
integer	datetime	category
0	5	2015-01-01 00:00:00	0
1	5	2015-01-01 00:00:01	0
2	9	2015-01-01 00:00:02	0
3	6	2015-01-01 00:00:03	0
4	6	2015-01-01 00:00:04	0

- orient 매개변수 : json 파일이 어떤 구조인지 지정

- 어떤 구조인지는 실험을 통해서 확인해야 함

- 판다스는 구조화가 덜 된 json 데이터를 판다스 데이터 프레임으로 변환하는 json_normalize 함수 제공

 

- 각 값들에 대한 데이터 구조 의미

'column' : {열: {인덱스: 값, ...}, ...}

'split' : {"index": [인덱스, ...], "columns":[열, ...], "data":[값, ...]}

'record' : [{열: 값}, ..., {열: 값}

'index' : {인덱스: {열: 값, ...}, ...}

'values' : [값, ...]

 

SQL 데이터베이스로부터 잭재하기
# 라이브러리 임포트
import pandas as pd
from sqlalchemy import create_engine

# 데이터베이스에 연결
database_connection = create_engine('sqlite:///sample.db')

# 데이터 적재
dataframe = read_sql_query('SELECT * FROM data', database_connection)

# 확인
dataframe.head()

# 테이블의 전체 데이터.
dataframe = pd.read_sql_table('data', database_connection)
dataframe.head(2)

# 현재 코드의 데이터베이스에 문제가 있는 것으로 추정 data 테이블이 존재 x

- sql은 데이터베이스에서 데이터를 끌어오는 표준 언어

- SQLite 데이터베이스 엔진으로 연결하기 위해 create_engine 함수 사용

- pandas.read_sql_query 함수로 sql을 사용하여 데이터베이스에 질의, 데이터 적재

- sql은 따로 배울 것

 

- read_sql_query 사용하기 위해서 sqlalchemy 패키지 설치해야 함. 

conda install sqlalchemy 또는 pip install sqlalchemy 

- 테이블의 모든 행 가져오기는 read_sql_table 함수 사용

 

참고

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_regression.html

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_blobs.html

https://matplotlib.org/3.2.2/api/_as_gen/matplotlib.pyplot.scatter.html

 

 

반응형

'컴퓨터 > 파이썬을 활용한 머신러닝 쿡북' 카테고리의 다른 글

1. 벡터, 행렬, 배열  (1) 2020.06.23
21. 훈련된 모델 저장과 복원  (2) 2020.06.19
18. 나이브 베이즈  (0) 2020.06.19

댓글0