반응형
파이썬 사이킷런으로 손글씨 숫자 인식 데이터셋 다루기
파이썬에서 손글씨 숫자 인식 데이터셋인 MNIST를 불러오고
데이터를 몇개 뽑아 숫자 글씨의 상태를 시각화해보는 예제를 살펴보도록 하겠습니다.
MNIST 데이터셋 로드
MNIST의 각 데이터는 28 * 28 픽셀(총 784개)의 각 위치에
0~255 사이의 정수 값이 저장된 형태입니다.
MNIST 전체는 총 7만 장의 사진으로 구성되어 있기에 따라서 데이터프레임으로 불러오게 된다면
행이 7만개이고, 열이 784개로 이루어진 형태를 나타내게 됩니다.
파이썬에서는 sklearn의 fetch_openml 함수로 아래처럼 mnist 데이터를 불러올 수 있습니다.
(데이터셋을 불러오는 데에는 수 분 가량이 소요될 수도 있습니다.)
from sklearn.datasets import fetch_openml
import pandas as pd
mnist = fetch_openml('mnist_784')
df = mnist.data
df
이제 각 데이터가 0~9의 손글씨 숫자 중 어느 숫자였는지에 대한 라벨 정보를
가져와야 합니다. 이는 위에서 불러온 mnist 객체의 target 속성으로 불러올 수 있으며,
데이터프레임의 마지막 열에 라벨 정보를 추가하는 코드와 실행 결과는 다음과 같습니다.
# 라벨 정보 가져와서 새로운 열에 추가
df['label'] = mnist.target
df
반응형
MNIST 시각화
matplotlib 라이브러리를 이용하여 데이터 일부를 뽑은 뒤,
픽셀 값에 따른 시각화를 진행해볼 수 있습니다.
데이터 10개를 랜덤으로 선별하여 라벨과 픽셀을 시각화한 예시는 아래와 같습니다.
각 줄의 코드에 대한 상세 설명은 주석을 참고해주세요.
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.pyplot import style
# 0~69999 숫자 중 랜덤으로 10개 선별(인덱스 기준)
random_idx = np.random.choice(70000, 10)
# 흰색 배경 및 크기 지정
style.use('default')
figure = plt.figure()
figure.set_size_inches(10, 4)
# 시각화를 위한 label column 제외
columns_list = list(df.columns)
columns_list.remove('label')
# 흑백으로 출력하기 위한 스타일 설정
style.use('grayscale')
# 2 * 5 사이즈의 격자 설정
axes = []
for i in range(1, 11):
axes.append(figure.add_subplot(2, 5, i))
num_list = []
for i in range(10):
num = df.loc[random_idx[i], columns_list] # 랜덤으로 선별된 인덱스 위치에 해당하는 픽셀 정보 가져오기
num = np.array(num).reshape(-1, 28).astype(int) # 픽셀값을 28 * 28 사이즈로 바꾸고 정수형 변환 진행
num_list.append(num)
for i in range(10):
axes[i].matshow(num_list[i]) # 10개 숫자 차례대로 시각화
axes[i].set_axis_off() # x축, y축 눈금 제거