해결된 질문
20.12.01 12:45 작성
·
4K
0
안녕하세요. 수업 잘 듣고 있습니다. 벌써 12월이네요ㅎㅎ
GridSearchCV로 랜덤포레스트 하이퍼 파라미터 튜닝하는 과정에서 에러가 발생해서 문의드립니다.
책으로는 220페이지의 코드입니다.
-------------------------------------------------------------------------------------------
from sklearn.model_selection import GridSearchCV
params = {'n_estimators':[100],
'max_depth':[6,8,10,12],
'min_samples_leaf':[8,12,18],
'min_samples_split':[8,16,20]}
rf_clf = RandomForestClassifier(random_state=0, n_jobs=-1) # n_jobs=-1 : 모든 CPU 코어를 이용해 학습
grid_cv = GridSearchCV(rf_clf, param_grid=params, cv=2, n_jobs=-1)
grid_cv.fit(X_train, y_train)
print('최적 하이퍼 파라미터:\n',grid_cv.best_params_)
print('최고 예측 정확도:{0:.4f}'.format(grid_cv.best_score_))
------------------------------------------------------------------------------------------
이렇게 철민님과 동일한 코드를 입력했는데
UnicodeEncodeError: 'ascii' codec can't encode characters in position 18-20: ordinal not in range(128)
이와 같은 에러가 생깁니다.
보니까 모델에 fit하는 과정에서 발생한 에러인데요
전체 에러 코드는 다음과 같습니다.
--------------------------------------------------------------------------- UnicodeEncodeError Traceback (most recent call last) <ipython-input-15-c470a9641bfc> in <module> 8 rf_clf = RandomForestClassifier(random_state=0, n_jobs=-1) # n_jobs=-1 : 모든 CPU 코어를 이용해 학습 9 grid_cv = GridSearchCV(rf_clf, param_grid=params, cv=2, n_jobs=-1) ---> 10 grid_cv.fit(X_train, y_train) 11 12 print('최적 하이퍼 파라미터:\n',grid_cv.best_params_) C:\ProgramData\Anaconda3\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs) 70 FutureWarning) 71 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)}) ---> 72 return f(**kwargs) 73 return inner_f 74 C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py in fit(self, X, y, groups, **fit_params) 693 verbose=self.verbose) 694 results = {} --> 695 with parallel: 696 all_candidate_params = [] 697 all_out = [] C:\ProgramData\Anaconda3\lib\site-packages\joblib\parallel.py in __enter__(self) 728 def __enter__(self): 729 self._managed_backend = True --> 730 self._initialize_backend() 731 return self 732 C:\ProgramData\Anaconda3\lib\site-packages\joblib\parallel.py in _initialize_backend(self) 739 try: 740 n_jobs = self._backend.configure(n_jobs=self.n_jobs, parallel=self, --> 741 **self._backend_args) 742 if self.timeout is not None and not self._backend.supports_timeout: 743 warnings.warn( C:\ProgramData\Anaconda3\lib\site-packages\joblib\_parallel_backends.py in configure(self, n_jobs, parallel, prefer, require, idle_worker_timeout, **memmappingexecutor_args) 495 n_jobs, timeout=idle_worker_timeout, 496 env=self._prepare_worker_env(n_jobs=n_jobs), --> 497 context_id=parallel._id, **memmappingexecutor_args) 498 self.parallel = parallel 499 return n_jobs C:\ProgramData\Anaconda3\lib\site-packages\joblib\executor.py in get_memmapping_executor(n_jobs, **kwargs) 18 19 def get_memmapping_executor(n_jobs, **kwargs): ---> 20 return MemmappingExecutor.get_memmapping_executor(n_jobs, **kwargs) 21 22 C:\ProgramData\Anaconda3\lib\site-packages\joblib\executor.py in get_memmapping_executor(cls, n_jobs, timeout, initializer, initargs, env, temp_folder, context_id, **backend_args) 40 _executor_args = executor_args 41 ---> 42 manager = TemporaryResourcesManager(temp_folder) 43 44 # reducers access the temporary folder in which to store temporary C:\ProgramData\Anaconda3\lib\site-packages\joblib\_memmapping_reducer.py in __init__(self, temp_folder_root, context_id) 529 # exposes exposes too many low-level details. 530 context_id = uuid4().hex --> 531 self.set_current_context(context_id) 532 533 def set_current_context(self, context_id): C:\ProgramData\Anaconda3\lib\site-packages\joblib\_memmapping_reducer.py in set_current_context(self, context_id) 533 def set_current_context(self, context_id): 534 self._current_context_id = context_id --> 535 self.register_new_context(context_id) 536 537 def register_new_context(self, context_id): C:\ProgramData\Anaconda3\lib\site-packages\joblib\_memmapping_reducer.py in register_new_context(self, context_id) 558 new_folder_name, self._temp_folder_root 559 ) --> 560 self.register_folder_finalizer(new_folder_path, context_id) 561 self._cached_temp_folders[context_id] = new_folder_path 562 C:\ProgramData\Anaconda3\lib\site-packages\joblib\_memmapping_reducer.py in register_folder_finalizer(self, pool_subfolder, context_id) 588 # semaphores and pipes 589 pool_module_name = whichmodule(delete_folder, 'delete_folder') --> 590 resource_tracker.register(pool_subfolder, "folder") 591 592 def _cleanup(): C:\ProgramData\Anaconda3\lib\site-packages\joblib\externals\loky\backend\resource_tracker.py in register(self, name, rtype) 189 '''Register a named resource, and increment its refcount.''' 190 self.ensure_running() --> 191 self._send('REGISTER', name, rtype) 192 193 def unregister(self, name, rtype): C:\ProgramData\Anaconda3\lib\site-packages\joblib\externals\loky\backend\resource_tracker.py in _send(self, cmd, name, rtype) 202 203 def _send(self, cmd, name, rtype): --> 204 msg = '{0}:{1}:{2}\n'.format(cmd, name, rtype).encode('ascii') 205 if len(name) > 512: 206 # posix guarantees that writes to a pipe of less than PIPE_BUF UnicodeEncodeError: 'ascii' codec can't encode characters in position 18-20: ordinal not in range(128)
한글 인코딩이랑은 전혀 관련이 없는 상황인데 왜 이런 에러가 발생했는지 모르겠습니다.
구글링을 해보니(https://stackoverflow.com/questions/64843631/question-about-sklearn-hyperparameter-optimization) 저와 비슷한 에러가 발생하는 사람이 있는데, 답변자는 없어서 혹시 철민님은 아실까 하여 여쭤봅니다.
제 기억에는 아마 예전에 돌렸을 때는 정상 작동을 했었던 갓 같은데, 최근 다시 돌려보니 갑자기 왜 이런 문제가 발생했는지 모르겠습니다.
답변 3
1
1
2020. 12. 01. 20:12
안녕하십니까,
이게 강의 데이터/실습 코드를 사용할 경우에 발생하는 건지요? 일단 데이터가 강의 데이터가 아닌걸로 로 간주하고 검색을 해보았습니다.
해당 오류가 굉장히 광범위한 경우에 발생을 하는 군요. 제 생각엔 최근에 뭔가 새로운 패키지를 설치하면서 패키지들간 버전이 틀어진것 같습니다만 일단 비슷한 경우를 아래 stackover flow에서 발견했습니다.
C:\ProgramData\Anaconda3\lib\site-packages\joblib\externals\loky\backend\resource_tracker.py 의 _send(...)를 stackover에서 언급된대로 수정을 해야 될 것 같습니다.
그런데 이걸 적용하려면 소스코드를 바꾼 뒤에 캐쉬를 지우거나, 서버를 재 기동한 다음에 적용을 해야 할 것 같습니다. 적용후에 결과 update 부탁드립니다(저도 결과가 궁금해서요 ^^)
감사합니다.
0
2020. 12. 01. 21:14
강의 데이터/실습을 사용하는 중에 발생한 에러 맞습니다. 내용은 책 4.4장 랜덤포레스트(220쪽)입니다.
전에는 잘 작동했었는데 복습하려고 다시 돌려보니 에러가 발생하네요
-> 결과적으로 철민님께서 알려주신 방법으로 resource_tracker.py 파일 열어서 수정하니 정상 작동됩니다.
오늘 이것 때문에 몇시간동안 씨름하다가 포기했었는데 덕분에 해결되었습니다ㅠㅠ 진심 행복합니다.
앞으로 평생 구글코랩만 써야하나 별 생각을 다했었네요.
이렇게 말씀으로밖에 감사한 마음을 전달할 수가 없지만.. 다시 한번 감사합니다. 철민님도 행복하세요