首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在二进制分类中,从yes=1中编码目标变量,no=0给出的结果与XGboosting中的yes=0、no=1不同。

在二进制分类中,从yes=1中编码目标变量,no=0给出的结果与XGboosting中的yes=0、no=1不同。
EN

Stack Overflow用户
提问于 2020-11-28 14:20:33
回答 1查看 501关注 0票数 2

我是机器学习的新手。在一个二进制分类问题中,我们对目标变量(如yes=1No=0 (直接在数据集中))进行编码/转换,给出了相应的结果。

  • Accuracy:95
  • Recall: 90
  • Precision:94
  • F1: 92

但是,如果我们在dataset中对目标变量进行反向编码/转换(如No=1(directly和yes=0 ),则给出这些结果。

  • Accuracy:95
  • Recall:97
  • Precision:94
  • F1:95

我正在使用XGboost算法。所有其他变量都是数值变量(正变量和负变量),尽管两者的准确性是相同的,但我假设F1在这两种情况下也应该是相同的。那么为什么它给出了不同的结果。我知道scikit-learn可以处理编码,但是为什么F1在这两种情况下是不同的呢?

代码语言:javascript
复制
xtrain,xtest,ytrain,ytest=train_test_split(X,encoded_Y,test_size=0.3,random_state=100,shuffle=True)
clf_xgb = xgb.XGBClassifier(nthread=1,random_state=100)
clf_xgb.fit(xtrain, ytrain)
xgb_pred = clf_xgb.predict(xtest)
xgb_pred_prb=clf_xgb.predict_proba(xtest)[:,1]
print(confusion_matrix(xgb_pred,ytest))
# [984   57]
# [103 1856]

#Find Accuracy of XGBoost
accuracy_xgb = accuracy_score(ytest,xgb_pred)
print("Accuracy: {}".format(accuracy_xgb)

#Find Recall of XGBoost
recall_xgb = recall_score(ytest,xgb_pred)
recall_xgb

#Find Precision of XGBoost
precision_xgb = precision_score(ytest,xgb_pred)
precision_xgb

#Find F1 Score XGB
xgb_f1=f1_score(ytest,xgb_pred)
xgb_f1
EN

回答 1

Stack Overflow用户

发布于 2020-11-28 15:30:37

这是因为f1评分与查全率和召回率是相互关联的。

这些公式是:

代码语言:javascript
复制
f1= 2/((recall^-1)+(precision^-1))

代码语言:javascript
复制
recall= true_positives / (true_positives + false_negatives)
precision= true_positives / (true_positives + false_positives)

因此,回忆和精确取决于您定义为正(1)的内容。如果你转换你的正负情况,就像你用不同的方式映射是/否一样,你会得到一个完全不同的结果。通过下面的计算,您可以看到这一点,假设您有100个“是”和“4900个”,并得到了相应的结果:

代码语言:javascript
复制
              ----------
              |YES|NO  |
|-------------|---|----|
|predicted_YES| 90|   5|
|-------------|---|----|
|predicted_NO | 10|4895|
------------------------

然后,如果将YES定义为正(1),则可以得到

代码语言:javascript
复制
precision=90/(90+5)=0.947
recall=90/(90+10)=0.9
f1= 2/(precision^(-1) + recall^(-1))=0.923

如果将NO定义为正(1),则得到:

代码语言:javascript
复制
precision=4895/(4895+10)=0.998
recall=4895/(4895+10)=0.999
f1= 2 / (precision^(-1) + recall^(-1))=0.998

注意,如果YES是您的正类,则上面的矩阵分配给true_positives,.就像这样:

代码语言:javascript
复制
              --------
              |YES|NO|
|-------------|---|--|
|predicted_YES|TP |FP|
|-------------|---|--|
|predicted_NO |FN |TN|
----------------------

如果将NO定义为正类,true_positives,.是这样分配的:

代码语言:javascript
复制
              --------
              |YES|NO|
|-------------|---|--|
|predicted_YES|TN |FN|
|-------------|---|--|
|predicted_NO |FP |TP|
----------------------
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65050583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档