가능성 추정을 사용하여 범주 형 변수 인코딩


22

가능성 추정을 사용하여 범주 형 변수를 인코딩하는 방법을 이해하려고 노력했지만 지금까지 거의 성공하지 못했습니다.

어떤 제안이라도 대단히 감사하겠습니다.


대상 레이블이 없을 때 예측 시간 동안해야 할 일은 무엇입니까?
Ranjeet Singh

답변:


24

나는이 주제도 배우고 있었고 이것들은 내가 찾은 것입니다.

  • 이러한 유형의 인코딩을 가능성 인코딩 , 영향 코딩 또는 대상 코딩이라고합니다.

  • 아이디어는 대상 변수를 사용하여 범주 변수를 인코딩합니다 (작업에 따라 연속 또는 범주). 예를 들어 회귀 작업이있는 경우 범주 변수를 대상 평균으로 인코딩 할 수 있습니다. 모든 범주에 대해 대상의 해당 평균 (이 범주 중)을 계산하고 범주 값을이 평균으로 바꿉니다.

  • 분류 작업이있는 경우 모든 범주 값과 관련하여 대상의 상대 빈도를 계산합니다.

  • 수학적 관점에서이 인코딩은 각 범주 값에 따라 목표 확률을 의미합니다.

  • 위에서 설명한 방식으로 간단한 방법으로 수행하면 편향된 추정치를 얻을 수 있습니다. 이것이 Kaggle 커뮤니티에서 보통 2 단계의 교차 검증을 사용하는 이유입니다. 읽기 여기 raddar하여이 댓글을 . 해당 노트북은 여기에 있습니다 .

인용구:

y의 평균값을 취합니다. 그러나 평범한 평균은 아니지만 교차 검증 방식 내에서 교차 검증됩니다.

20 배 교차 검증이 있다고 가정 해 봅시다. 우리는 # 2- # 20 접기 정보 만 사용하여 # 1 접기에 대한 피쳐의 평균 값을 계산해야합니다.

따라서 # 2- # 20 번을 가져 와서 그 안에 다른 교차 검증 세트를 만듭니다 (10 번 했음). 모든 휴가 후 1 회 접기에 대한 평균을 계산합니다 (결국 10 개의 평균을 얻음). 평균 10 개를 평균하고 기본 # 1 유효성 검사 세트에 해당 벡터를 적용합니다. 남은 19 번 반복합니다.

설명하기가 어렵고 이해하기 어렵고 숙달하기가 어렵습니다.) 그러나 올바르게 수행하면 많은 이점이 있습니다.)

  • 이 인코딩의 다른 구현 은 여기에 있습니다 .

  • R 라이브러리 vtreat 에는 영향 인코딩 구현이 있습니다. 이 게시물을 참조하십시오 .

  • 에서 CatBoost 라이브러리 그들은 목표 인코딩을 포함하여 범주 형 변수 인코딩 옵션을 많이 가지고 있어요.

  • sklearn에는 아직 그러한 인코딩이 없습니다.



대상 인코딩을 사용하는 경우 기능 상호 작용을 어떻게 구현 하시겠습니까? 예를 들어 F1 및 F2를 대상으로 인코딩합니다. 인코딩 된 값 F1 * F2를 곱 하시겠습니까?
Michael Larionov

각 LOO 폴드의 평균을 계산하면 평균을 취하면 # 2- # 20 폴드의 평균을 얻는 것과 정확히 동일합니다. 왜 이것이 CV로 간주 될 수 있는지 알 수 없습니다. 또한 그는 그 10 개의 평균을 평균 할 때 "벡터"의 의미를 이해하지 못합니다.
SiXUlm

늦은 의견; 범주 인코더의 대상 인코딩은 단순한 평균 인코딩입니다. raddar에 의해 설명 된 폴드 내 정규화는 수행하지 않습니다.
Dan Scally

7

대상 인코딩은 이제 category_encoders 패키지를 통해 sklearn에서 사용할 수 있습니다 .

대상 인코더

category_encoders.target_encoder.TargetEncoder (verbose = 0, cols = None, drop_invariant = False, return_df = True, impute_missing = True, handle_unknown = 'impute', min_samples_leaf = 1, smoothing = 1) 클래스

범주 형 기능을위한 대상 인코딩. 하나의 접근 방식을 남겨 둡니다.

위의 주석에서 josh가 언급 한 것처럼.


1

scikit learn에서는 가능성 인코딩을 계속 사용할 수 없습니다. 사전을 만든 다음 교체 기능을 수행하면됩니다.

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.