Cộng đồng Hỏi & Đáp của Inflearn
UnicodeEncodeError: 'ascii' codec can't encode characters in position 18-20: ordinal not in range(128)
Đã giải quyết
Viết
·
4.8K
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) 저와 비슷한 에러가 발생하는 사람이 있는데, 답변자는 없어서 혹시 철민님은 아실까 하여 여쭤봅니다.
제 기억에는 아마 예전에 돌렸을 때는 정상 작동을 했었던 갓 같은데, 최근 다시 돌려보니 갑자기 왜 이런 문제가 발생했는지 모르겠습니다.
Quiz
결정 트리(Decision Tree) 모델이 데이터를 분할(Split)할 때 사용하는 주요 기준 지표로 가장 적절한 것은 무엇일까요?
평균 제곱 오차 (Mean Squared Error)
정보 이득 (Information Gain) 또는 지니 계수 (Gini Coefficient)
회귀 계수 (Regression Coefficient)
주성분 (Principal Component)
Câu trả lời 3
1
1
안녕하십니까,
이게 강의 데이터/실습 코드를 사용할 경우에 발생하는 건지요? 일단 데이터가 강의 데이터가 아닌걸로 로 간주하고 검색을 해보았습니다.
해당 오류가 굉장히 광범위한 경우에 발생을 하는 군요. 제 생각엔 최근에 뭔가 새로운 패키지를 설치하면서 패키지들간 버전이 틀어진것 같습니다만 일단 비슷한 경우를 아래 stackover flow에서 발견했습니다.
C:\ProgramData\Anaconda3\lib\site-packages\joblib\externals\loky\backend\resource_tracker.py 의 _send(...)를 stackover에서 언급된대로 수정을 해야 될 것 같습니다.
그런데 이걸 적용하려면 소스코드를 바꾼 뒤에 캐쉬를 지우거나, 서버를 재 기동한 다음에 적용을 해야 할 것 같습니다. 적용후에 결과 update 부탁드립니다(저도 결과가 궁금해서요 ^^)
감사합니다.
0
강의 데이터/실습을 사용하는 중에 발생한 에러 맞습니다. 내용은 책 4.4장 랜덤포레스트(220쪽)입니다.
전에는 잘 작동했었는데 복습하려고 다시 돌려보니 에러가 발생하네요
-> 결과적으로 철민님께서 알려주신 방법으로 resource_tracker.py 파일 열어서 수정하니 정상 작동됩니다.
오늘 이것 때문에 몇시간동안 씨름하다가 포기했었는데 덕분에 해결되었습니다ㅠㅠ 진심 행복합니다.
앞으로 평생 구글코랩만 써야하나 별 생각을 다했었네요.
이렇게 말씀으로밖에 감사한 마음을 전달할 수가 없지만.. 다시 한번 감사합니다. 철민님도 행복하세요





