xgboost 邏輯回歸:objective參數(reg:logistic,binary:logistic,binary:logitraw,)對比分析


xgboost 邏輯回歸:objective參數(reg:logistic,binary:logistic,binary:logitraw,)對比分析

一、問題

熟悉xgboost的小伙伴都知道,它在訓練模型時,有train()方法和fit()方法,兩種方法都是用於構建模型的,然而在使用過程中有什么不同的地方呢,這篇文章帶領大家一起來看一下。train方法使用如下:

  1.  
    params ={ 'eta': 0.1,
  2.  
    'max_depth': 4,
  3.  
    'num_boost_round':20,
  4.  
    'objective': 'reg:logistic',
  5.  
    'random_state': 27,
  6.  
    'silent':0
  7.  
    }
  8.  
    model = xgb.train(params,xgb.DMatrix(x_train, y_train))
  9.  
    train_pred=model.predict(xgb.DMatrix(x_test))

而fit方法是直接使用xgboost封裝好的XGBClassifier或者XGBRegressor時使用:

  1.  
    model = XGBClassifier(
  2.  
    learning_rate= 0.1,
  3.  
    n_estimators= 20,
  4.  
    max_depth= 4,
  5.  
    objective= 'binary:logistic',
  6.  
    seed= 27,
  7.  
    silent= 0
  8.  
    )
  9.  
    model.fit(x_train,y_train,verbose= True)
  10.  
    fit_pred=model.predict(x_test)
  11.  
    print fit_pred

相同的數據集,相同的參數得到的預測值卻是不一樣的,fit_pred的值是0,1的具體的預測標簽,train_pred的值是0-1之間的概率值;為什么結果是不一樣的呢?如何把0-1之間的概率值映射成0,1標簽呢?這個后面揭曉,我們先看下,xgboost中用於做邏輯回歸的objective的參數都有哪些,得到預測結果有什么不同!

二、objective參數比較

xgboost官方文檔關於邏輯回歸objective有三個參數,如下:

1、reg:logistic PK binary:logistic

實際上reg:logistic,binary:logistic都是輸出邏輯回歸的概率值,實驗過程如下:

  1.  
    params ={ 'eta': 0.1,
  2.  
    'max_depth': 4,
  3.  
    'num_boost_round':20,
  4.  
    'objective': 'binary:logistic',
  5.  
    'random_state': 27,
  6.  
    'silent':0
  7.  
    }
  8.  
    model = xgb.train(params,xgb.DMatrix(x_train, y_train))
  9.  
    bin_log_pred=model.predict(xgb.DMatrix(x_test))
  10.  
    # print bin_log_pred
  11.  
    ###################################
  12.  
    params ={ 'eta': 0.1,
  13.  
    'max_depth': 4,
  14.  
    'num_boost_round':20,
  15.  
    'objective': 'reg:logistic',
  16.  
    'random_state': 27,
  17.  
    'silent':0
  18.  
    }
  19.  
    model = xgb.train(params,xgb.DMatrix(x_train, y_train))
  20.  
    reg_log_pred=model.predict(xgb.DMatrix(x_test))
  21.  
    # print reg_log_pred
  22.  
    count= 0
  23.  
    for i in np.arange(0,len(reg_log_pred)):
  24.  
    if (reg_log_pred[i]==bin_log_pred[i]):
  25.  
    count+= 1
  26.  
    print "len:",len(reg_log_pred)
  27.  
    print "count:",count
  28.  
    if count==len(reg_log_pred):
  29.  
    print "true"
  30.  
    else:
  31.  
    print "false"

輸出結果:

2、reg:logistic  PK  binary:logitraw 

