2017-11-30 2 views
0

sklearn.GridSearchCV를 sklearn.SVC (확률 = True)보다 높게 사용하면 훈련 데이터가 작고 균형이 맞으면 근본적으로 다른 예측/모델이 반환됩니다. (작고 불균형). 이 예제를 고려하십시오, 불균형 데이터 수익률을 사용하여 훈련 모델에 하나 기대 일반적으로 결과 만 반면작은 평형 데이터 세트로 GridSearchCV를 사용할 때 sklearn.SVC가 근본적으로 다른 예측 (모델)을 반환합니다

from sklearn.model_selection import GridSearchCV 
from sklearn.svm import SVC 
from sklearn import svm, datasets 
iris = datasets.load_iris() 
# Take the first two features. We could avoid this by using a two-dim dataset 
X = iris.data[:, :2] 
y = iris.target 

index = [0,1,2,3,51,52,53,54] 
index_unequal = [0,1,2,3,51,52,53,54,55] 
new_predictions = [5, 6, 7, 56, 57, 58] 
pred_mat, pred_y = X[new_predictions], y[new_predictions] 
c_s = [0.01, 0.1, 1.0, 10.0, 100.0] 
gamma = [1e-4, 1e-3, 1e-2, 1e-1, 1, 10] 
svc_params = [{'kernel': ['rbf'], 'gamma': gamma, 'C': c_s}, 
       {'kernel': ['linear'], 'C': c_s}] 
mat, ye = X[index], y[index] 
mat_unequal, y_unequal = X[index_unequal], y[index_unequal] 

balanced = GridSearchCV(SVC(probability=True), svc_params, cv=4).fit(mat, ye) 
unbalanced = GridSearchCV(SVC(probability=True), svc_params, cv=4).fit(mat_unequal, y_unequal) 

print(balanced.predict_proba(pred_mat)) 
print(unbalanced.predict_proba(pred_mat)) 

균형 데이터에 대한 교육 모델은 모든 새로운 데이터를 0.5의 확률을 반환합니다. 이 예제에서 사용 된 훈련 데이터는 작지만 1의 차이 만 있으면, 나는 근본적으로 다른 모델/확률을주기 위해 어떤 메커니즘이 변경되는지 궁금합니다.

업데이트 # 1 좀 더이 파고 아래 비벡의 반응을 고려하면 (정말 좋은 링크 감사합니다!), predictpredict_proba의 차이를 이해하는 것은 전투 반이다. 확률을 최적화하고 결정 기능을 최적화하는 GridSearch에 대한 채점 기능을 선택할 수 있습니다 (예 : scoring='neg_log_loss'GridSearchCV 호출에 추가). 이것은 두 모델간에 더 좋은 결과를 가져올 것입니다. 그러나, 나는 여전히 위에 언급 된 문제의 결과에 대해 궁금합니다. 두 모델의 차이점을 살펴보면 두 가지 차이점은 추가 데이터 및 교차 유효성 검사 생성 도구 (예 : StratifiedKFold의 cv 속성)가 데이터를 분할하는 방식입니다. 예를 들어, 이러한 성층 K 배의 모든 인덱스를 고려해

balanced_cv_iter = [(np.array([1, 2, 3, 5, 6, 7]), np.array([0, 4])), 
      (np.array([0, 2, 3, 4, 6, 7]), np.array([1, 5])), 
      (np.array([0, 1, 3, 4, 5, 7]), np.array([2, 6])), 
      (np.array([0, 1, 2, 4, 5, 6]), np.array([3, 7]))] 

unbalanced_cv_iter = [(np.array([1, 2, 3, 6, 7, 8]), np.array([0, 4, 5])), 
       (np.array([0, 2, 3, 4, 5, 7, 8]), np.array([1, 6])), 
       (np.array([0, 1, 3, 4, 5, 6, 8]), np.array([2, 7])), 
       (np.array([0, 1, 2, 4, 5, 6, 7]), np.array([3, 8]))] 

balanced_cv_iter_new = [(np.array([1, 2, 3, 5, 6]), np.array([0, 4, 7])), 
      (np.array([0, 2, 3, 4, 6, 7, 1]), np.array([5])), 
      (np.array([0, 1, 3, 4, 5, 7, 2]), np.array([6])), 
      (np.array([0, 1, 2, 4, 5, 6]), np.array([3, 7]))] 

balanced_cv_iterunbalanced_cv_iter 두 모델 트레이닝/테스트 데이터를 상기 코드와 관련하여 발생하는 두 가능성리스트이다. 그러나 우리가 balanced_cv_iter을 훈련/시험에 몇 가지 홀수 개의 요소 (불평형 열차/시험 세트)를 갖도록 변경하면 balanced_cv_iter_new을 얻을 수 있습니다. 이렇게하면 균형 모델과 불균형 모델 모두에서 유사한 예측이 발생합니다. 여기 모델의 의도 된 사용을 최적화하기위한 교훈이 있다고 생각합니다. (즉, 모델 사용과 일치하는 채점 기능 선택)? 그러나 GridSearch가 왜 불균형 프레임 워크에서 더 나은 확률 모델로 이어지는 하이퍼 매개 변수가있는 SVM 평가기를 선택하는지에 대한 추가 생각/의견이 있으면 알려 드리고 싶습니다.

답변

0

잘못 찾고 있습니다. 이것은 GridSearchCV와는 아무런 관련이 없습니다. 그러나 svm.

SVC에서 predict_proba()을 사용하려고합니다.이 출력은 혼란스럽고 이러한 출력은 predict() 함수의 실제 출력과 일치하지 않을 수 있습니다.

나는 하나의 작은 변화 코드 실행 :

print(balanced.predict(pred_mat)) 
print(unbalanced.predict(pred_mat)) 

을 그리고 출력은 : 그래서 당신이 볼로

[0 0 0 1 0 1] 
[0 0 0 1 1 1] 

, 두 경우에 대한 크게 다르지 않다. 이 두 가지 결과물에서 생각할 수있는 유일한 차이점은 두 번째 사례에서 두 번째 클래스에 대한 추가 데이터가 1 ​​개 있기 때문에 첫 번째 사례보다 더 잘 인식하는 데 도움이된다는 것입니다. 클래스의 샘플을 변경하여이를 확인할 수 있습니다.

지금 predict_proba이 같은 결과를주는 이유의 설명에로 찾아보세요 :

+0

Vivek,이 문제를 조사해 주셔서 감사합니다. 위의 게시물을 업데이트하고 의견 및 링크를 사용하여 다른 사용자를위한 하나의 잠재적 솔루션을 설명합니다. 그러나 불균형 설계가 왜이 경우 더 나은 확률 모델로 이어지는 지에 대해 궁금합니다. (심지어 불균형 설계를 유도하는 교차 유효성 검사 객체를 선택할 때조차도). – benneely