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 |
댓글