然后我們再來看下binary:logitraw參數,由文檔可以看出這個參數得到的是集成樹模型最后輸出的得分,即轉換成概率值之前的值,我們知道xgboost這類集成樹算法用到的回歸樹,這就決定了它本身就是用來做回歸的,調整后可以用來做分類,這里的調整是指通過sigmoid函數處理后來做二分類,通過softmax函數處理后來做多分類。於是,我們定義一個sigmoid函數,把binary:logitraw參數輸出的得分通過sigmoid函數映射成概率值,對比下是否和reg:logistic參數得到的概率值是一樣的。

  1.  
    params ={ 'eta': 0.1,
  2.  
    'max_depth': 4,
  3.  
    'num_boost_round':20,
  4.  
    'objective': 'reg:logistic',
  5.  
    'random_state': 27,
  6.  
    'silent':0
  7.  
    }
  8.  
    model = xgb.train(params,xgb.DMatrix(x_train, y_train))
  9.  
    reg_log_pred=model.predict(xgb.DMatrix(x_test))
  10.  
    # print reg_log_pred
  11.  
    ###################################
  12.  
    params ={ 'eta': 0.1,
  13.  
    'max_depth': 4,
  14.  
    'num_boost_round':20,
  15.  
    'objective': 'binary:logitraw',
  16.  
    # 'n_jobs': 4,
  17.  
    'random_state': 27,
  18.  
    'silent':0
  19.  
    }
  20.  
    model = xgb.train(params,xgb.DMatrix(x_train, y_train))
  21.  
    logitraw_pred=model.predict(xgb.DMatrix(x_test))
  22.  
    print logitraw_pred
  23.  
    def sigmoid(x):
  24.  
    return 1./(1.+np.exp(-x))
  25.  
    y=sigmoid(logitraw_pred)
  26.  
    print y
  27.  
    count= 0
  28.  
    for i in np.arange(0,len(reg_log_pred)):
  29.  
    if (reg_log_pred[i]==y[i]):
  30.  
    count+= 1
  31.  
    print len(reg_log_pred)
  32.  
    print count
  33.  
    if count==len(reg_log_pred):
  34.  
    print "true"
  35.  
    else:
  36.  
    print "false"

輸出結果:

3、總結

上述實驗,通過使用相同的數據集,相同的參數(除了objective參數,其他相同),研究了邏輯回歸的objective的三種不同參數的輸出結果,得到如下結論:

1、binary:logistic和 'objective': 'reg:logistic'的輸出是一樣的,都是預測的概率

2、binary:logitraw是輸出的得分,用sigmoid()函數處理后就和上述兩個概率值一致

三、XGBClassifier都做了些什么

回到我們一開始的問題,xgboost train()方法得到概率值之后,如何處理成最終的0,1標簽呢?

這個工作應該是在XGBClassifier中完成的,我們進行下列實驗進行驗證:

  1.  
    model = XGBClassifier(
  2.  
    learning_rate= 0.1,
  3.  
    n_estimators= 20,
  4.  
    max_depth= 4,
  5.  
    objective= 'binary:logistic',
  6.  
    seed= 27,
  7.  
    silent= 0
  8.  
    )
  9.  
    model.fit(x_train,y_train,verbose= True)
  10.  
    fit_pred=model.predict(x_test)
  11.  
    print fit_pred
  12.  
    #######################
  13.  
    params ={ 'learning_rate': 0.1,
  14.  
    'max_depth': 4,
  15.  
    'objective': 'reg:logistic',
  16.  
    'random_state': 27,
  17.  
    'silent':0
  18.  
    }
  19.  
    model = xgb.train(params,xgb.DMatrix(x_train, y_train),num_boost_round= 20)
  20.  
    train_pred=model.predict(xgb.DMatrix(x_test))
  21.  
    #概率值的閾值假設為0.5,小於等於0.5的預測為0,否則預測為1
  22.  
    for i in np.arange(0,len(train_pred)):
  23.  
    if train_pred[i]<0.5:
  24.  
    train_pred[i]= 0
  25.  
    else:
  26.  
    train_pred[i]= 1
  27.  
    print train_pred
  28.  
    print type(train_pred)
  29.  
    count= 0
  30.  
    for i in np.arange(0,len(train_pred)):
  31.  
    if (train_pred[i]==fit_pred[i]):
  32.  
    count+= 1
  33.  
    print len(train_pred)
  34.  
    print count
  35.  
    if count==len(train_pred):
  36.  
    print "true"
  37.  
    else:
  38.  
    print "false"

輸出的結果:

由此可見我們的假設是成立的,XGBClassifier里就是把預測的概率值,取閾值0.5,小於這個值的為0,大於這個值的為1,實驗過程中還發現並沒有等於0.5的概率值,我的設想是對於一個二分類問題,把概率預測成0.5沒有任何意義o(* ̄︶ ̄*)o

為了增加可信度,我們把訓練數據放到模型里進行預測,並對於,train和fit輸出的預測結果,結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM