Logistic回归:UndefinedMetricWarning:精度和F分数定义不明确,在没有预测样本的标签中设置为0.0

时间:2018-04-16 04:36:57

标签: pandas numpy classification logistic-regression

目标:确定rfq_num_of_dealers是否是完成交易的重要预测因子(Done = 1)。
我的数据:

df_Train_Test.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 139025 entries, 0 to 139024
Data columns (total 2 columns):
rfq_num_of_dealers    139025 non-null float64
Done                  139025 non-null uint8
dtypes: float64(1), uint8(1)

df_Train_Test = df_Train_Test[['rfq_num_of_dealers','Done']]
df_Train_Test_GrpBy = df_Train_Test.groupby(['rfq_num_of_dealers','Done']).size().reset_index(name='Count').sort_values(['rfq_num_of_dealers','Done'])
display(df_Train_Test_GrpBy)

列rfq_num_of_dealers数据范围为0到21,列Done为0或1.请注意,所有rfq_num_of_dealers的完成值均为0或1.

enter image description here

逻辑回归:

x = df_Train_Test[['rfq_num_of_dealers']]
y = df_Train_Test['Done']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33, random_state=42)

# 2 Train and fit a logistic regression model on the training set. 
from sklearn.linear_model import LogisticRegression
logmodel = LogisticRegression()               # create instance of model
logmodel.fit(x_train,y_train)                 # fit model against the training data

# 3. Now predict values for the testing data.
predictions = logmodel.predict(x_test)        # Predict off the test data (note fit model is off train data)

# 4 Create a classification report for the model.
from sklearn.metrics import classification_report
print(classification_report(y_test,predictions))

# 5 Create a confusion matrix for the model.
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test,predictions))    # The diagonals are the correct predictions

这会产生以下错误

 UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.       
'precision', 'predicted', average, warn_for)

报告和矩阵显然是错误的,请注意混淆矩阵的右侧

       precision    recall  f1-score   support

          0       0.92      1.00      0.96     41981
          1       0.00      0.00      0.00      3898

avg / total       0.84      0.92      0.87     45879

[[41981     0]
 [ 3898     0]]

如果&#39;完成&#39;如何引发此错误?有1或0并且所有都填充(y标签)?是否有任何代码可以运行以确定哪些y标签导致错误?其他outpuuts:

display(pd.Series(predictions).value_counts())
0    45879
dtype: int64

display(pd.Series(predictions).describe())
count    45879.0
mean         0.0
std          0.0
min          0.0
25%          0.0
50%          0.0
75%          0.0
max          0.0
dtype: float64

display(y_test)
71738     0
39861     0
16567     0
81750     1
88513     0
16314     0
113822    0
.         .

display(y_test.describe())
count    45879.000000
mean         0.084963
std          0.278829
min          0.000000
25%          0.000000
50%          0.000000
75%          0.000000
max          1.000000
Name: Done, dtype: float64

display(y_test.value_counts())
0    41981
1     3898
Name: Done, dtype: int64

这可能与rfq_num_of_dealers和Done等于零的12439条记录有关吗?

1 个答案:

答案 0 :(得分:2)

精确度是一个比率:

precision = tp /(tp + fp)

错误告诉你这个比例是不确定的,几乎肯定是因为分母是0.也就是说,没有测试真阳性和误报。看看这些共性,这些都是测试积极因素。

您的分类器很可能根本不会预测测试数据的正数。

在进入训练和测试之前,你可能想要随机化你的实例的顺序(或分层) - 它可能是关于原始顺序的系统性的东西。这可能解决了问题与否,但同样,问题是测试数据集中缺少预测的真实性。