scikit-learn의 Logistic Regression에서 class_weight
매개변수가 작동하는 방식을 이해하는 데 많은 어려움을 겪고 있습니다.
상황
매우 불균형한 데이터 세트에 대해 이진 분류를 수행하기 위해 로지스틱 회귀를 사용하고 싶습니다.클래스에는 0(음수) 및 1(양수)로 레이블이 지정되고 관찰된 데이터는 대부분의 샘플은 부정적인 결과를 나타냅니다.
첫 번째 시도: 수동으로 훈련 데이터 준비
나는 훈련과 테스트를 위해 가지고 있던 데이터를 분리된 세트로 나눴습니다(약 80/20). 그런 다음 19:1과 다른 비율(2:1 -> 16:1)로 훈련 데이터를 얻기 위해 수동으로 훈련 데이터를 무작위로 샘플링했습니다.
나는 이것들에 대해 로지스틱 회귀를 훈련했습니다 다른 훈련 데이터 하위 집합과 다른 훈련 비율의 함수로 표시된 재현율(= TP/(TP+FN)) 물론 재현율은 관찰된 비율이 19:1인 분리된 TEST 샘플에서 계산되었습니다. 참고, 서로 다른 교육 데이터에 대해 서로 다른 모델을 교육했지만 동일한(분리된) 테스트 데이터에서 모든 모델에 대한 재현율을 계산했습니다.
결과는 예상대로였습니다. 재현율은 2에서 약 60%였습니다. :1 훈련 비율과 16:1에 도달할 즈음에는 오히려 빨리 떨어졌습니다. 2:1 -> 6:1의 여러 비율이 있었는데 회상률이 5%를 훨씬 넘었습니다.
두 번째 시도: 그리드 검색
다음으로 저는 다른 정규화 매개변수를 테스트하고 싶었기 때문에 GridSearchCV를 사용하고 C
매개변수와 class_weight
매개변수의 여러 값으로 그리드를 만들었습니다. 네거티브:포지티브 훈련 샘플의 n:m 비율을 class_weight
사전 언어로 번역하려면 다음과 같이 여러 사전을 지정하면 된다고 생각했습니다.
{ 0: 0.67, 1:0.33 } #예상 2:1 { 0:0.75, 1:0.25 } #예상 3:1 { 0:0.8, 1:0.2 } #예상 4:1
또한 None
및 auto
도 포함했습니다.
이번에는 결과가 완전히 엉망이었습니다. 내 모든 리콜은 auto
를 제외한 class_weight
의 모든 값에 대해 아주 작게 나왔습니다(< 0.05). 따라서 class_weight
사전을 설정하는 방법에 대한 나의 이해가 잘못되었다고 가정할 수 있습니다. 흥미롭게도 그리드 검색에서 "auto"의 class_weight
값은 C
의 모든 값에 대해 약 59%였으며 균형이 1:1이라고 추측했습니다.
내 질문
class_weight
를 적절하게 사용하여 실제 데이터와 훈련 데이터의 균형을 다르게 맞추는 방법 그것을 제공? 특히, n:m 비율의 음수:양성 훈련 샘플을 사용하려면 어떤 사전을class_weight
에 전달해야 하나요?다양한
class_weight
사전을 GridSearchCV에 추가하면 교차 검증 중에 사전에 따라 훈련 폴드 데이터의 균형을 재조정하지만 테스트 폴드에서 내 점수 함수를 계산하기 위해 주어진 실제 샘플 비율을 사용합니까? 모든 측정항목이 관찰된 비율의 데이터에서 나온 경우에만 나에게 유용하기 때문에 이것은 매우 중요합니다.auto
값은class_weight
비율만큼 합니까? 나는 문서를 읽고 "주파수에 반비례하는 데이터 균형"이 1:1로 만든다는 것을 의미한다고 가정합니다. 이 올바른지? 그렇지 않다면 누군가 명확히 할 수 있습니까?