在 Scikit Learn 中控制逻辑回归的阈值
Controlling the threshold in Logistic Regression in Scikit Learn
我在 scikit-learn
中对高度不平衡的数据集使用 LogisticRegression()
方法。我什至把 class_weight
功能变成了 auto
.
我知道在逻辑回归中应该可以知道一对特定 类 的阈值是多少。
是否可以知道每个一对多 类 LogisticRegression()
方法设计的阈值是多少?
我在文档页面中没有找到任何内容。
是否默认将 0.5
值作为所有 类 的阈值而不考虑参数值?
逻辑回归选择概率最大的class。在 2 classes 的情况下,阈值为 0.5:如果 P(Y=0) > 0.5,则显然 P(Y=0) > P(Y=1)。同样代表 multiclass 设置:再次,它选择具有最大概率的 class(参见例如 Ng's lectures,底线)。
引入特殊阈值仅影响假 positives/false 负样本的比例(因此影响 precision/recall 权衡),但它不是 LR 模型的参数。另见 the similar question。
我使用了一个小技巧,而不是使用 model.predict(test_data)
使用 model.predict_proba(test_data)
。然后使用一系列值作为阈值来分析对预测的影响;
pred_proba_df = pd.DataFrame(model.predict_proba(x_test))
threshold_list = [0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,.7,.75,.8,.85,.9,.95,.99]
for i in threshold_list:
print ('\n******** For i = {} ******'.format(i))
Y_test_pred = pred_proba_df.applymap(lambda x: 1 if x>i else 0)
test_accuracy = metrics.accuracy_score(Y_test.as_matrix().reshape(Y_test.as_matrix().size,1),
Y_test_pred.iloc[:,1].as_matrix().reshape(Y_test_pred.iloc[:,1].as_matrix().size,1))
print('Our testing accuracy is {}'.format(test_accuracy))
print(confusion_matrix(Y_test.as_matrix().reshape(Y_test.as_matrix().size,1),
Y_test_pred.iloc[:,1].as_matrix().reshape(Y_test_pred.iloc[:,1].as_matrix().size,1)))
最好!
是的,Sci-Kit 学习使用阈值 P>=0.5 进行二进制 class化。我将在已经发布的一些答案的基础上使用两个选项来检查这个:
一个简单的选择是使用下面代码的 model.predict_proba(test_x) 段的输出以及 class 预测来提取每个 class 化的概率(从下面的 model.predict(test_x) 代码段输出)。然后,将 class 个预测及其概率附加到您的测试数据框中作为检查。
作为另一种选择,可以使用以下代码以图形方式查看各种阈值下的准确率与召回率。
### Predict test_y values and probabilities based on fitted logistic
regression model
pred_y=log.predict(test_x)
probs_y=log.predict_proba(test_x)
# probs_y is a 2-D array of probability of being labeled as 0 (first
column of
array) vs 1 (2nd column in array)
from sklearn.metrics import precision_recall_curve
precision, recall, thresholds = precision_recall_curve(test_y, probs_y[:,
1])
#retrieve probability of being 1(in second column of probs_y)
pr_auc = metrics.auc(recall, precision)
plt.title("Precision-Recall vs Threshold Chart")
plt.plot(thresholds, precision[: -1], "b--", label="Precision")
plt.plot(thresholds, recall[: -1], "r--", label="Recall")
plt.ylabel("Precision, Recall")
plt.xlabel("Threshold")
plt.legend(loc="lower left")
plt.ylim([0,1])
我在 scikit-learn
中对高度不平衡的数据集使用 LogisticRegression()
方法。我什至把 class_weight
功能变成了 auto
.
我知道在逻辑回归中应该可以知道一对特定 类 的阈值是多少。
是否可以知道每个一对多 类 LogisticRegression()
方法设计的阈值是多少?
我在文档页面中没有找到任何内容。
是否默认将 0.5
值作为所有 类 的阈值而不考虑参数值?
逻辑回归选择概率最大的class。在 2 classes 的情况下,阈值为 0.5:如果 P(Y=0) > 0.5,则显然 P(Y=0) > P(Y=1)。同样代表 multiclass 设置:再次,它选择具有最大概率的 class(参见例如 Ng's lectures,底线)。
引入特殊阈值仅影响假 positives/false 负样本的比例(因此影响 precision/recall 权衡),但它不是 LR 模型的参数。另见 the similar question。
我使用了一个小技巧,而不是使用 model.predict(test_data)
使用 model.predict_proba(test_data)
。然后使用一系列值作为阈值来分析对预测的影响;
pred_proba_df = pd.DataFrame(model.predict_proba(x_test))
threshold_list = [0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,.7,.75,.8,.85,.9,.95,.99]
for i in threshold_list:
print ('\n******** For i = {} ******'.format(i))
Y_test_pred = pred_proba_df.applymap(lambda x: 1 if x>i else 0)
test_accuracy = metrics.accuracy_score(Y_test.as_matrix().reshape(Y_test.as_matrix().size,1),
Y_test_pred.iloc[:,1].as_matrix().reshape(Y_test_pred.iloc[:,1].as_matrix().size,1))
print('Our testing accuracy is {}'.format(test_accuracy))
print(confusion_matrix(Y_test.as_matrix().reshape(Y_test.as_matrix().size,1),
Y_test_pred.iloc[:,1].as_matrix().reshape(Y_test_pred.iloc[:,1].as_matrix().size,1)))
最好!
是的,Sci-Kit 学习使用阈值 P>=0.5 进行二进制 class化。我将在已经发布的一些答案的基础上使用两个选项来检查这个:
一个简单的选择是使用下面代码的 model.predict_proba(test_x) 段的输出以及 class 预测来提取每个 class 化的概率(从下面的 model.predict(test_x) 代码段输出)。然后,将 class 个预测及其概率附加到您的测试数据框中作为检查。
作为另一种选择,可以使用以下代码以图形方式查看各种阈值下的准确率与召回率。
### Predict test_y values and probabilities based on fitted logistic
regression model
pred_y=log.predict(test_x)
probs_y=log.predict_proba(test_x)
# probs_y is a 2-D array of probability of being labeled as 0 (first
column of
array) vs 1 (2nd column in array)
from sklearn.metrics import precision_recall_curve
precision, recall, thresholds = precision_recall_curve(test_y, probs_y[:,
1])
#retrieve probability of being 1(in second column of probs_y)
pr_auc = metrics.auc(recall, precision)
plt.title("Precision-Recall vs Threshold Chart")
plt.plot(thresholds, precision[: -1], "b--", label="Precision")
plt.plot(thresholds, recall[: -1], "r--", label="Recall")
plt.ylabel("Precision, Recall")
plt.xlabel("Threshold")
plt.legend(loc="lower left")
plt.ylim([0,1])