【问题标题】:In binary classfication, encoding target varible from yes=1, no=0 gives different results than yes=0, no=1 in XGboosting在二进制分类中,从 yes=1, no=0 编码目标变量的结果与 XGboosting 中 yes=0, no=1 的结果不同
【发布时间】:2021-03-11 00:26:21
【问题描述】:

我是机器学习的新手。在二元分类问题中,我们编码/转换目标变量,如 yes=1No=0(直接在数据集中),它会给出以下结果

  • 准确度:95
  • 召回:90
  • 精度:94
  • F1: 92

但是如果我们像 yes=0No=1(直接在数据集中)那样对目标变量进行反向编码/转换,那么它会给出这些结果

  • 准确度:95
  • 召回:97
  • 精度:94
  • F1:95

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

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

【问题讨论】:

  • 每次运行代码时是否得到相同的结果?我的意思是每次使用相同的编码都具有相同的精度?
  • @coderina 是的,每次我使用相同的结束编码运行代码时,我都会得到相同的精度、f1、召回率、准确度结果。
  • @MuhammadIbrar:这种行为的原因可能是机器学习模型通常使用随机种子,该种子是固定的,因此结果是可重复的。如果您不喜欢这样,则应在每次训练模型时将种子设置为随机数,并为train_test_split 或折叠设置。
  • 对于XGBClassifier,我猜这个参数被命名为random_state。试试random_state=random.randint(0, 2147483647)。刚刚认识到,您将train_test_splitrandom_state 明确修复为1,因此它始终会为训练和测试选择相同的记录。
  • 顺便说一句。这与 light-gbm 完全相同。如果您在此处省略种子参数,则每次运行时所有随机种子都会初始化为常量 int,因此如果数据或参数没有任何变化,您将得到完全相同的结果。

标签: python machine-learning classification xgboost precision-recall


【解决方案1】:

这是因为 f1 分数与准确率和召回率是相关的。

公式是:

f1= 2/((recall^-1)+(precision^-1))

recall= true_positives / (true_positives + false_negatives)
precision= true_positives / (true_positives + false_positives)

因此,召回率和准确率取决于您定义为正数的内容 (1)。如果你切换你的正面/负面案例,就像你通过不同地映射是/否所做的那样,你会得到一个完全不同的结果。 通过下面的计算可以看出,假设你有 100 个是,4900 个不是,得到如下结果:

              ----------
              |YES|NO  |
|-------------|---|----|
|predicted_YES| 90|   5|
|-------------|---|----|
|predicted_NO | 10|4895|
------------------------

如果您将YES 定义为正数 (1),您会得到

precision=90/(90+5)=0.947
recall=90/(90+10)=0.9
f1= 2/(precision^(-1) + recall^(-1))=0.923

如果您将NO 定义为正数 (1),您会得到:

precision=4895/(4895+10)=0.998
recall=4895/(4895+10)=0.999
f1= 2 / (precision^(-1) + recall^(-1))=0.998

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

              --------
              |YES|NO|
|-------------|---|--|
|predicted_YES|TP |FP|
|-------------|---|--|
|predicted_NO |FN |TN|
----------------------

如果您将NO 定义为正类,则 true_positives, ... 分配如下:

              --------
              |YES|NO|
|-------------|---|--|
|predicted_YES|TN |FN|
|-------------|---|--|
|predicted_NO |FP |TP|
----------------------

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 2016-08-11
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多