1. MNIST 데이터셋으로 분류기를 만들어 테스트 세트에서 97% 이상의 정확도를 달성해보자.
힌트 : KNeighborsClassifier가 이 작업에 아주 알맞습니다. 좋은 하이퍼파라미터만 찾으면 되기 때문에 weights와 n_neighbors 하이퍼파라미터로 그리드 탐색을 시도해보자.
시작하자마자 오류가 생겼습니다. TerminatedWorkerError? 인가.. 그런 오류가 뜨더라구요. 어떻게 갑자기 노동자들이 다 죽었다면성..
커널도 죽어버립니다. 구글링을 통해 봤는데요. 아마도 n_jobs > 1 이상인 경우 뜰 수 있다고 하는 것 같습니다.
여기서 n_jobs가 scikit-learn api를 통해 보면
n_jobs : int or None, optional (default=None)
Number of jobs to run in parallel. None
means 1 unless in a joblib.parallel_backend
context. -1
means using all processors. See Glossary for more details.
병렬로 수행할 일의 숫자라고 써져있구요. None은 joblib.parallel_backend 문구가 없으면 1을 의미한다.
-1은 모든 프로세서를 이용하는 다중프로세싱인 것 같네요. 메모리가 부족해서 Kill되는 것이 아닌가 싶습니다. (지금 가상머신 4GB)
해결책으로는 구글링을 하다보니 joblib을 임포트해서, 멀티쓰레딩방식으로 바꾸는 것 같습니다.
아마도 멀티프로세싱인 경우 CPU 2개 이상이 직접 병렬로 처리하는 반면에 멀티쓰레딩의 경우는 프로세스가 번갈아 처리하므로 동시에 일어나는 것처럼 느껴지는 거니까 멀티프로세싱이 훨씬 빠르겠죠. 하지만 음.. 오류가 나는 것 같아서 조금 느리더라도 멀티쓰레딩을 이용한 방식을 사용하면 될 것 같습니다.
일단, 원론적인 메모리 부족 현상인지 확인하기 위해서, 메모리를 4GB에서 8GB로 증가시켰습니다.
그리고, 그래픽 메모리 또한 16MB로 설정되어있었는데, 128MB로, 3차원 가속가능으로 설정했습니다.
(머신 설정에서 쉽게 할 수 있습니다.)
작동시키는 동안. GridSearchCV의 파라미터들에 대해 좀 더 알아보죠!
score
function, or scoring
must be passed.y
is either binary or multiclass, StratifiedKFold
is used. In all other cases, KFold
is used.cv
default value if None will change from 3-fold to 5-fold in v0.22.verbose : 정수
장황함을 제어합니다 : 더 높게 할 수록, 더 많은 메세지가 출력됩니다.
아! 이렇게 해석해보니까 더 알기 쉽군요. API는 역시 소중한 것 같습니다.
위에서 메모리를 8G, 비디오 메모리를 128M, 3차원 가속을 해주니 오류나지 않고 실행됩니다.
상당한 시간이 걸리므로 주의하세요. (무슨 연유인지 모르겠지만 하다가 너무 오래걸려서 다 돌아간 것을 구했습니다..)
위의 backend와 threading을 지우시고 하시면 됩니다. (위에 결과가 없으면 아래도 돌아가지 않으니 시간들여서 해보시길..)
2. MNIST 이미지를 (왼, 오른, 위, 아래) 어느 방향으로든 한 픽셀 이동시킬 수 있는 함수를 만들자.
그런 다음 훈련 세트에 있는 각 이미지에 대해 네 개의 이동된 복사본(방향마다 한 개)을 만들어 훈련 세트에 추가하자.
마지막으로 이렇게 확장된 데이터 셋에서 앞에서 찾은 최선의 모델을 훈련시키고 테스트 세트에서 정확도를 측정하자.
그리고, 모델 성능이 높아졌는지 확인한다.
(인위적으로 훈련 세트를 늘리는 이 기법을 데이터 증식 혹은 훈련 세트 확장(training set expansion)이라고 한다.
이렇게 아래, 왼쪽으로 움직여보았습니다. 혹시 모르니까 matplotlib.pyplot에 대해 모르고 지나갔다면 정확한 의미를 알아보는 시간을 가져보죠.
plt.figure(figsize=(12,3)) 그림 도면의 사이즈를 정하는 것입니다. 일반적으로 plot할 때 figsize를 자동으로 지정하지만, 구지 지정할 때에는 jupyter notebook에서 사용하거나, 다수의 그림을 나타낼 때 등에 사용합니다. (인치 단위입니다.)
subplot( , , ) subplot은 그리드인자를 표현한 것입니다. 즉 subplot (131)은 1X3그리드 인자의 첫 번째 이므로 subplot(131)에 그려질 plot에 대해 코딩된 후 subplot(132)로 넘어가겠죠.
imshow()에서 쓰여진 것들을 보면,
Colormap
, optionalA Colormap instance or registered colormap name. The colormap maps scalar data to colors. It is ignored for RGB(A) data. Defaults to rcParams["image.cmap"]
.
cmap은 컬러를 나타냅니다. 급하면 red, blue이렇게 쓸 수도 있고, 여러 컬러로 표현도 가능합니다.
Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r,
GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired,
Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r,
PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r,
Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral, Spectral_r, Wistia, Wistia_r, YlGn, YlGnBu,
YlGnBu_r, YlGn_r, YlOrBr, YlOrBr_r, YlOrRd, YlOrRd_r, afmhot, afmhot_r, autumn, autumn_r, binary, binary_r,
bone, bone_r, brg, brg_r, bwr, bwr_r, cividis, cividis_r, cool, cool_r, coolwarm, coolwarm_r, copper, copper_r,
cubehelix, cubehelix_r, flag, flag_r, gist_earth, gist_earth_r, gist_gray, gist_gray_r, gist_heat, gist_heat_r,
gist_ncar, gist_ncar_r, gist_rainbow, gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg, gist_yarg_r, gnuplot,
gnuplot2, gnuplot2_r, gnuplot_r, gray, gray_r, hot, hot_r, hsv, hsv_r, inferno, inferno_r, jet, jet_r, magma,
magma_r, nipy_spectral, nipy_spectral_r, ocean, ocean_r, pink, pink_r, plasma, plasma_r, prism, prism_r,
rainbow, rainbow_r, seismic, seismic_r, spring, spring_r, summer, summer_r, tab10, tab10_r, tab20, tab20_r,
tab20b, tab20b_r, tab20c, tab20c_r, terrain, terrain_r, twilight, twilight_r, twilight_shifted,
twilight_shifted_r, viridis, viridis_r, winter, winter_r
interpolation : str, optional
The interpolation method used. If NonercParams["image.interpolation"]q
is used, which defaults to 'nearest'.
Supported values are 'none', 'nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos'.
보간법이라고도 하는데요, 두 값 사이의 값을 추정하는 방식입니다.
방법엔 여러가지가 있으며 아래를 보면 예시를 볼 수 있습니다.
자 이제, 다시 넘어가서.
한 픽셀씩 움직여서 훈련 세트에 추가하고, 넘파이 배열로 변환합니다.
그래서 다시 KNeighborsClassifier에 fit하면, 간단한 데이터 증식으로 0.5% 정확도가 향상됨을 볼 수 있습니다.
블로그 이 글의 상당 부분은 [핸즈온 머신러닝, 한빛미디어/오렐리앙 제롱/박해선] 서적을 참고하였습니다. 나머지는 부수적인 함수나 메서드에 대해 부족한 설명을 적어두었습니다. 학습용으로 포스팅 하는 것이기 때문에 복제보다는 머신러닝에 관심이 있다면 구매해보시길 추천합니다. 도움이 되셨다면 로그인 없이 가능한 아래 하트♥공감 버튼을 꾹 눌러주세요! 출처
'## 오래된 게시글 (미관리) ## > Python (Linux)' 카테고리의 다른 글
25. Python - 분류 연습문제 4 [ 스팸 필터 / 스팸 분류기 ] (0) | 2018.12.05 |
---|---|
24. Python - 분류 연습문제 3 [타이타닉 데이터셋 도전] (0) | 2018.12.04 |
22. Python - 다중 분류 (0) | 2018.11.30 |
21. Python - MNIST를 이용한 분류 기초와 성능 평가 지표 (0) | 2018.11.28 |
20. Python - 그리드 탐색을 이용하여 준비 단계의 옵션 자동 탐색하기 (0) | 2018.11.28 |