본문 바로가기
Python (Linux)

23. Python - 분류 연습문제 1,2

by #Glacier 2018. 11. 30.
반응형

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_backendcontext. -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의 파라미터들에 대해 좀 더 알아보죠!


estimator : estimator object.
This is assumed to implement the scikit-learn estimator interface. Either estimator needs to provide a score function, or scoring must be passed.

먼저, estimator는 추정기 객체이다.
이는 scikit-learn Estimator 인터페이스를 구현하는 것으로 가정합니다. 추정기는 score함수나 scoring함수를 제공해야 합니다.

param_grid : dict or list of dictionaries

Dictionary with parameters names (string) as keys and lists of parameter settings to try as values, or a list of such dictionaries, in which case the grids spanned by each dictionary in the list are explored. This enables searching over any sequence of parameter settings.
scoring : string, callable, list/tuple, dict or None, default: None

파라미터 이름(문자열)을 키로 사용하는 사전(dict)과 값으로 설정하려 하는 파라미터 list 또는 각 dict의 리스트에서 확장한 해당 dict목록을 탐색합니다. 이는 모든 파라미터 설정의 어떤 시퀀스도 검색이 가능합니다.
Scoring : string, callable, list/tuple, dict 또는 없음이며 기본값은 None(없음)입니다.

A single string (see The scoring parameter: defining model evaluation rules) or a callable (see Defining your scoring strategy from metric functions) to evaluate the predictions on the test set.For evaluating multiple metrics, either give a list of (unique) strings or a dict with names as keys and callables as values.

단일 문자열(Scoring 파라미터 : 모델 평가 규칙 정의를 참조) 혹은 호출 가능(Metric 함수에서 Scoring 전략 정의 참조)형을 통해 테스트 세트의 예측을 평가합니다. 여러 Metric을 평가할 때에는 (독특한) 문자열 혹은 사전형을 제공하거나 키로 지정된 이름과 호출가능한 값으로 지정하세요.

NOTE that when using custom scorers, each scorer should return a single value. Metric functions returning a list/array of values can be wrapped into multiple scorers that return one value each.

See Specifying multiple metrics for evaluation for an example.If None, the estimator’s default scorer (if available) is used.

사용자 정의 scorer를 사용할 경우, 각 scorer는 단일 값을 반환해야 합니다. 값의 리스트/배열을 반환하는 메트릭 함수는 각각 하나의 값을 반환하는 여러 scorer에 wrapping 할 수 있습니다.평가를 위한 다중 메트릭 지정을 참조하세요. 만약 None인 경우 추정기의 기본 scorer가 사용됩니다.

cv : int, cross-validation generator or an iterable, optional

cv : int, 교차 검증 생성기, 반복가능하며, 선택적
교차 검증 

Determines the cross-validation splitting strategy. Possible inputs for cv are:
-None, to use the default 3-fold cross validation,
-integer, to specify the number of folds in a (Stratified)KFold,
-CV splitter,
-An iterable yielding (train, test) splits as arrays of indices.

교차 검증 분할 전략을 결정합니다. cv에 가능한 입력은 다음과 같습니다.
-없음 : 기본 3-겹 교차 검증 사용
-integer, 몇 개의 폴드를 설정할 지 (계층화된) 설정
-CV 스플리터
-(train, test)를 출력할 수 있는 반복 가능한 인덱스들의 배열

For integer/None inputs, if the estimator is a classifier and y is either binary or multiclass, StratifiedKFold is used. In all other cases, KFold is used.
Refer User Guide for the various cross-validation strategies that can be used here.
Changed in version 0.20: cv default value if None will change from 3-fold to 5-fold in v0.22.

정수 혹은 없음 입력의 경우, 만약 추정기가 분류기이고, y가 이진 또는 다중클래스인 경우 StratifiedKFold가 사용됩니다.(계층화)
다른 모든 경우에는 KFold가 사용됩니다.
여기에서 사용할 수 있는 다양한 교차 검증 전략은 사용자 가이드를 참조하세요.
버전 0.20에서 변경됨 : cv의 default 값은 0.22버전에서 3-fold에서 5-fold로 바뀔 것입니다.

verbose : integer
Controls the verbosity: the higher, the more messages.


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()에서 쓰여진 것들을 보면, 


cmap : str or Colormap, optional

A 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% 정확도가 향상됨을 볼 수 있습니다.


 블로그 

출처


이 글의 상당 부분은  [핸즈온 머신러닝, 한빛미디어/오렐리앙 제롱/박해선] 서적을 참고하였습니다.


나머지는 부수적인 함수나 메서드에 대해 부족한 설명을 적어두었습니다.

학습용으로 포스팅 하는 것이기 때문에 복제보다는 머신러닝에 관심이 있다면 구매해보시길 추천합니다.


도움이 되셨다면 로그인 없이 가능한

아래 하트♥공감 버튼을 꾹 눌러주세요! 



반응형