为什么混淆量度中的正样本大小小于实际数据?

时间:2019-12-20 22:56:06

标签: python machine-learning logistic-regression

我正在对优惠券数据集进行逻辑回归,并且coupon.flag.value_counts()显示有22356个负样本和2961个正样本。但是在建立了逻辑回归模型之后,训练混淆度量中的阳性样本总数仅为51。(test_size = 0.3)有人可以帮我弄清楚这里出什么问题吗?谢谢!

coupon=pd.read_csv('L2_Week3.csv')
coupon=pd.get_dummies(coupon)
coupon.flag.value_counts()
0    22356
1     2961
Name: flag, dtype: int64

from sklearn.model_selection import train_test_split
y=coupon['flag']
x=coupon[['coupon_used_in_last_month','job_retired','job_student','marital_single','returned_yes','job_bl
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=100)
from sklearn import linear_model
lr=linear_model.LogisticRegression()
lr.fit(x_train,y_train)
y_pred_train=lr.predict(x_train)
y_pred_test=lr.predict(x_test)
import sklearn.metrics as metrics
metrics.confusion_matrix(y_train,y_pred_train)

Out[96]:
array([[15589,    34],
       [ 2081,    17]])

正如我所说,度量标准中正样本的数量比实际数据小得多。

1 个答案:

答案 0 :(得分:0)

逻辑回归给出的结果是概率,而不是纯0和1。在这种预测中,您应该找到一个阈值(使用有效数据集)来决定将哪个概率视为0,将哪个概率视为1以获取最佳值。指标(准确性,准确性等),然后将此阈值用于测试预测。如果不执行此操作,则会使用默认阈值(0.5)生成一个混淆矩阵,这是个坏主意,因为即使没有进一步优化,该阈值也应设置为数据集中1的比率,即2961 /(2961 + 22356)。

尝试使用此代码:

    threshold = 2961/(2961+22356)
    metrics.confusion_matrix(y_train,(y_pred_train>threshold).astype(int))

Notabene,此操作不需要评估AUC,它同时对概率以及纯0和1进行操作。值得注意的是,转换为0和1的预测概率通常比原始概率要差得多。 >