developer tip

scikit-learn의 class_weight 매개 변수는 어떻게 작동합니까?

copycodes 2020. 8. 27. 07:54
반응형

scikit-learn의 class_weight 매개 변수는 어떻게 작동합니까?


class_weightscikit-learn의 Logistic Regression의 매개 변수가 어떻게 작동하는지 이해하는 데 많은 문제 가 있습니다.

그 상황

로지스틱 회귀를 사용하여 매우 불균형 한 데이터 세트에서 이진 분류를 수행하고 싶습니다. 등급은 0 (음성) 및 1 (양성)으로 표시되고 관찰 된 데이터는 약 19 : 1의 비율이며 대부분의 샘플은 부정적인 결과를 나타냅니다.

첫 번째 시도 : 수동으로 훈련 데이터 준비

훈련 및 테스트를 위해 보유한 데이터를 분리 된 세트로 분할했습니다 (약 80/20). 그런 다음 훈련 데이터를 무작위로 추출하여 19 : 1과 다른 비율로 훈련 데이터를 얻었습니다. 2 : 1-> 16 : 1에서.

그런 다음 이러한 다양한 훈련 데이터 하위 집합에 대한 로지스틱 회귀를 훈련하고 다른 훈련 비율의 함수로 재현율 (= TP / (TP + FN))을 플로팅했습니다. 물론 재현율은 관찰 된 비율이 19 : 1 인 분리 된 테스트 샘플에서 계산되었습니다. 다른 훈련 데이터에 대해 다른 모델을 훈련했지만 동일한 (분리 된) 테스트 데이터에서 모든 모델에 대한 재현율을 계산했습니다.

결과는 예상대로였습니다. 리콜은 2 : 1 훈련 비율에서 약 60 % 였고 16 : 1에 도달했을 때 다소 빠르게 감소했습니다. 리콜 률이 5 % 이상인 2 : 1-> 6 : 1 비율이 여러 개있었습니다.

두 번째 시도 : 그리드 검색

다음으로, 나는 다른 정규화 매개 변수를 테스트하고 싶어하고 그래서 GridSearchCV를 사용하여 여러 값의 그리드 만든 C매개 변수뿐만 아니라 class_weight매개 변수를. 네거티브 : 포지티브 훈련 샘플의 n : m 비율을 사전 언어로 번역하기 위해 class_weight다음과 같이 몇 가지 사전을 지정한다고 생각했습니다.

{ 0:0.67, 1:0.33 } #expected 2:1
{ 0:0.75, 1:0.25 } #expected 3:1
{ 0:0.8, 1:0.2 }   #expected 4:1

나는 또한 포함 None하고 auto.

이번에는 결과가 완전히 엉망이었습니다. 모든 리콜은를 class_weight제외한 모든 값에 대해 아주 작게 (<0.05) 나왔습니다 auto. 따라서 class_weight사전 설정 방법에 대한 나의 이해 가 잘못 되었다고 가정 할 수 있습니다 . 흥미롭게도 class_weight그리드 검색의 'auto'값은의 모든 값에 대해 약 59 %였으며 C1 : 1로 균형을 이룬다 고 생각 했습니까?

내 질문

1) class_weight훈련 데이터에서 실제로 제공하는 것과 다른 균형을 이루기 위해 어떻게 적절하게 사용 합니까? 특히 class_weight네거티브 : 포지티브 훈련 샘플의 n : m 비율을 사용하려면 어떤 사전을 전달해야 합니까?

2) 다양한 class_weight사전을 GridSearchCV에 전달하면 교차 검증 중에 사전에 따라 훈련 폴드 데이터의 균형을 재조정하지만 테스트 폴드에서 내 점수 함수를 계산하기 위해 실제 주어진 샘플 비율을 사용합니까? 모든 측정 항목이 관찰 된 비율의 데이터에서 나온 경우에만 유용하기 때문에 이것은 매우 중요합니다.

3) 비율만큼 할 auto가치는 무엇입니까 class_weight? 나는 문서를 읽고 "데이터의 빈도에 반비례하여 균형을 잡는다"는 것은 단지 1 : 1로 만든다는 것을 의미한다고 가정합니다. 이 올바른지? 그렇지 않다면 누군가 명확히 할 수 있습니까?

대단히 감사합니다. 어떤 설명이라도 대단히 감사하겠습니다!


먼저, 리콜 만하는 것은 좋지 않을 수 있습니다. 모든 것을 포지티브 클래스로 분류하여 100 % 리콜을 달성 할 수 있습니다. 일반적으로 AUC를 사용하여 매개 변수를 선택한 다음 관심있는 작동 지점 (예 : 지정된 정밀도 수준)에 대한 임계 값을 찾는 것이 좋습니다.

class_weight작동 방식 : 1 대신 class[i]with 샘플의 실수에 페널티 를줍니다 class_weight[i]. 따라서 클래스 가중치가 높을수록 클래스를 더 강조하고 싶다는 의미입니다. 당신이 말한 바에 따르면 클래스 0은 클래스 1보다 19 배 더 자주 발생합니다. 따라서 class_weight클래스 0에 비해 클래스 1을 늘려야합니다 . 예를 들면 {0 : .1, 1 : .9}입니다. (가) 경우 class_weight1의 합계가 1이되지 않습니다, 그것은 기본적으로 정규화 매개 변수를 변경합니다.

class_weight="auto"작동 방식에 대해서는 이 토론을 참조하십시오 . 개발 버전에서는을 사용할 수 있습니다 class_weight="balanced". 이것은 이해하기 더 쉽습니다. 기본적으로 더 큰 샘플과 같은 많은 샘플을 가질 때까지 더 작은 클래스를 복제하는 것을 의미하지만 암시적인 방식입니다.

참고 URL : https://stackoverflow.com/questions/30972029/how-does-the-class-weight-parameter-in-scikit-learn-work

반응형