์ ๋ 1 ๋ ๋์ GridSearchCV๋ฅผ ํตํด Python 2.7, 3.3 ๋ฐ 3.4, ๋ ๊ฐ์ง ์์ , ์ฌ๋ฌ ๋ค๋ฅธ Mac OSX ํ๋ซํผ / ๋ ธํธ๋ถ, ์ฌ๋ฌ ๋ฒ์ ์ numpy ๋ฐ scikit์์ ๊ฐํ์ ์ผ๋ก์ด ๋ฌธ์ ๋ฅผ ๊ฒช์์ต๋๋ค. ๋ฐฐ์ฐ์ญ์์ค (์ ๋ ๊ทธ๊ฒ๋ค์ ๊ฝค ์ ์ ๋ฐ์ดํธํฉ๋๋ค).
์ด ๋ชจ๋ ์ ์์ ์๋ํ์ง๋ง ํญ์ ์๋ํ๋
https://github.com/scikit-learn/scikit-learn/issues/3605- ๋ค์ค ์ฒ๋ฆฌ ์์ ๋ฐฉ๋ฒ์ 'forkserver'๋ก ์ค์
https://github.com/scikit-learn/scikit-learn/issues/2889- ์ฌ์ฉ์ ์ง์ ์ฑ์ ํจ์๊ฐ ์ ๋ฌ ๋ ๋๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค (๋์ผํ GridSearchCV ํธ์ถ์ด n_jobs! = 1๋ก ๊ณ ์ ๋๋์ด ๋ฌธ์ ๊ฐ ์ ๋์ ์ผ๋ก ๋ฐ์ํ์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ๋์ ์์ด์ง๋ง ํ๋์์ด ์ ์ํ)
https://github.com/joblib/joblib/issues/138-MKL ์ค๋ ๋ ์์์ ํ๊ฒฝ ๋ณ์ ์ค์ (Anaconda ๋ฐฐํฌ์์ mkl์ ๋ํด ๋น๋ ๋ numpy / sklearn์ ์คํํ ๋ ์๋ํ์ต๋๋ค)
์
๋ ฅ ํฌ๊ธฐ ์กฐ์ ๋ฐ n_jobs = 1๋ก ์ค๋ฅ๊ฐ ์๋์ง ํ์ธ-์ฌ๋ฌ ์ค๋ ๋์์ ์ํํ๋ ค๋ ์์
์ด ํ ์ค๋ ๋์์ ์งง์ ์๊ฐ ๋ด์ ์ฌ๋ฐ๋ฅด๊ฒ ์คํ๋๋ค๋ ๊ฒ์ ์์ ํ ํ์ ํฉ๋๋ค.
๊ทธ๊ฒ์ด ์ฌ๋ผ ์ก๋ค๊ณ ํ์ ํ ๋ ํญ์ ํ์ด ๋์ค๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋งค์ฐ ์ค๋ง์ค๋ฌ์ด ๋ฌธ์ ์ด๋ฉฐ, ๋์๊ฒ 100 % ์๋ํ๋ ์ ์ผํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ด๊ฐ ์ํ sklearn ๋ฐฐํฌํ์ GridSearchCV ์์ค๋ก ์ด๋ํ๋ ๊ฒ์ ๋๋ค. Paralell ํธ์ถ์์ ๋ฐฑ์๋ ์ธํธ๋ฅผ '์ค๋ ๋ฉ'(๋ค์ค ์ฒ๋ฆฌ ๋์ )์ผ๋ก ์๋ ๋ณ๊ฒฝ.
๋๋ ๊ทธ ํดํน๊ณผ n_jobs = 1 ์ค์ ์ ์ฐจ์ด๋ฅผ ๋ฒค์น๋งํนํ์ง ์์์ง๋ง, ๋ณ๋ ฌํ๊ฐ ์ ํ์์ด ์ค๋ ๋ฉ ๋ฐฑ์๋๋ก ์ด๋์ ๊ธฐ๋ํ ์ด์ ๊ฐ ์์ต๋๊น? ํ์คํ ๋ค์ค ์ฒ๋ฆฌ๋งํผ ์ข์ง๋ ์์ง๋ง ์ ์ด๋ ๋ ์์ ์ ์ ๋๋ค.
btw ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ต์ ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํด๋น ํ๋ซํผ์ ์ง์์ ์ผ๋ก ๋ฌธ์ ๊ฐ ์์ต๋๊น ??
๋ฉํฐ ์ค๋ ๋ฉ๊ณผ ๊ด๋ จํ์ฌ : ๋ฉํฐ ์ค๋ ๋ฉ์ด ์๋นํ ์ด๋์ ์ค ๊ฐ๋ฅ์ฑ์ด์๋ ์ถ์ ์๊ฐ ์์ผ๋ฉฐ, ๋๋ถ๋ถ์ ์์
์ด GIL์์ด numpy ๋๋ Cython ์์
์ผ๋ก ์ํ๋๋ ์ถ์ ๊ธฐ๊ฐ ์์ต๋๋ค. ์ ๋ง, ๋๋ ์ด๊ฒ์ด ๋ง์ด ํ๊ฐ๋์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. backend='threading'
์ ๊ฝค ์ต๊ทผ์ ๊ฒ์
๋๋ค.
์ง์ง ์ง๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ํ์ธํ๊ธฐ ์ํด ๋ฌด์์ ๋ ํ ์ ์๋๊ฐ์ ๋๋ค.
์ฐ์ , ์ด๋ค ๊ธฐ๋ณธ ๊ฒฌ์ ์ ๊ณ ๋ ค ํ์ต๋๊น?
@jnothman ํ๋ซํผ๋ณ๋ก OSX 10.9.5์ ๋๊น? ๊ทธ๋ ๋ค๋ฉด ๊ทธ ๋ฌธ์ ๊ฐ ์ฒ์์ด ์๋๋๋ค.
์ด์ ์ ์๋ต ํ ์ฃผ์ ์ธ๋ถ ์ฌํญ ์ค ํ๋๋ ๋ฌธ์ ๊ฐ์์ ๋ ํญ์ IPython ๋ ธํธ๋ถ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค. n_jobs! = 1๋ก "scoring"์ธ์๋ฅผ ์ถ๊ฐํ๋ฉด GridSearchCV๊ฐ ์์ํ ์ค๋จ๋์ง๋ง ํด๋น ์ธ์๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ชจ๋ ๊ด์ฐฎ์ต๋๋ค. ๋ด๊ฐ ์ ๊ณตํ๋ ์ ์ ๋งค๊ธฐ๊ธฐ ํจ์๊ฐ ์์ ๋ถ๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ ์ธ์๋ ์๋ํ์ง ์๋๋ผ๋ ์ฌ์ ํ ๋ฉ ์ถฅ๋ ๋ค (ํ์ง๋ง n_jobs = 1๋ก ์์ํ๋ ๊ฒ๊ณผ ์ ํํ ์ผ์น ํจ).
Re : ๋ฃ๊ธฐ ์ข์ ์ค๋ ๋ฉ์ด๋ฏ๋ก GridSearchCV์ ๋ํ ํด๋น ์ต์ ์ด ์ค์ ๋ก ์๋ฏธ๊ฐ์์ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋ฌธ์ ๊ฐ์๋ ๊ฒฌ์ ๊ฐ์ ๊ดํ ํ ๋๋ ๊ทธ๊ฒ์ ๋ง์ด ์ขํ ์ ์๋์ง ํ์ ํ์ง ๋ชปํฉ๋๋ค. ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๊ธฐ์์ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด ๋ด๊ฐ ๊ด๋ฆฌ ํ ์์๋ ํ ๋ง์ด ์๋ํฉ๋๋ค. ๋๋ ๋ฐฉ๊ธ ์์์ ์ธ๊ธ ํ ์กฐ๊ฑด์ ์ด๋ค ์ถ์ ๊ธฐ๋ก ์ฌํ ํ ์ ์๋์ง ํ์ธํ์ผ๋ฉฐ ๋ชจ๋ ๊ฒฝ์ฐ์ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค (๋๋ ์ ์ด๋ ์๋ํ์ต๋๋ค LogisticRegression, SGDClassifier, GBRT ๋ฐ RF).
์ด์ ๊ฐ์ ๋ฉํฐ ์ค๋ ๋ฉ ๋ฌธ์ ์ ๋ํด ์ผ๋ฐ์ ์ผ๋ก ์ด๋ค ์ปจํ ์คํธ๊ฐ ๊ฐ์ฅ ๋์์ด๋๋์ง ์ ๋ชจ๋ฅด์ง๋ง ๊ณ์ ์งํํ ์์๋ ๋ ๋ง์ ๊ฒ์ ์ ๊ณตํ๊ธฐ ์ํด ํ ์์๋ ๋ชจ๋ ์์ ์ํ๊ณ ์ถ์ต๋๋ค. ๋์๊ฒ ์ด๋ค ์ ์์ด ์์ต๋๊น?
๊ฐ์ ํ๋ ์ ์ํฌ์ ๋ํด ์ฐ๊ฒฐ๋ numpy๋ฅผ ์ฌ์ฉํฉ๋๊น?
์๋, ๋ด๊ฐ ๋ญ๊ฐ ๋น ์ง ๊ฒ ์๋๋ผ๋ฉด. ๋๋ ๋น์ ์ด ๊ทธ๋ ๊ฒ ํ ๋ ์ค์น๋ numpy ๋ฒ์ ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ ์ด๋ ๊ฐ์ ํจํค์ง๊ฐ ์กด์ฌํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
(research3.4) eczech $ pip ๋๊ฒฐ | grep numpy
numpy == 1.9.2
(research3.4) eczech $ conda ์
๋ฐ์ดํธ ๊ฐ์ํ
์ค๋ฅ : '๊ฐ์'ํจํค์ง๊ฐ /Users/eczech/anaconda/envs/research3.4์ ์ค์น๋์ง ์์์ต๋๋ค.
100 % ํ์ ์ ๊ฐ์ง๊ณ ๋๋ต ํ ์ ์๋ค๋ ๋์ ๋ฌด์ง๋ฅผ ์ฉ์ํ์ญ์์ค. ๊ทธ๋ฌ๋ ๋๋ ํ์คํ ๊ทธ๊ฒ์ ์ค์นํ๊ธฐ ์ํด ์๋์ ์ผ๋ก ์๋ฌด๊ฒ๋ํ์ง ์์์ต๋๋ค.
conda ๊ฐ์์ ์ฌ๊ณผ ๊ฐ์๊ณผ ๋์ผํ์ง ์์ต๋๋ค.
http://docs.continuum.io/accelerate/index
https://developer.apple.com/library/mac/documentation/Accelerate/Reference/AccelerateFWRef/
conda ๊ฐ์์ ํจํค์ง์ MKL ๊ฐ์ ๋ฒ์ ์ด๋ฉฐ, ์ฌ๊ณผ ๊ฐ์์ MKL์ ๋์์ ๋๋ค.
numpy.__config__.show()
์ ์ฃผ์ค ์ ์์ต๋๊น?
๋ค์ค ์ฒ๋ฆฌ๋ ๊ฐ์ IIRC์์ ์๋ํ์ง ์์ต๋๋ค. ํ @ogrisel
ํ์คํ:
np. config .show ()
atlas_3_10_blas_threads_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
atlas_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
atlas_3_10_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
atlas_threads_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
atlas_3_10_blas_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
blas_opt_info :
extra_compile_args = [ '-msse3', '-DAPPLE_ACCELERATE_SGEMV_PATCH', '-I / System / Library / Frameworks / vecLib.framework / Headers']
extra_link_args = [ '-Wl, -framework', '-Wl, Accelerate']
define_macros = [( 'NO_ATLAS_INFO', 3)]
lapack_mkl_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
atlas_blas_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
mkl_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
lapack_opt_info :
extra_compile_args = [ '-msse3', '-DAPPLE_ACCELERATE_SGEMV_PATCH']
extra_link_args = [ '-Wl, -framework', '-Wl, Accelerate']
define_macros = [( 'NO_ATLAS_INFO', 3)]
blas_mkl_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
atlas_3_10_threads_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
openblas_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
openblas_lapack_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
atlas_blas_threads_info :
์ฌ์ฉํ ์ ์์ต๋๋ค
์, ๋ฌธ์ ์ถ์ ๊ธฐ์์ ์ฐพ์ ์์๋ ์๋ ค์ง ๋ฌธ์ ์ ๋๋ค. ๊ฐ์์ ๋ค์ค ์ฒ๋ฆฌ์์ ์๋ํ์ง ์์ต๋๋ค.
์ฝ๊ฐ ํผ๋ ์ค๋ฌ์์. ์ค๋ ๋ฉ ๋ฐฑ์๋๋ GIL์ด ๋ฆด๋ฆฌ์ค ๋ ๋๋ง ์์ ์ ์ํํฉ๋๋ค. ๊ทธ๋ ์ฃ ?
Gotcha, ๊ทธ๋ผ numpy๋ฅผ ์ด๋ป๊ฒ ์ฌ ๊ตฌ์ถํด์ผํ๋์ง ์์? conda ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๋์ pip๋ฅผ ์ค์นํด์ผํฉ๋๊น? ์๋๋ฉด ์์ค์์ ๋น๋ํ๊ณ ์ ํ ๊ฐ์ ์ธ์๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ๋ ๋์๊น์?
์ด๊ฒ์ด ๋ฌธ์ ์ ์์์ด ์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์ฃฝ์ ๋ง์ ์น๊ณ ์๋ค๋ฉด ๊ฐ๊น์ด ๊ฐ์ญ์์ค.
์ฝ๋ค ๊ฐ์์ ์ป์ ์ ์๋ค๋ฉด ์๋ํฉ๋๋ค.)
joblib
๋ก ๋ณด์๊ธ์ ๋ผ ์ ์์๊น์?
์ ์ข์์, ์ฐ์์ฒด๋ ๊ทธ ํํ๋ฅผํ๊ธฐ ์ํด ์ฌ๊ณผ๋ฅผ ์ง๋ถํ์ ๊ฒ์ ๋๋ค.
$ 0 ์ ์์ด ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์ด๋ ์ชฝ์ด๋ ํต์ฐฐ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์, ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ์ด์ ์ ์์ฒญ ๋ ์ ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ฌ์ฉ์ ์ง์ ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ ํ์ฌ ํ๋ซํผ์์๋ง์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ์ฌ์ค์ด ๊ณ์ ๋ ๊น์? ๋ด ์ธ์ ๋์ ๋๋ grid_search.py โโ์์ค ์ฝ๋๊ฐ ์ฃผ์ด์ง๋ฉด ๋ฌธ์ ๊ฐ ๋ ์์๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์ ์ ์์ง๋ง ์ฌ์ฉ์ ์ ์ ํจ์์ ์ฐ์ธ์ ๊ด๋ จ์ด์์ ์ ์์ต๋๊น?
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๊ณผ๋ ๋ค์ ๊ด๋ จ์ด์๋, ๋๋ ๋ํ ์ด์ ์ IPython ๋ณ๋ ฌ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ๋ ์์ ๋ ๋ฒ์ ์ GridSearchCV๋ฅผ ๋ง๋ค์ด์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์๋ํ์์ ๊ธฐ์ตํ์ต๋๋ค. ๊ทธ๋์ ๊ทธ ์๋ฃจ์ ์ ๋ค์ ๋ฐฉ๋ฌธํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ด๋ค ์ ์ผ๋ก๋ ๊ณต์ ํ ๊ฐ์น๊ฐ ์์๊น์? ์ด ์๋ฃจ์ ์ ์ ์๋ํ์ง๋ง ๋ ธํธ๋ถ ์์ฒด๊ฐ ์๋ pythonpath์์ ์ฌ์ฉ์ ์ ์ ํด๋์ค์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผํ์ง๋ง ๋ค๋ฅธ ๋ ๋์ ์ต์ ์ด ์๋ค๋ฉด ๋ค๋ฆฌ๊ฐ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๊ธฐ๊ฐ ์ฝ๊ฐ ๊ณ ํต ์ค๋ฌ์ ์ต๋๋ค.
์ํ๋ผ์ค์ ์ฐ๊ฒฐํ ์ ์์ง๋ง ์๋๊ฐ ๋๋ ค์ง ๊ฒ์
๋๋ค.
์๋ง๋ OS X์ ๋ํ ๋ฌด๋ฃ MKL ๋งํฌ numpy๊ฐ ์์ต๋๊น? ์ฐฝ๋ฌธ ์ฉ์ด ํ๋ ์์ต๋๋ค.
[ํ์ ์์ธ ๊ฒฝ์ฐ ์ฐ์ ๊ฐ์์ ๋ฌด๋ฃ์ ๋๋ค.]
๋๋ ์ด๊ฒ์ด ์ฌ์ฉ์ ์ง์ ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ ํ ๊ด๋ จ์ด ์๋ค๊ณ ํ์ ํฉ๋๋ค.
์ฌ์ฉ์ ์ง์ ์ ์ ๊ธฐ๋ฅ์ผ๋ก ์ค๋จ๋์ง๋ง ์์ด๋์๋ ์์ฒด ํฌํจ ๋ ์ค๋ ํ๋ฆฟ์ ์ ๊ณต ํ ์ ์์ต๋๊น?
์ปค์คํ ์ค์ฝ์ด๋ง ๊ธฐ๋ฅ์ ์ฌ์ค์ด ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค (์ : ํผํด ๋ง ๋ฌธ์ ๋๋ ์ค์ฒฉ ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ์ ์ ํ ์ ์์). ์ฝ๋๋ฅผ ๋ณผ ์ ์์๊น์?
์๋๋ฉด make_scorer
์๋ ํ์ค ๋ฉํธ๋ฆญ์ ์๋ฏธํฉ๋๊น?
ํ์คํ, ์ฌ๊ธฐ ๊ด๋ จ ๋ถ๋ถ์ด ์์ผ๋ฉฐ make_scorer์์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ฌ์ฉ์ ์ ์ ํจ์์์๋ ๋ฌธ์ ๊ฐ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
from sklearn.linear_model import LogisticRegression
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import StratifiedKFold
from sklearn.metrics import average_precision_score, make_scorer
import functools
res = []
clfs = []
for response in responses:
X, y = d_in[features], d_in[response]
for i, (train, test) in enumerate(StratifiedKFold(y, 5)):
X_train, y_train, X_test, y_test = X.iloc[train], y.iloc[train], X.iloc[test], y.iloc[test]
clf = LogisticRegression(penalty='l1')
grid = {
'class_weight': [{0: 1, 1: 10}, {0: 1, 1: 100}, {0: 1, 1: 1000}],
'C': np.logspace(-3, 0, num=4)
}
# Using make_scorer doesn't cause any issues
# clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 3),
# scoring=make_scorer(average_precision_score), n_jobs=-1)
# This however is a problem:
def avg_prec_score(estimator, X, y):
return average_precision_score(y, estimator.predict_proba(X)[:, 1])
clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 5),
scoring=avg_prec_score, n_jobs=-1)
clf = clf.fit(X_train, y_train)
print('Best parameters for response {} inferred in fold {}: {}'.format(response, i, clf.best_params_))
y_pred = clf.predict(X_test)
y_proba = clf.predict_proba(X_test)
clfs.append((response, i, clf))
res.append(pd.DataFrame({
'y_pred': y_pred,
'y_actual': y_test,
'y_proba': y_proba[:,1],
'response': np.repeat(response, len(y_pred))
}))
res = functools.reduce(pd.DataFrame.append, res)
res.head()
ํ์๋ ์ฌ์ฉ์ค์ธ ๋ฐ์ดํฐ์ ์ผ๋ถ ๋ฒ์ ์ ํฌํจํ๋ ์์ฒด ํฌํจ ๋ฒ์ ์ผ๋ก ์์ ํ ๊ฒ์ ๋๋ค (ํ์ง๋ง ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฝ๋๋ค). ํ์ง๋ง ๊ทธ ๋์ ์ฌ์ฉ์ ์ ์ ํจ์์ ํผํด ๋ง์ ์ข์ ๋ฆฌ๋์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ํ์ธํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ฒ ์๋ํด ๋ณด์๊ณ ์ฌ์ฉ์ ์ ์ ํจ์์์๋ 100 %, make_scorer๋ฅผ ์ฌ์ฉํ ๋๋ 0 %๊ฐ ์ค๋จ๋ฉ๋๋ค. ์ผ๋ถ ์๋ ค์ง ๊ฐ์ ธ์จ ๋ฉํธ๋ฆญ ํจ์์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ main (์ฆ, ํด์๋๋ ์ต์์ ์คํฌ๋ฆฝํธ) ๋๋
๊ฐ์ ธ์จ ๋ชจ๋?
2015 ๋ 8 ์ 15 ์ผ 23:37์ Eric Czech [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ฌผ๋ก ์ฌ๊ธฐ์ ๊ด๋ จ ๋ถ๋ถ์ด ์์ผ๋ฉฐ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค.
make_scorer๋ฅผ ์ฌ์ฉํ์ง๋ง ์ฌ์ฉ์ ์ ์ ํจ์๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.from sklearn.linear_model import LogisticRegressionfrom sklearn.grid_search import GridSearchCV from sklearn.cross_validation import StratifiedKFoldfrom sklearn.metrics import average_precision_score, make_scorerimport functools
res = []
clfs = []
์๋ต์ ๋ํ ์๋ต :
X, y = d_in [๊ธฐ๋ฅ], d_in [์๋ต]
i์ ๊ฒฝ์ฐ (train, test) enumerate (StratifiedKFold (y, 5)) :
X_train, y_train, X_test, y_test = X.iloc [train], y.iloc [train], X.iloc [test], y.iloc [test]
clf = LogisticRegression (penalty = 'l1')
๊ทธ๋ฆฌ๋ = {
'class_weight': [{0 : 1, 1 : 10}, {0 : 1, 1 : 100}, {0 : 1, 1 : 1000}],
'C': np.logspace (-3, 0, num = 4)
}# Using make_scorer doesn't cause any issues # clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 3), # scoring=make_scorer(average_precision_score), n_jobs=-1) # This however is a problem: def avg_prec_score(estimator, X, y): return average_precision_score(y, estimator.predict_proba(X)[:, 1]) clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 5), scoring=avg_prec_score, n_jobs=-1) clf = clf.fit(X_train, y_train) print('Best parameters for response {} inferred in fold {}: {}'.format(response, i, clf.best_params_)) y_pred = clf.predict(X_test) y_proba = clf.predict_proba(X_test) clfs.append((response, i, clf)) res.append(pd.DataFrame({ 'y_pred': y_pred, 'y_actual': y_test, 'y_proba': y_proba[:,1], 'response': np.repeat(response, len(y_pred)) }))
res = functools.reduce (pd.DataFrame.append, res)
res.head ()์ผ๋ถ ๋ฒ์ ์ ๋ ๋ฆฝํ ๋ฒ์ ์ ์์ ํ๊ฒ ์ต๋๋ค.
๋ด๊ฐ ์ฌ์ฉํ๊ณ ์๋ ๋ฐ์ดํฐ (ํ์ง๋ง ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฝ๋๋ค). ๊ทธ๋์
์ด๋ฌํ ์ฌ์ฉ์ ์ง์ ํจ์์ ํผํด ๋ง์ ์ข์ ๋ฆฌ๋์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
์ฌ๋ฌ ๋ฒ ๋ค์ ํ์ธํ๊ณ ์ฌ์ฉ์ ์ ์๋ก 100 % ๋งค๋ฌ๋ฆฝ๋๋ค.
์ผ๋ถ ์๋ ค์ง ๊ฒ๊ณผ ํจ๊ป make_scorer๋ฅผ ์ฌ์ฉํ ๋์ 0 %,
๊ฐ์ ธ์จ ๋ฉํธ๋ฆญ ๊ธฐ๋ฅ.โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -131376298
.
์, ipynb์ ๋๋ค. ํฅ๋ฏธ ๋กญ๊ตฐ์. ์, ์ ์์ด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค ..?
2015 ๋ 8 ์ 15 ์ผ 23:51, Joel Nothman joel. [email protected] ์์ฑ :
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๋ฉ์ธ (์ฆ, ํด์๋๋ ์ต์์ ์คํฌ๋ฆฝํธ) ๋๋
๊ฐ์ ธ์จ ๋ชจ๋?2015 ๋ 8 ์ 15 ์ผ 23:37์ Eric Czech [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ฌผ๋ก ์ฌ๊ธฐ์ ๊ด๋ จ ๋ถ๋ถ์ด ์์ผ๋ฉฐ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค.
make_scorer๋ฅผ ์ฌ์ฉํ์ง๋ง ์ฌ์ฉ์ ์ ์ ํจ์๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.from sklearn.linear_model import LogisticRegressionfrom sklearn.grid_search import GridSearchCV from sklearn.cross_validation import StratifiedKFoldfrom sklearn.metrics import average_precision_score, make_scorerimport functools
res = []
clfs = []
์๋ต์ ๋ํ ์๋ต :
X, y = d_in [๊ธฐ๋ฅ], d_in [์๋ต]
i์ ๊ฒฝ์ฐ (train, test) enumerate (StratifiedKFold (y, 5)) :
X_train, y_train, X_test, y_test = X.iloc [train], y.iloc [train], X.iloc [test], y.iloc [test]
clf = LogisticRegression (penalty = 'l1')
๊ทธ๋ฆฌ๋ = {
'class_weight': [{0 : 1, 1 : 10}, {0 : 1, 1 : 100}, {0 : 1, 1 : 1000}],
'C': np.logspace (-3, 0, num = 4)
}# Using make_scorer doesn't cause any issues # clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 3), # scoring=make_scorer(average_precision_score), n_jobs=-1) # This however is a problem: def avg_prec_score(estimator, X, y): return average_precision_score(y, estimator.predict_proba(X)[:, 1]) clf = GridSearchCV(clf, grid, cv=StratifiedKFold(y_train, 5), scoring=avg_prec_score, n_jobs=-1) clf = clf.fit(X_train, y_train) print('Best parameters for response {} inferred in fold {}: {}'.format(response, i, clf.best_params_)) y_pred = clf.predict(X_test) y_proba = clf.predict_proba(X_test) clfs.append((response, i, clf)) res.append(pd.DataFrame({ 'y_pred': y_pred, 'y_actual': y_test, 'y_proba': y_proba[:,1], 'response': np.repeat(response, len(y_pred)) }))
res = functools.reduce (pd.DataFrame.append, res)
res.head ()์ผ๋ถ ๋ฒ์ ์ ๋ ๋ฆฝํ ๋ฒ์ ์ ์์ ํ๊ฒ ์ต๋๋ค.
๋ด๊ฐ ์ฌ์ฉํ๊ณ ์๋ ๋ฐ์ดํฐ (ํ์ง๋ง ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฝ๋๋ค). ๊ทธ๋์
์ด๋ฌํ ์ฌ์ฉ์ ์ง์ ํจ์์ ํผํด ๋ง์ ์ข์ ๋ฆฌ๋์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
์ฌ๋ฌ ๋ฒ ๋ค์ ํ์ธํ๊ณ ์ฌ์ฉ์ ์ ์๋ก 100 % ๋งค๋ฌ๋ฆฝ๋๋ค.
์ผ๋ถ ์๋ ค์ง ๊ฒ๊ณผ ํจ๊ป make_scorer๋ฅผ ์ฌ์ฉํ ๋์ 0 %,
๊ฐ์ ธ์จ ๋ฉํธ๋ฆญ ๊ธฐ๋ฅ.โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -131376298
.
๊ทธ๊ฒ์ ๋ ธํธ๋ถ์
๋์ ๋ชจ๋์์ ๊ฐ์ ธ ์์ ์ด๋ป๊ฒ ์งํ๋๋์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
์์๋ค์ํผ ๋ ธํธ๋ถ ์ธ๋ถ์์ ์ ์ํ๋ฉด ์ ์๋ํฉ๋๋ค.
๋๋ ๋ณธ์ง์ ์ผ๋ก ํ์ด์ฌ 2.7์์ ์คํ๋๋ ๋์ผํ ์ฝ๋ (๋๋ ๋ ์ค๋๋ lib๊ฐ ํ์ํจ)์ ํ์ด์ฌ 3.4 ์์์ด ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ฌ์ฉ์ ์ ์ ํจ์์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด 2.7์์ ์ค๋จ ๋ฌธ์ ๊ฐ ์์ง๋ง make_scorer๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฒ์ ์ ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ด ์ด์ ๋ฒ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์ด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ ธํธ๋ถ์ ์ ์ ๋ ์ฐ์ธ ํจ์๊ฐ ์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋์ง ์ถ์ ํ๊ธฐ ์ํด ๋ด๊ฐ ํ ์์๋ ๋ค๋ฅธ ์ผ์ด ์์ต๋๊น?
๊ธ์, ์ฐ๋ฆฌ๋ ๋ค์์ ์ดํดํ๊ณ ์ถ์ต๋๋ค.
pickle.dumps(function)
ํ์ธ https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/externals/joblib/parallel. py # L150 with pickle.loads(pickle.dumps(function))
๊ฒฐ๊ณผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๊น? (์ค๋ช
ํ๊ธฐ ์ํด ์ด๊ฒ์ ๋ค์ค ์ฒ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ ์ ํผํด ๊ฐ๋ฅ์ฑ์ ํ์ธํ๊ธฐ์ํ ์์ ์ ๊ฒ์
๋๋ค.)@ogrisel ์ด ๊ด์ฌ์
๋ด๊ฐ ์๋์ฐ์์ ๋ณธ ๊ฒ์์ ๋ ธํธ๋ถ์ ๋ฉํฐ ํ๋ก์ธ์ฑ๊ณผ ์ด์ํ ์ํธ ์์ฉ์ํ๋ค.
๋์ผํ ๋ ธํธ๋ถ์ ์ ์ ๋ ํจ์๋ฅผ ํผํด ๋ง ๋ฐ ์ธ ํผํด ๋ง ํด ๋ณด์ จ์ต๋๊น?
์ค๋ ๋๋ ์ฐ์ฐํ https://pythonhosted.org/joblib/parallel.html#bad -interaction-of-multiprocessing-and-third-party-libraries๋ฅผ ๋ณด์์ต๋๋ค. ๊ด๋ จ์ด ์์ต๋๊น?
ํ์ด์ฌ 3.4 ์ด์์ผ๋ก ์
๊ทธ๋ ์ด๋ํด์ผํ ๊น์?
๊ธด ํด๊ฐ๋ฅผ ๋ณด๋ด์ ์ฃ์กํฉ๋๋ค. ๊ทธ๋๋ ์ง๋ฌธ์ ๋๋ตํ๋ ค๋ฉด :
pickle.loads(pickle.dumps(function))
๋ฅผ parallel.py์ ๋ฃ๊ณ ๊ทธ ๋ค์ ์ธ์ ๋ฌธ์ ๋ฃ์ด ๊น๋ํ๊ฒ ์คํ๋๊ณ ์๋์ง ํ์ธํ๊ณ ๊ฑฐ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ์ต๋๋ค. ๋ช
ํํํ๊ธฐ ์ํด ๋
ธํธ๋ถ์์ ํธ์ถ ๋ GridSearchCV.fit์ ๋ณ๊ฒฝ์์ด ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ ํ ๋ฉ์ถฐ ์์ต๋๋ค (n_jobs = -1๋ก 16 ๋ฒ ํ์๋๋ ์ธ์ ๋ฌธ ์ ์ธ).def test_function(x):
return x**2
pickle.loads(pickle.dumps(test_function))(3)
# 9
์์ ๋ํ๋ฅผ ์ฝ์ง ์์์ง๋ง์ด ์ต์ํ์ ํ
์คํธ๋ travis์ Python 2.6 ๋น๋์์ ์คํจํ์ง๋ง ๋ด PC์์ ์ ์ฌํ ๊ตฌ์ฑ์ผ๋ก ํต๊ณผํ์ต๋๋ค ... ( n_jobs = -1
๋ ์คํจํ๋ค๊ณ ์ ์ํฉ๋๋ค. ์ด์ python / joblib / scipy ๋ฒ์ ์ ๋จ์ผ ์ฝ์ด ๋จธ์ ์ ์ค์ ๋์ด ์์ต๋๊น?)
def test_cross_val_score_n_jobs():
# n_jobs = -1 seems to hang in older versions of joblib/python2.6
# See issue 5115
cross_val_score(LinearSVC(), digits.data, digits.target, cv=KFold(3),
scoring="precision_macro", n_jobs=-1)
์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ +1, ๋์์ด ๋ ๊ฒฝ์ฐ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ฃผ์ธ์.
@ eric-czech Python 3.4 ๋๋ 3.5 ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ ๋ค์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ๋ค์ Python ํ๋ก๊ทธ๋จ์ ๋ค์ ์์ํ์ญ์์ค.
export JOBLIB_START_METHOD="forkserver"
joblib ๋ฌธ์์ ์ค๋ช ๋๋๋ก. forkserver is mode๋ ๋ํ์์ผ๋ก ์ ์ ๋ ๊ธฐ๋ฅ์ ์ค๋จํ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ง ์์ต๋๋ค.
์ต์ ์ํํธ์จ์ด๊ฐ ์ค์น๋ OS X 10.11.4 ๋ฐ Ubuntu 14.04 ๋ชจ๋์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
# Metrics
B_R = 10.0
def raw_TPR(y_true, y_pred):
return np.sum((y_true == 1) & (y_pred == y_true))
def raw_FPR(y_true, y_pred):
return np.sum((y_true == 0) & (y_pred != y_true))
def AMS(y_true, y_pred):
print("Hello")
tpr = raw_TPR(y_true, y_pred)
fpr = raw_FPR(y_true, y_pred)
score = np.sqrt(2 * ((tpr + fpr + B_R) * np.log(1 + tpr / (fpr + B_R))) - tpr)
return score
# Grid search
param_grid = {
"max_depth":[6, 10],
"learning_rate":[0.01, 0.5],
"subsample":[0, 1],
"min_child_weight":[0.1, 1],
"colsample_bytree":[0.1, 1],
"base_score":[0.1, 1],
"gamma":[0.5, 3.5]
}
scorer = make_scorer(AMS, greater_is_better=True)
clf = XGBClassifier()
gridclf = GridSearchCV(clf, param_grid, scorer, n_jobs=-1, verbose=2)
gridclf.fit(X_train, y_train)
์ค์ ๋ก์ด ์ฝ๋๋ n_jobs=1
๊ฒฝ์ฐ์๋ง ๊ณ ์ ๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ด์ฌ 3์์ ์๋ํ๊ณ ํ์ด์ฌ 2์์ wontfix , ๋ง์ต๋๋ค
๊ฒฝ๊ณ ๋ ์ค๋ฅ ( "n_jobs> 1 not supported on Python 2")์์ด Python 2์์ ์๋์ผ๋ก ์ค๋จ๋๋ ๊ฒฝ์ฐ ํ์ฉ๋์ง ์์ต๋๋ค. ์ค๋ฅ๋ฅผ ๋์ง ์ ์์ต๋๊น?
@amueller on Python 3์์๋ https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -187683383์ ํ๋ก์ฐํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ฆ, Python 3์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํ์ง ์์ต๋๋ค.
์๋ OP๊ฐ joblib start_method๋ฅผ forkserver๋ก ์ค์ ํ๋ ๊ฒ์ด ํญ์ ์๋ํ์ง ์๋๋ค๊ณ ๋งํ๋ ๊ฒ์ฒ๋ผ ๋ณด์๊ธฐ ๋๋ฌธ์ ๋ซ์์ผํ ์ง ์ฌ๋ถ๋ ํ์คํ์ง ์์ต๋๋ค ...
BTW xgboost ํ๋๋ ์๋ ค์ง ๊ฒ์ ๋๋ค. https://github.com/scikit-learn/scikit-learn/issues/6627#issuecomment -206351138์ ์ฐธ์กฐ
ํธ์ง : ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ ์ ์์ต๋๋ค. ๋ด๊ฐ ์ค์ ๋ก ์์ ํ์ ์๋์๋ Pathos๋ก ๋ฉํฐ ํ๋ก์ธ์ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์๋ ๊ด๋ จ์๋ ๋ณ๊ฒฝ์ด์์์ต๋๋ค.
๋น ๋ฅธ ์์ :
np.random.seed(0)
์ค๋ช
:
๋๋ auto_ml ์ ๋ํ ํ
์คํธ ์ค์ํธ์์ ๊ฐ์ฅ ์ฌ๊ฐ ์ง๋ฉดํ์ต๋๋ค . GridSearchCV๋ฅผ ์ฒ์ (2?) ๋ฒ ์คํํ์ง๋ง ๊ด์ฐฎ ์์ง๋ง ํ์ ์คํ์ ์ค๋ฅ์์ด ์ค๋จ๋ฉ๋๋ค.
์ฌํ์ฑ์ ๋ณด์ฅํ๋ฉด์ ๋ฌด์์์ฑ์ ํผ์ํ์ง ์๊ณ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ํ
์คํธ๋ฅผ ์ฌ์ ๋ ฌ ํ ์์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ๊ธฐ ์ํด ๊ฐ ํ
์คํธ์ np.random.seed(0)
์ค์ ํ์ต๋๋ค. ๊ทธ๋ ๊ฒํ์๋ง์ GSCV ์ค๋ฅ์ ๊ฑธ๋ฆฐ ๋ชจ๋ ํ
์คํธ๊ฐ ๋ค์ ์๋ํ๊ธฐ ์์ํ์ต๋๋ค.
def test_name():
np.random.seed(0)
test_code_involving_gscv_here
์ด๊ฒ์ด ๋๋ฒ๊น ์ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
๊ฐ๋ฐ ํ๊ฒฝ :
Mac OS X (Sierra)
ํ์ด์ฌ 2.7
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ต์ ๋ฒ์ .
@ClimbsRocks ๊ธ์, ๊ทธ๊ฒ์ ์๋ง๋ ๋น์ ์ ์ถ์ ๊ธฐ์์ ์ฝ๊ฐ์ ์ค๋ฅ ์ผ ๊ฒ์ ๋๋ค. ์ฌํ ๊ฐ๋ฅํ ์๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค.)
@amueller : ์ข์ ์ ํ์ ๋๋ค. ๋๋ ์ฌ๋ฌ๋ถ๋ค์ด ์ด๊ฒ์ ์ฌํ ํ ์ ์๋๋ก ๋๋ญ ๊ฐ์ง๋ฅผ ์๋ฅด๊ธฐ ์ํด ๋ฌ๋ ค ๊ฐ์ง๋ง ์ด๋ฒ์๋ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์คํ๋์์ต๋๋ค.
ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์์๋ Pathos์ ๋ณ๋ ฌํ๋ฅผ ์ฌ์ฉํ ๋ GSCV์ ๋ณ๋ ฌํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ง๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ง๋์ฃผ์ ๋ด๊ฐ ๋ณ๊ฒฝ ํ ์ ์ผํ ๋ค๋ฅธ ๊ด๋ จ ์ฌํญ์ ๋๋ค.
๋๋ ๊ทธ ์ดํ๋ก ๊ทธ๋ค์ ๋ค์ค ์ฒ๋ฆฌ ํ์ ๋ ์ฒ ์ ํ ๋ซ๊ณ ์ด๋๋ก ๋ฆฌํฉํ ๋งํ์ต๋๋ค.
๋๋ฅผ ๋ง๋๋ ๊ฒ์ ์ถ์ ๊ธฐ ์ค ํ๋์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ํ ์คํธ ์ค์ํธ๋ฅผ ๋น๋ ํ ๋ ๊ฐ ํ ์คํธ๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์คํ๋๊ณ ํต๊ณผ๋์๋ค๋ ๊ฒ์ ๋๋ค. ๋์ผํ ํจ์ค์์ ์ฌ๋ฌ ํ ์คํธ๋ฅผ ์คํํ์ ๋๋ง GSCV์ ์์กดํ์ฌ ์ค๋จ๋๊ธฐ ์์ํ์ต๋๋ค.
์ด ๋ถํ์ค์ฑ์ ์ธ๊ธํ๊ธฐ ์ํด ์ด์ ์ฃผ์์ ํธ์งํ์ต๋๋ค.
joblib๋ฅผ ๋ค๋ฅธ ๋ณ๋ ฌํ์ ๊ฒฐํฉํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฏ๋ก ์๋ํด์๋ ์๋ฉ๋๋ค.
์ด ์ค๋ ๋์ ๋ํด ์ฃ์กํ์ง๋ง์ด ๋ฌธ์ ๋ ๋ฐ์ํฉ๋๋ค.
Python 3.5 ์ปค๋์ ๋ง๋ค๊ณ forkserver์ ๋ํ ์์
lib ์์ ๋ฐฉ๋ฒ์ ์ ์ํ์ง๋ง ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ค์ ๋ก n_jobs = 1์์๋ ์๋ํ์ง ์์ต๋๋ค. ๋ง์ง๋ง ๋งค๊ฐ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๊ณ์ฐํ๋ ๊ฒ์ ๋ด ๋๋ค.
๋ด์ค๊ฐ ์์ต๋๊น?
์ค์ ๋ก n_jobs = 1์์๋ ์๋ํ์ง ์์ต๋๋ค. ๋ง์ง๋ง ๋งค๊ฐ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๊ณ์ฐํ๋ ๊ฒ์ ๋ด ๋๋ค.
์ด๊ฒ์ ์ด์ํ๊ณ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค (์ฝ n_jobs != 1
). ์ข์ ํผ๋๋ฐฑ์ ์ป๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ๋
๋ฆฝ ์คํ ํ ์ค ๋ํซ์ผ๋ก ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์
๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ง์ ์ ํ๊ณ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ๋ง์ ์กฐํฉ์ ์๋ํ ํ n_jobs> 1๋ก ์ํํ๋ ๋ชจ๋ ์์ ์ ๋ช ๋ฒ ์ ์ ํ์ ๋ฉ ์ถฅ๋ ๋ค. ๋๋ sklearn = 0.19.0์ Ubuntu Linux ๋ฉํ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ์ด๊ฒ์ ๋ด๊ฐ ์ฝ์ ๋ค๋ฅธ ๊ตฌ์ฑ๊ณผ ๋ค๋ฆ ๋๋ค. ๋ค์์ "๋ถ์พ๊ฐ์์ฃผ๋"์ฝ๋์ ๋๋ค.
import xgboost as xgb
from sklearn.model_selection import GridSearchCV
cv_params = {'max_depth': [3,5,7], 'min_child_weight': [1,3,5]}
ind_params = {'learning_rate': 0.1, 'n_estimators': 1000, 'seed':0, 'subsample': 0.8, 'colsample_bytree': 0.8, 'objective': 'binary:logistic'}
optimized_XGB = GridSearchCV(xgb.XGBClassifier(**ind_params),
cv_params, scoring = 'roc_auc', cv = 5, n_jobs = 1, verbose=2)
optimized_XGB.fit(xgboost_train, label_train,eval_metric='auc')
ํฅ๋ฏธ๋ก์ด ์ ์ค ํ๋๋ xgboost๋ฅผ ๊ฐ์ ธ์ฌ ๋ model_selection์์ ๊ฐ์ ธ ์ค์ง ์์ ๊ฒ์ฒ๋ผ GridSearchCV์์ ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ๊ฐ ํ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ xgboost 0.62์ ์์ผ๋ฉฐ ์ ์ฅ์๋ฅผ ๋ณด๋ฉด ์ฌ๋ฐ๋ฅธ GridSearchCV๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ช ํํ๊ฒ ๋งํ๋ฉด, ์ง์ ์ค๋จ ๊ฒฝ๊ณ ๋ ์ ์ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ์๋๋ผ ๋น๋ฉดํ ๋ฌธ์ ์ ๋๋ค. n_jobs> 1๋ก ์คํ์ด ์ค๋จ๋๋ ๊ฒ์ ๋๋ค. ๋์์ด ๋ ์์๋ ๊ฒฝ์ฐ๋ฅผ ์ง์ ํ์ญ์์ค.
๋ฌธ์ ๋ฅผ ์ฌํํ๋ ๋ฐ ๋์์ด๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๊น?
2017 ๋
8 ์ 24 ์ผ 20:29, Xavier Amatriain [email protected]
์ผ๋ค :
์ด ๋ฌธ์ ๋ฅผ ์ง์ ์ ํ๊ณ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ๋ง์ ์๋ ํ
์กฐํฉ, ๋ด๊ฐ n_jobs> 1๋กํ๋ ๋ชจ๋ ์์ ์
์ฃผ๋ฆ. ์ ๋ sklearn = 0.19.0์ Ubuntu Linux ๋ฉํ์ ์ฌ์ฉ ์ค์ด๋ฏ๋ก
๋ด๊ฐ ์ฝ์ ๋ค๋ฅธ ๊ตฌ์ฑ๊ณผ ๋ค๋ฅธ ๊ตฌ์ฑ. ์ฌ๊ธฐ์
"๋ถ๋ฒ"์ฝ๋ :`xgboost๋ฅผ xgb๋ก ๊ฐ์ ธ ์ค๊ธฐ
sklearn.model_selection์์ ๊ฐ์ ธ ์ค๊ธฐ GridSearchCV
cv_params = { 'max_depth': [3,5,7], 'min_child_weight': [1,3,5]}ind_params = { 'ํ์ต _ ์๋': 0.1, 'n_estimators': 1000, '์จ์': 0,
'subsample': 0.8, 'colsample_bytree': 0.8, 'objective': ' binary : logistic '}
optimize_XGB = GridSearchCV (xgb.XGBClassifier (** ind_params),
cv_params, ์ ์ = 'roc_auc', cv = 5, n_jobs = 1, verbose = 2)
optimize_XGB.fit (xgboost_train, label_train, eval_metric = 'auc')`ํฅ๋ฏธ๋ก์ด ์ ์ค ํ๋๋ xgboost๋ฅผ ๊ฐ์ ธ์ฌ ๋
GridSearchCV์์ ๊ฐ์ ธ ์ค์ง ์์ ๊ฒ์ฒ๋ผ ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ
model_selection. ๊ทธ๋ฌ๋ ๋๋ xgboost 0.62๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ
์ ์ฅ์๋ ์ฌ๋ฐ๋ฅธ GridSearchCV๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋๋ ค๊ณ
๋ถ๋ช ํ ๊ฒ์ ์ง์ ์ค๋จ ๊ฒฝ๊ณ ๊ฐ ์ ์ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ์๋๋ผ
์์ ํ๋ : n_jobs> 1๋ก ์คํ ์ค์ง. ๊ทธ๋ฅ ์ง์
๋์์ด ๋ ์์๋ ๊ฒฝ์ฐ.โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment-324597686 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAEz66DbfTlnU_-dcxLKa5zkrcZ-0qVOks5sbVCmgaJpZM4FqYlN
.
๋ฌผ๋ก ์
๋๋ค. ๋ค์์์ ์ฌ์ฉ์ค์ธ ์ ํํ ํ์ผ์ ๋ค์ด๋ก๋ ํ ์ ์์ต๋๋ค.
https://xamat.github.io/xgboost_train.csv
https://xamat.github.io/label_train.csv
HTTP404
์ฃ์กํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๋งํฌ์ ์ค๋ฅ๊ฐ ์์ต๋๋ค. ์ด์ ์์ ๋์ด์ผํฉ๋๋ค. ๋ ๋ฒ์งธ๋ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ๋ฐฉ๊ธ ํ์ธํ์ต๋๋ค.
xgboost์ ์๋ ค์ง ๋ฌธ์ ๋ https://github.com/scikit-learn/scikit-learn/issues/6627#issuecomment -206351138์ ์ฐธ์กฐ
์ฐธ๊ณ ๋ก joblib ์
์ฌ์ ํ ๋ฒ๊ทธ์
๋๊น? 80 ๊ฐ์ ๋งค๊ฐ ๋ณ์ ์กฐํฉ๊ณผ ShuffleSplit CV (n = 20)๋ฅผ ์ฌ์ฉํ์ฌ RandomForestClassifier
์ฌ์ฉํ๋ pre_dispatch = 1๋ฟ๋ง ์๋๋ผ ๊ธฐ๋ณธ๊ฐ (n_jobs = 1)์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ํ ํ์ดํ ๋ผ์ธ ( SelectKBest(score_func=mutual_info_classif, k=10)
๋ค์์ RandomForestClassifier
)์ ๋ํด ์ค๋จ๋ฉ๋๋ค. ๋ ๋ค ์ต์ ๋ฆด๋ฆฌ์ค์ ๊ฐ๋ฐ ๋ฒ์ ์์ ๋ชจ๋ ์ค๋จ๋ฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ ์์ ์ ์ผ๋ก ์๋ํ๋ ๋ค๋ฅธ ๋ชจ๋ธ ์ ํ ๋ฐฉ๋ฒ์ ์ฐพ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์. scikit-optimize
์๋๋ฅผ ๊ณ ๋ ค ์ค์
๋๋ค.
n_jobs = 1์ ์๋ฏธํฉ๋๊น ์๋๋ฉด ์คํ์ ๋๊น? ์ด ๋ฌธ์ ๋ n_jobs! = 1์ ๊ดํ ๊ฒ์ ๋๋ค.
ํ์ง ํผ๋๋ฐฑ์ ์ป๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ๋ณด๊ณ ์๋ ๋ฌธ์ ๊ฐ ์ค์ ๋ก n_jobs = 1์์๋ ๊ฒฝ์ฐ์ด ๊ฒฝ์ฐ ๋ณ๋์ ๋ฌธ์ ๋ฅผ์ฌ์ญ์์ค.
"๋ฉํฐ ์ค๋ ๋ฉ ๊ฐ๋ฅ"์ด๋ผ๋ ๋ป์ ์ผ์ต๋๋ค.
n_jobs! = 1์ '1๊ณผ ๊ฐ์ง ์์'๊ณผ ๊ฐ์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก n_jobs> 1์
๋๋ค. ์ : n_jobs = 4
n_jobs = 4์ ๋ํ ๋๊ฒฐ์ ์ฌํ ํ ์ ์๋ค๋ ๋ง์ ๋๊น?
๊ทธ๋ ๋ค๋ฉด ํ ๋ฌ ์ด๋ด์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ๊ณต ํ ๊ฒ์ ๋๋ค (์๋ก์ด ๋จธ์ ์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค).
2017 ๋ 9 ์ 12 ์ผ ์ค์ 7์ 10 ๋ถ์ Loรฏc Estรจve < [email protected] [email protected] >์ด ์์ฑํ์ต๋๋ค.
n_jobs = 1์ ์๋ฏธํฉ๋๊น ์๋๋ฉด ์คํ์ ๋๊น? ์ด ๋ฌธ์ ๋ n_jobs! = 1์ ๊ดํ ๊ฒ์ ๋๋ค.
ํ์ง ํผ๋๋ฐฑ์ ์ป๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ๋ณด๊ณ ์๋ ๋ฌธ์ ๊ฐ ์ค์ ๋ก n_jobs = 1์์๋ ๊ฒฝ์ฐ์ด ๊ฒฝ์ฐ ๋ณ๋์ ๋ฌธ์ ๋ฅผ์ฌ์ญ์์ค.
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment-328864498 ์์ ๋ณด๊ฑฐ๋ https://github.com/notifications/unsubscribe- ์ค๋ ๋๋ฅผ ์์๊ฑฐํฉ๋๋ค.
@smcinerney @raamana์
๋๊น? ๋๋ @lesteve ๊ฐ n_jobs=1
๋ฅผ ์ด @raamana ์๊ฒ ๋ต์ฅ์ํ๋ค๊ณ ์๊ฐ ํ๋๋ฐ , ์ด๊ฒ์์ด ๋ฌธ์ ์ ๊ด๋ จ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ์ฃ์กํฉ๋๋ค. ์ ๋ @raamana๊ฐ ์๋๋๋ค. ์ @raamana์ ๋ฌธ์ ๋ ๋ค๋ฆ ๋๋ค (ํ์ง๋ง ๋์ผํ ์ฝ๋ ๋๋ฌธ์ผ ์ ์์)
2017 ๋ 9 ์ 12 ์ผ ์ค์ 9์ 23 ๋ถ์ Andreas Mueller < [email protected] [email protected] >์ด ์์ฑํ์ต๋๋ค.
@smcinerney https://github.com/smcinerney @raamana https://github.com/raamana ์ ๋๊น? ๋๋ @lesteve https://github.com/lesteve ๊ฐ n_jobs = 1์ ์์ฑํ @raamana https://github.com/raamana ์๊ฒ ํ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.์ด ๋ฌธ์ ์ ๊ด๋ จ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment-328905819 ์์ ๋ณด๊ฑฐ๋ https://github.com/notifications/unsubscribe- ์ค๋ ๋๋ฅผ ์์๊ฑฐํฉ๋๋ค.
๋ด ์๋ชป์ด์ผ, ๋๋ ๋ฌผ๊ฑด์ ์์ ์๋๊ฐ ์์์ต๋๋ค. ๋๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ด โโ๊ฒ์ ๋๋ค (์ต์ํ์ ์ฝ๋๋ก ์ฌํ), ๊ธฐ๋ณธ n_jobs = 1๋ก๋ ์ค๋จ๋์ง ์๋ GridSearchCV๋ n_jobs> 1๋ณด๋ค ๋ ํฐ ๊ด์ฌ์ฌ์ ๋๋ค (๊ธฐ๋ณธ๊ฐ์ด๊ณ ์๋ํด์ผ ํจ).
@raamana ์, ๋ ํฐ ๋ฌธ์ ์ด์ง๋ง ๊ด๋ จ ๋ฌธ์ ๋ก ์ธํด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ๋ ์ ์ต๋๋ค.
@ eric-czech @jnothman
๋ฐ๋ผ์ backend = 'threading'์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ. sklearn ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ฌ์ด ๋ฐฉ๋ฒ ์ค ํ๋๋ GSV์ fit ๋ฐฉ๋ฒ์ ๋ณ๊ฒฝํ์ง ์๊ณ parallel_backend ์ปจํ
์คํธ ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
from sklearn.externals.joblib import parallel_backend
clf = GridSearchCV()
with parallel_backend('threading'):
clf.fit(x_train, y_train)
์ถ์ : "์ค๋ ๋ฉ"์ด ๋ชจ๋ ๊ฒฌ์ ์์๊ฒ ์๋ํ๋์ง ํ์คํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ GSV njob> 1์ ์ฌ์ฉํ๋ ๋ด ๊ฒฌ์ ๊ธฐ์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์์๋๋ก ์๋ํฉ๋๋ค.
์์คํ
์๋ :
MAC OS : 10.12.6
ํ์ด์ฌ : 3.6
numpy == 1.13.3
ํ๋ค == 0.21.0
scikit-learn == 0.19.1
ํ ... ์ค๋ ๋ฉ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋์์ฑ ๋ฌธ์ ๊ฐ์์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๋ ๊ฒ์, ์๋ฅผ ๋ค์ด # 10329์ ๋ฒ๊ทธ๋ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ง๋ญ๋๋ค ...
2017 ๋ 12 ์ 22 ์ผ 03:59์ Trideep Rath [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@ eric-czech https://github.com/eric-czech @jnothman
https://github.com/jnothman
๋ฐ๋ผ์ backend = 'threading'์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ. ์๋ ์ฌ์ด ๋ฐฉ๋ฒ
sklearn ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ parallel_backend ์ปจํ ์คํธ ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
GSV์ ์ ํฉ ๋ฐฉ๋ฒ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.sklearn.externals.joblib์์ import parallel_backend
clf = GridSearchCV ()
parallel_backend ( 'threading') ์ฌ์ฉ :
clf.fit (x_train, y_train)์ถ์ : "์ค๋ ๋ฉ"์ด ๋ชจ๋ ๊ฒฌ์ ์์๊ฒ ์๋ํ๋์ง ํ์คํ์ง ์์ต๋๋ค. ํ์ง๋ง ๋๋
GSV njob> 1์ ์ฌ์ฉํ๋ ๋ด ์ถ์ ๊ธฐ์ ๋์ผํ ๋ฌธ์ ๊ฐ ์๊ณ ์ด๊ฒ์ ์ฌ์ฉํ์ฌ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์์๋๋ก ์๋ํฉ๋๋ค.์์คํ ์๋ :
MAC OS : 10.12.6
ํ์ด์ฌ : 3.6
numpy == 1.13.3
ํ๋ค == 0.21.0
scikit-learn == 0.19.1โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment-353402474 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAEz64SfwYpjLU1JK0vukBRXJvWYs3LKks5tCo51gaJpZM4FqYlN
.
์ฌ๋ก : ๋ฐฑ์๋๋ฅผ "์ค๋ ๋ฉ"์ผ๋ก ์ฌ์ฉํ๊ณ BaseEstimator ๋ฐ ClassifierMixin์ ํ์ฅํ๋ Estimator๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฒฝ์ ์กฐ๊ฑด์ด ์ด๋์์ ๋ฐ์ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ด ์ดํด์ ์คํ์ ๋ฐ๋ฅด๋ฉด ๊ฒฝ์ ์กฐ๊ฑด์ ๊ด์ฐฐํ์ง ๋ชปํ์ต๋๋ค.
out = Parallel(
n_jobs=self.n_jobs, verbose=self.verbose,
pre_dispatch=pre_dispatch
)(delayed(_fit_and_score)(clone(base_estimator), X, y, scorers, train,
test, self.verbose, parameters,
fit_params=fit_params,
return_train_score=self.return_train_score,
return_n_test_samples=True,
return_times=True, return_parameters=False,
error_score=self.error_score)
for parameters, (train, test) in product(candidate_params,
cv.split(X, y, groups)))
_fit_and_score๋ clone (base_estimator)์์ ํธ์ถ๋ฉ๋๋ค. ์ด๊ฒ์ deep_copy๋ฅผ ์ํํ๊ณ ์์ฒด ๋ฐ์ดํฐ์ ์ฌ๋ณธ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
out์ _fit_and_score ๋ฉ์๋์ ์ถ๋ ฅ์ ๋๋ค. ๊ทธ๋์์ด ํ ๋ชจ๋ ์ฐ๋ ๋๋ ์ถ์ ๊ธฐ์ fit ๋ฐฉ๋ฒ ์คํ์ ์๋ฃํ๊ณ ๊ฒฐ๊ณผ๋ฅผ๋ณด๊ณ ํฉ๋๋ค.
๊ฒฐ๊ณผ๋ GCV_clf.cv_results_์์ ์ป์ ๊ฒ์ ๋๋ค.
์ด ํน์ ๊ฒฝ์ฐ์ ์ ๊ฒฝ์ ์กฐ๊ฑด์ด ๋ฐ์ํ๋์ง ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
๊ฒฝ์ ์กฐ๊ฑด์ ์ค์ฒฉ ๋ ๋งค๊ฐ ๋ณ์๋ฅผ ์ค์ ํ๋ ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค.
๋ณ๊ฒฝ๋ ํ๋์ ๋งค๊ฐ ๋ณ์๋ ์ถ์ ๊ธฐ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ๊ทธ ๋งค๊ฐ ๋ณ์์
๋๋ค.
ํ๊ฐ์.
์ต์ ๋ฒ์ ์ Win 7์์ make_scorer
์ GridSearchCv
๋ฐ n_jobs=-1
ํจ๊ป ์ฌ์ฉํ๋ฉด ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
Windows-7-6.1.7601-SP1
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]
NumPy 1.12.1
SciPy 1.0.0
Scikit-Learn 0.19.1
@mansenfranzen ๋ฒ์ ๊ณผ ํ๋ซํผ์ ๊ฒ์ https://stackoverflow.com/help/mcve ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ฌ์ฉ์ ์ง์ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ก Win7์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํด์ฒด์ธ :
Python 3.6.2
NumPy 1.13.1, 1.14.2 (under both)
SciPy 1.0.0
SkLearn 0.19.1
MCVE :
from sklearn.pipeline import Pipeline, make_pipeline
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
import numpy as np
class CustomTransformer:
def fit(self, X, y):
return self
def transform(self, X):
return X
pipeline = make_pipeline(CustomTransformer(),
SVC())
X_train = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]])
y_train = np.array([1.0, 0.0, 0.0, 1.0])
print(cross_val_score(pipeline, X_train, y_train, cv=2, n_jobs=-1))
ํ์ด์ฌ ๋ค์ค ์ฒ๋ฆฌ๊ฐ if
__name__ == '__main__'
์์ด Windows์์ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๊น?
๋ค, ๊ทธ๋ ์ต๋๋ค. ์ฃ์กํฉ๋๋ค. Jupyter๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ์ฌ์ค์ ์์ด ๋ฒ๋ ธ์ต๋๋ค.
if __name__ == '__main__'
๊ฐ ํฌํจ ๋ ๋
๋ฆฝ ์คํ ํ ์คํฌ๋ฆฝํธ๋ ๋ค์ ์ถ์ ์ ์ธ์ ํ ๋ค์ ์ฌ์ ํ ์ ์ง๋ฉ๋๋ค.
Process SpawnPoolWorker-1:
Traceback (most recent call last):
File "C:\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap
self.run()
File "C:\Python\Python36\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "C:\Python\Python36\lib\multiprocessing\pool.py", line 108, in worker
task = get()
File "C:\Python\Python36\lib\site-packages\sklearn\externals\joblib\pool.py", line 362, in get
return recv()
File "C:\Python\Python36\lib\multiprocessing\connection.py", line 251, in recv
return _ForkingPickler.loads(buf.getbuffer())
AttributeError: Can't get attribute 'CustomTransformer' on <module '__mp_main__' from 'C:\\projects\\Python\\Sandbox\\test.py'>
< same for SpawnPoolWorker-3 here >
์ค, ํฅ๋ฏธ ๋กญ๊ตฐ์. ํ๋ฒํ ๊ฒ์ผ๋ฆ์ผ๋ก ์ ์ฒด ์คํฌ๋ฆฝํธ๋ฅผ if __name__ == '__main__'
์๋์ ๋๊ณ ์ด์ ์ฃผ์์์ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค.
์ด์ pipeline = make_pipeline...
๋ง ๋ฐฐ์นํ๊ณ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋์์ต๋๋ค. Jupyter์ ์์ธ์ผ๊น์?
์ด์จ๋ ์ด์ ๋๊ธ์ ๋์์ด ์ ํจํ๊ณ if __name__ == '__main__'
์ ๋ถ์ ์ ํ ์ฌ์ฉ์ผ๋ก ์ธํ ๊ฒ์ธ์ง ์๋๋ฉด SkLearn์ ์๋ชป์ธ์ง ์ ์ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ง๋ง ์คํ์ ๋ํด์๋
Windows์์ ๋ค์ค ์ฒ๋ฆฌ๋ฅผ์ํ ์ปจํ
์คํธ ...
์ ๊ฑด ๋๋ฝ๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ๋ชจ๋ ๊ฒ์ ๋์ผํ ๋ฒ์ ์ผ๋ก Ubuntu์์ ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์์์ต๋๋ค. ๋์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์ด ๋ฒ๊ทธ๊ฐ ์ด์ ์๊ณ ์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
jupyter ๋ ธํธ๋ถ, Python3, Sklearn 0.19.1์ Windows 10์์ ์คํ
Linux Mint (Ubuntu 16.10) Python 3.5์์ ๋์ผํ ๋ฌธ์
๋ชจ๋ ๊ฒ์ด ๊ฐ ์ฝ์ด์ ์ฒซ ๋ฒ์งธ Epoch์์ ๋ฉ์ถ๊ณ CPU๊ฐ ์ค๊ฐ์ ์๊ธฐ ๋๋ฌธ์ ์์ ์ด ์ํ๋์ง ์์ต๋๋ค.
@MrLobs ๋ ์ฐ์ธ ์ค๋ฅ์ฒ๋ผ ๋ค๋ฆฌ ์ฃ ? CustomTransformer๋ฅผ ๋ณ๋์ ํ์ด์ฌ ํ์ผ์ ๋ฃ์ต๋๋ค.
@ Chrisjw42 @avatsaev ๋ ๋ง์ ์ปจํ
์คํธ๊ฐ ์์ผ๋ฉด ์ฐ๋ฆฌ๋ ์ค์ ๋ก ๋ง์ด ํ ์ ์์ต๋๋ค.
@avatsaev ๊ฐ
@amueller ์, ํ ์ ํ๋ก์ฐ์ ๋๋ค
@avatsaev ๋ ์์ง ์ ๋ณด๊ฐ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ฌํ ํ ์ต์ํ์ ์๊ฐ ์์ต๋๊น? ์ด๋ค blas๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น, GPU๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น, scikit-learn์ ์ด๋ค ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๊น ....
Ok ๊ทธ๊ฒ์ ๋ด๊ฐ TF GPU๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ n_jobs๋ฅผ> 1๋ก ์ค์ ํ๋ ๊ฒ์ด ์ค์ ๋ก ์๋ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ GPU๊ฐ ํ๋๋ฟ์ด๊ธฐ ๋๋ฌธ์ ์ ์์ ๋๋ค.
๋ค, TF์ ํจ๊ป n_jobs๋ฅผ ์ค์ ๋ก ์ฌ์ฉํด์๋ ์๋ฉ๋๋ค.
์ ์๋ผ?
@amueller , ์, ์ฌ์ฉ์ ์ ์ ๋ณํ๊ธฐ๋ฅผ ๋ณ๋์ ํ์ผ์ ๋ฃ์ผ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค.
n_jobs! = 1์ด ์ค๋จ ๋ ํ๊ฒฝ์์ ์ค๋ฅ (๋๋ ์ต์ํ ๊ฒฝ๊ณ )๋ฅผ ๋์ง ์ ์์ต๋๊น? ๋ฐฉ๊ธ jupyter ๋ ธํธ๋ถ์์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ง์ฝ ์ ๊ฐ ๋ ์ด๋ณด์ ์ธ ๊ฒฝ์ฐ (๋๋จธ์ง ํ๊ธ์ฒ๋ผ) ์ gridsearchcv๊ฐ ๊ณ์ ๋งค๋ฌ๋ฆฌ๋ ์ง ์ ์ ์์์ ๊ฒ์ ๋๋ค. ์ฌ์ค ์ฐ๋ฆฌ ์ ์๋์ n_jobs =- 1. ์ฌ๊ธฐ์์ ๋ฌธ์ ๊ฐ ์๋ ค์ง ๊ฒฝ์ฐ ํจํค์ง (keras ๋๋ sklearn ์ค ์ด๋ ๊ฒ)์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ผ๊ณ ๊ฒฝ๊ณ ํ๊ณ ์ค๋จ์ ๋ฐฉ์ง ํ ์ ์์ต๋๊น?
๋๋ ์ด๊ฒ์ด ์ด๋ค ํ๊ฒฝ์ ์ฒํ๊ฒ ๋ ์ง ์๋ฌด๋ ๋ชจ๋ฅธ๋ค๊ณ ์๊ฐํ๋ค. ๋๋ ๋๊ตฌ๋์ด ๋ฒ๊ทธ๋ฅผ ์ ๋ขฐํ ์์๋ ๋ฐฉ์์ผ๋ก ์ฌํ ํ ์ ์๋ค๊ณ ๋ฏฟ์ง ์๋๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ค์ค ์ฒ๋ฆฌ ์ธํ๋ผ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ด ๊ทธ๋ฌํ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ง ํ์คํ์ง ์์ต๋๋ค.
@jnothman ๐
๋ฃ๊ธฐ ์ข์ต๋๋ค!
์ ์ด๊ฒ์ด 0.21 ํ๊ทธ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ 0.20์์ ํด๊ฒฐ๋ฉ๋๋ค. ์ ๋ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๋ซ๊ณ ์ฌ๋๋ค์ด ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ด๋๋กํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋๋ฌด ๊ธธ๊ณ ๊ตฌ์ฒด์ ์ด์ง ์์ต๋๋ค.
jupyter๋ฅผ ์ฌ์ฉํ์ฌ AWS Ubuntu์์ ๋ฐฉ๊ธ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ง๋ฌ์ต๋๋ค.
parallel_backend ์ฌ์ฉ์ด ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค ...
from sklearn.externals.joblib import parallel_backend
clf = GridSearchCV(...)
with parallel_backend('threading'):
clf.fit(x_train, y_train)
@morienor scikit-learn 0.20.1๋ก์ด ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ฌ๋์ด ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์๋๋ก ํ์ํ ๋ชจ๋ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ ๋ ์ ๋ฌธ์ ๋ฅผ ์ฝ๋ ๋ค (๊ฐ์ง ์์ ๋ฐ์ดํฐ ์ธํธ์ ๋ํ import ๋ฌธ์ด ํฌํจ ๋ ์ ์ฒด ์คํฌ๋ฆฝํธ). python, scikit-learn, numpy, scipy ๋ฐ ์ด์ ์ฒด์ ์ ๋ชจ๋ ๋ฒ์ ๋ฒํธ์ ํจ๊ป.
jupyter๋ฅผ ์ฌ์ฉํ์ฌ AWS Ubuntu์์ ๋ฐฉ๊ธ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ง๋ฌ์ต๋๋ค.
parallel_backend ์ฌ์ฉ์ด ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค ...
from sklearn.externals.joblib import parallel_backend clf = GridSearchCV(...) with parallel_backend('threading'): clf.fit(x_train, y_train)
๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค! ๊ฐ์ฌํฉ๋๋ค!
@ jmq19950824 @morienor ์,ํ์ง๋ง GIL๋ก ์ธํด threading
๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
jupyter๋ฅผ ์ฌ์ฉํ์ฌ AWS Ubuntu์์ ๋ฐฉ๊ธ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ง๋ฌ์ต๋๋ค.
parallel_backend ์ฌ์ฉ์ด ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค ...
from sklearn.externals.joblib import parallel_backend clf = GridSearchCV(...) with parallel_backend('threading'): clf.fit(x_train, y_train)
์ฒ์ฌ๋ ๋๋ฅผ ์ํด ์ผํ๋ค
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@ eric-czech Python 3.4 ๋๋ 3.5 ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ ๋ค์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ๋ค์ Python ํ๋ก๊ทธ๋จ์ ๋ค์ ์์ํ์ญ์์ค.
joblib ๋ฌธ์์ ์ค๋ช ๋๋๋ก. forkserver is mode๋ ๋ํ์์ผ๋ก ์ ์ ๋ ๊ธฐ๋ฅ์ ์ค๋จํ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ง ์์ต๋๋ค.