인프런 커뮤니티 질문&답변

헬로월드님의 프로필 이미지
헬로월드

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

배깅(Bagging)과 랜덤 포레스트(Random Forest)의 이해

UnicodeEncodeError: 'ascii' codec can't encode characters in position 18-20: ordinal not in range(128)

해결된 질문

작성

·

4.1K

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

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

이게 강의 데이터/실습 코드를 사용할 경우에 발생하는 건지요? 일단 데이터가 강의 데이터가 아닌걸로 로 간주하고 검색을 해보았습니다. 

해당 오류가 굉장히 광범위한 경우에 발생을 하는 군요. 제 생각엔 최근에 뭔가 새로운 패키지를 설치하면서 패키지들간 버전이 틀어진것 같습니다만 일단 비슷한 경우를 아래 stackover flow에서 발견했습니다.

https://stackoverflow.com/questions/64176343/unicodeencodeerror-ascii-codec-cant-encode-characters-in-position-18-23-ord

C:\ProgramData\Anaconda3\lib\site-packages\joblib\externals\loky\backend\resource_tracker.py 의 _send(...)를 stackover에서 언급된대로 수정을 해야 될 것 같습니다. 

그런데 이걸 적용하려면 소스코드를 바꾼 뒤에 캐쉬를 지우거나, 서버를 재 기동한 다음에 적용을 해야 할 것 같습니다. 적용후에 결과 update 부탁드립니다(저도 결과가 궁금해서요 ^^)

감사합니다.

0

헬로월드님의 프로필 이미지
헬로월드
질문자

강의 데이터/실습을 사용하는 중에 발생한 에러 맞습니다. 내용은 책 4.4장 랜덤포레스트(220쪽)입니다.

전에는 잘 작동했었는데 복습하려고 다시 돌려보니 에러가 발생하네요

-> 결과적으로 철민님께서 알려주신 방법으로 resource_tracker.py 파일 열어서 수정하니 정상 작동됩니다.

오늘 이것 때문에 몇시간동안 씨름하다가 포기했었는데 덕분에 해결되었습니다ㅠㅠ 진심 행복합니다.

앞으로 평생 구글코랩만 써야하나 별 생각을 다했었네요.

이렇게 말씀으로밖에 감사한 마음을 전달할 수가 없지만.. 다시 한번 감사합니다. 철민님도 행복하세요

헬로월드님의 프로필 이미지
헬로월드

작성한 질문수

질문하기