Для большинства моделей в scikit-learn мы можем получить оценки вероятности для классов через predict_proba
. Имейте в виду, что это фактический результат функции logisti c, итоговая классификация получается путем выбора выхода с наибольшей вероятностью, т. Е. К выходу применяется argmax
. Если мы увидим реализацию здесь , вы увидите, что она, по сути, выполняет:
def predict(self, X):
# decision func on input array
scores = self.decision_function(X)
# column indices of max values per row
indices = scores.argmax(axis=1)
# index class array using indices
return self.classes_[indices]
В случае вызова predict_proba
, а не predict
, возвращается scores
. Вот пример использования тренировки a LogisticRegression
:
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y)
lr= LogisticRegression()
lr.fit(X_train, y_train)
y_pred_prob = lr.predict_proba(X_test)
y_pred_prob
array([[1.06906558e-02, 9.02308167e-01, 8.70011771e-02],
[2.57953117e-06, 7.88832490e-03, 9.92109096e-01],
[2.66690975e-05, 6.73454730e-02, 9.32627858e-01],
[9.88612145e-01, 1.13878133e-02, 4.12714660e-08],
...
И мы можем получить вероятности, взяв argmax
, как упоминалось, и проиндексируя массив классов как:
classes = load_iris().target_names
classes[indices]
array(['virginica', 'virginica', 'versicolor', 'virginica', 'setosa',
'versicolor', 'versicolor', 'setosa', 'virginica', 'setosa',...
Итак, для единственного прогноза, используя предсказанные вероятности, мы можем легко сделать что-то вроде:
y_pred_prob = lr.predict_proba(X_test[0,None])
ix = y_pred_prob.argmax(1).item()
print(f'predicted class = {classes[ix]} and confidence = {y_pred_prob[0,ix]:.2%}')
# predicted class = virginica and confidence = 90.75%