본문 바로가기
Programming (프로그래밍)/Python

[머신러닝] sklearn.datasets에서 mnist_784 데이터 다운로드가 안될 때 (데이터 값이 0일 때)

by 김조이1 2022. 3. 14.
728x90

[핸즈온 머신러닝 2판 - 3장 분류] 실습 초반부터 오류가 발생해서 얼른 해결 방법을 찾아보았다.

 

그 전에 MNIST는 고등학생과 미국 인구조사국 직원들이 손으로 쓴 70,000개의 작은 숫자 이미지를 모은 데이터셋이다. 이 데이터셋은 자바의 "Hello, World"와 같은 입문자라면 누구나 한번쯤은 봤을 데이터셋이라고 한다.

 

책에서는 사이킷런 라이브러리에 있는 MNIST 데이터셋을 코드를 통해 직접 다운로드 하는 방식으로 되어있고 코드는 아래와 같다. 

from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1)

그리고, 아래 코드를 참고해서 데이터셋의 구조를 확인하는 실습까지 진행했다. 

mnist.keys()

X, y = mnist["data"], mnist["target"]

X.shape
y.shape

MNIST는 딕셔너리 구조로 되어 있고 아래와 같이 여러 개의 키로 되어 있다. (데이터셋을 설명하는 DESCR, 샘플 Data, 레이블 배열 target 등) 키값을 알아보고 싶으면 mnist.keys()라고 코드를 입력하면 된다. 

 

X.shape의 결과 값은 (70000, 784)로 나오는데 이는 이미지가 70,000개 있고 각 이미지에는 784개의 특성을 가지고 있다는 뜻이다. 데이터셋은 숫자로 되어 있기 때문에 matplotlib 라이브러리를 활용해서 이미지화하여 확인해볼 수 있다. 

import matplotlib as mpl
import matplotlib.pyplot as plt

이제 MNIST 안에서 'data' 키를 가진 딕셔너리 타입의 데이터셋에서 1개의 샘플을 출력해야 하는데.. 아래와 같이 결과값이 0이라고 오류 메세지가 발생한다. 

some_digit = X[0]

 

바로 구글에 검색해보니 나와 같은 상황에 처한 사람이 있었고.. 밑에 답변 중에는 이런 내용이 있었다. 

(출처:  https://stackoverflow.com/questions/65506131/why-does-using-x0-in-mnist-classifier-code-give-me-an-error )

sklearn.datasets 라이브러리 안에 있는 fetch_open의 API가 예전에는 (20년 12월 이전) numpy.ndarray 타입으로 반환했었는데 이제는 자동으로 설정이 되서 pandas.Dataframe 으로 변환된다는 것.

 

해결 방법은 

1. fetch_openml 사용시 as_frame = False로 설정할 것 (True 일 경우 DataFrame 타입으로 변환된다.)

2. 데이터셋을 to_numpy() 함수를 이용해서 numpy.ndarray 타입으로 변환할 것

 

그 중에서 2번을 해보면.. 나온다! 

%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt

some_digit = X.to_numpy()[0]
some_digit_image = some_digit.reshape(28, 28)

plt.imshow(some_digit_image, cmap="binary")
plt.axis("off")
plt.show()

만약에 .show() 했는데 이미지가 안보인다고 하면 matplotlib 라이브러리 호출 전에 %matplotlib inline 을 위에 넣어주면 된다. 자세한 건 아래 링크 참고!

https://cobaltblue49.tistory.com/31?category=956683

반응형