predict_proba를 사용하여 각 샘플에 대한 모든 클래스의 독립 확률을 얻는 방법은 무엇입니까?

행복

내 작업에는 전적으로 부울 데이터로 구성된 기능 세트가 있으며 기능에 속하는 클래스가 있습니다. 클래스는 문자열입니다.

     feature set              class (String)
[True False True   ...]        "A"
[True True  True   ...]        "B"
[True True  False   ...]       "C"

Random Forest 알고리즘으로이 데이터를 훈련 시키면

factor = pd.factorize(classes)
classes = factor[0]

classifier = RandomForestClassifier(n_estimators=100, criterion="entropy", random_state=0)
classifier.fit(x_train, classes)

분류자는 97 %의 클래스를 올바르게 감지 할 수 있습니다. 내가 할 때

classifier.predict_proba(sample1_feature_set)

sample1에 대한 각 클래스의 상대적 확률을 제공합니다. 예를 들면 다음과 같습니다. 처럼

 [0.80    0.05    0.15]
   ↓        ↓        ↓
  Prob.    Prob.    Prob.
   of       of       of
  "A"      "B"      "C" 
  for      for      for
sample1   sample1  sample1

그래서리스트 (0.80 + 0.05 + 0.15)의 값을 더하면 결과는 항상 1입니다. 이것은 실제로 상대 평가를한다는 것을 보여줍니다. 즉, 한 클래스의 확률이 다른 클래스의 확률에 영향을줍니다.

sample1에 대한 모든 클래스의 독립적 인 확률을 얻고 싶습니다.

 [0.95    0.69    0.87]
   ↓        ↓        ↓
  Prob.    Prob.    Prob.
   of       of       of
  "A"      "B"      "C" 
  for      for      for
sample1   sample1  sample1

Sample1은 "A"의 % 95, "B"의 % 69 및 "C"클래스의 % 87입니다. 내가 어떻게 할 수 있을지 아십니까?

StupidWolf

랜덤 포레스트는 앙상블 방법 입니다. 기본적으로 데이터의 다른 하위 집합 (배깅이라고 함)을 사용하여 개별 의사 결정 트리를 만들고 모든 트리에서 예측을 평균하여 확률을 제공합니다. 도움말 페이지는 실제로 시작하기에 좋은 곳입니다.

평균화 방법에서 추진 원리는 여러 추정치를 독립적으로 구축 한 다음 예측을 평균화하는 것입니다. 평균적으로 결합 된 추정량은 분산이 감소하기 때문에 단일 기준 추정량보다 일반적으로 더 좋습니다.

예 : 배깅 방법, 무작위 나무의 숲,…

따라서 확률은 항상 1로 합산됩니다. 다음은 각 트리의 개별 예측에 액세스하는 방법의 예입니다.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.33, random_state=42)

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=10)
model.fit(X_train, y_train)

pred = model.predict_proba(X_test)
pred[:5,:]

array([[0. , 1. , 0. ],
       [1. , 0. , 0. ],
       [0. , 0. , 1. ],
       [0. , 0.9, 0.1],
       [0. , 0.9, 0.1]])

다음은 첫 번째 트리에 대한 예측입니다.

model.estimators_[0].predict(X_test)
Out[42]: 
array([1., 0., 2., 2., 1., 0., 1., 2., 2., 1., 2., 0., 0., 0., 0., 2., 2.,
       1., 1., 2., 0., 2., 0., 2., 2., 2., 2., 2., 0., 0., 0., 0., 1., 0.,
       0., 2., 1., 0., 0., 0., 2., 2., 1., 0., 0., 1., 1., 2., 1., 2.])

우리는 모든 나무를 집계합니다.

result = np.zeros((len(X_test),3))
for i in range(len(model.estimators_)):
    p = model.estimators_[i].predict(X_test).astype(int)
    result[range(len(X_test)),p] += 1

result[:5,:]
Out[63]: 
array([[ 0., 10.,  0.],
       [10.,  0.,  0.],
       [ 0.,  0., 10.],
       [ 0.,  9.,  1.],
       [ 0.,  9.,  1.]])

이것을 나무 수로 나누면 이전에 얻은 확률이됩니다.

result/10
Out[65]: 
array([[0. , 1. , 0. ],
       [1. , 0. , 0. ],
       [0. , 0. , 1. ],
       [0. , 0.9, 0.1],
       [0. , 0.9, 0.1],

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관