xgboost 多分類:objective引數(reg:linear,multi:softmax,multi:softprob)對比分析
一、問題
上篇文章中我們已經搞明白了邏輯迴歸的問題中,xgboost的train(),fit()方法以及不同引數的objective的對應的輸出結果和關係,這篇文章我們就來研究下xgboost再做多分類時,train(),fit()建模後輸出的值是怎麼樣的,它都有那些objective的引數,並且分別對應著怎樣的輸出?
二、objective引數比較
xgboost的官方文件關於多分類的objective如下:
從文件中我們可以看出,multi:softmax是使用softmax後產生的分類結果,而multi:softprob是輸出的概率矩陣。我們這裡以標籤為0,1,2的三分類資料為例,前者輸出的結果是一維資料,0,1,2的分類標籤;後者輸出的是n*3的概率矩陣(n為測試資料的條數)。
這兩個引數之間有什麼關係呢?
從這裡我們可以看出,最終的分類標籤是從概率矩陣中得到的,在n*3的概率矩陣中(如下圖):
我們可以看出概率矩陣中每行資料的數值相加得1,我們取每行資料中概率值最大數值的下標作為最終的分類標籤,然後給multi:softmax的輸出結果做對比看是否一致。
xgb_params = { 'learning_rate': 0.1, # 步長 'n_estimators': 10, 'max_depth': 5, # 樹的最大深度 'objective': 'multi:softprob', 'num_class': 3, 'min_child_weight': 1, # 決定最小葉子節點樣本權重和,如果一個葉子節點的樣本權重和小於min_child_weight則拆分過程結束。 'gamma': 0, # 指定了節點分裂所需的最小損失函式下降值。這個引數的值越大,演算法越保守 'silent': 0, # 輸出執行資訊 'subsample': 0.8, # 每個決策樹所用的子樣本佔總樣本的比例(作用於樣本) 'colsample_bytree': 0.8, # 建立樹時對特徵隨機取樣的比例(作用於特徵)典型值:0.5-1 'nthread': 4, 'seed': 27} print "training..." model = xgb.train(xgb_params, xgb.DMatrix(x_train, y_train)) softprob_pred = model.predict(xgb.DMatrix(x_test)) print softprob_pred # 處理概率矩陣-得到最終的預測標籤 indexlist = [] for item in softprob_pred: maxnum = max(item) item = np.where(item == maxnum) indexlist.append(item[0].item()) ################################ xgb_params = { 'learning_rate': 0.1, # 步長 'n_estimators': 20, 'max_depth': 5, # 樹的最大深度 'objective': 'multi:softmax', 'num_class': 3, 'min_child_weight': 1, # 決定最小葉子節點樣本權重和,如果一個葉子節點的樣本權重和小於min_child_weight則拆分過程結束。 'gamma': 0, # 指定了節點分裂所需的最小損失函式下降值。這個引數的值越大,演算法越保守 'silent': 0, # 輸出執行資訊 'subsample': 0.8, # 每個決策樹所用的子樣本佔總樣本的比例(作用於樣本) 'colsample_bytree': 0.8, # 建立樹時對特徵隨機取樣的比例(作用於特徵)典型值:0.5-1 'nthread': 4, 'seed': 27} print "training..." model = xgb.train(xgb_params, xgb.DMatrix(x_train, y_train)) softmax_pred = model.predict(xgb.DMatrix(x_test)) count = 0 for i in np.arange(0, len(softmax_pred)): if (softmax_pred[i] == indexlist[i]): count += 1 print "len:", len(softmax_pred) print "count:", count if count == len(softmax_pred): print "true" else: print "false"
輸出的結果:
由此可見,最終的預測標籤就是通過取概率矩陣的每行資料最大值的下標獲得的。
那麼問題來了,我們知道像xgboost這類整合樹演算法,他本身用到的是迴歸樹,這就決定了它本身就是用來做迴歸的,調整後可以用來做分類,對於多分類來說是通過softmax函式把迴歸結果對映成最終的多分類標籤的。我們把objective改成線性迴歸的引數(reg:linear),看下結果如何?如何通過softmax函式轉換成最終分類標籤?
輸出結果如下:
得到的是一個一維0-2之間的預測值,怎麼對映成一個831*3的矩陣呢?
對於softmax函式它的輸入和輸出是相同的shape,對於一個831*1的資料,得到的也是一個值都在0-1之間的831*1的資料,根本無法直接這樣得到概率矩陣。這個問題有想法的同學可以加QQ群:
三、多分類問題中fit()和train()的結果
用相同的資料,相同的引數(objective:multi:softmax),分別用fit()和train()方法得到的輸出結果是一致的,都是預測的0,1,2的標籤,實驗過程如下:
clf = XGBClassifier(
n_estimators=20, # 迭代次數
learning_rate=0.1, # 步長
max_depth=5, # 樹的最大深度
min_child_weight=1, # 決定最小葉子節點樣本權重和
silent=1, # 輸出執行資訊
subsample=0.8, # 每個決策樹所用的子樣本佔總樣本的比例(作用於樣本)
colsample_bytree=0.8, # 建立樹時對特徵隨機取樣的比例(作用於特徵)典型值:0.5-1
objective='multi:softmax', # 多分類!!!!!!
num_class=3,
nthread=4,
seed=27)
print "training..."
clf.fit(x_train, y_train, verbose=True)
fit_pred = clf.predict(x_test)
print fit_pred
xgb_params = {
'learning_rate': 0.1, # 步長
'max_depth': 5, # 樹的最大深度
'objective': 'multi:softmax',
'num_class': 3,
'min_child_weight': 1, # 決定最小葉子節點樣本權重和,如果一個葉子節點的樣本權重和小於min_child_weight則拆分過程結束。
'silent': 0, # 輸出執行資訊
'subsample': 0.8,
'colsample_bytree': 0.8, # 建立樹時對特徵隨機取樣的比例(作用於特徵)典型值:0.5-1
'nthread': 4,
'seed': 27}
print "training..."
model = xgb.train(xgb_params, xgb.DMatrix(x_train, y_train), num_boost_round=20)
train_pred = model.predict(xgb.DMatrix(x_test))
count = 0
print train_pred
# 判斷train_pred和fit_pred是否一致
for i in np.arange(0, len(train_pred)):
if (train_pred[i] == fit_pred[i]):
count += 1
print "len:", len(train_pred)
print "count:", count
if count == len(train_pred):
print "true"
else:
print "false"
實驗結果如下:
總結:綜上我們可以看出xgboost多分類問題就是通過softmax函式做對映得到最終的分類標籤,只是怎麼把迴歸的結果對映成概率矩陣,我還沒有搞清楚,有好的想法或者同樣疑問的同學可以加QQ群:821675528交流!!
相關推薦
xgboost 多分類:objective引數(reg:linear,multi:softmax,multi:softprob)對比分析
一、問題上篇文章中我們已經搞明白了邏輯迴歸的問題中,xgboost的train(),fit()方法以及不同引數的objective的對應的輸出結果和關係,這篇文章我們就來研究下xgboost再做多分類時,train(),fit()建模後輸出的值是怎麼樣的,它都有那些objec
多光譜遙感分類:使用CNN1(一)
程式碼源於很久以前練手的一個Demo,時間長了許多魔改版的都不見了,目前只剩下此簡陋版本。讀者如有相關需求,可根據隻言片語斷章取義。由於程式碼混亂基礎,不再上傳GitHub。 所用資料為多光譜遙感影像(.tif,由arcgis匯出RGB彩色影象),摳圖所得點檔案
Python 3.X | 一文看懂不懵圈:位置引數(必選引數)、預設引數、可變引數、關鍵字引數、形參、實參...
Win 10+Python 3.6.3 不管是什麼引數,它們身處環境是:函式(function)。引數讓函式如虎添翼,靈活、強大。 1、概念釋義: def func(x, y=2, *arg, *, z, **kwargs): #print(x, y) #print(len(ar
mybatis傳多個引數(不使用@param註解情況下),3.4.2版本之後出現#{0}-#{n}引數繫結異常
解決方案: 在mybatis配置檔案中宣告setting屬性的useActualParamName 引數值為false **
按顏色分類:紅色系(Red)
雖然沒有進行過精確的統計,但使用紅色為主顏色的站點相對較少,因為很多人不太敢於大範圍使用鮮豔的紅色。 紅色在網頁中大多數情況下都用於突出顏色,因為鮮明的紅色極易吸引人們的目光。 高亮度的紅色通過與灰色、黑色等非彩色搭配使用,可以得到現代且激進的感覺。
按顏色分類:藍色系(Blue)
screen.width-600)this.style.width=screen.width-600;"> 很多站點都在使用藍色與青綠色的搭配效果。最具代表性的藍色物體莫過於海水和藍天 ,而這兩種物體都會讓人有一種清涼的感覺。 高彩度的藍色會營造出一種整潔輕快的印象。 低彩度的
JS中的函式(二):函式引數(你可能不知道的引數傳遞)
前言: 函式分為有參有返回值,有參無返回值,無參無返回值,無參有返回值;那麼對於無引數的函式你想使用函式的呼叫怎麼辦呢?如果你想封裝一個程式碼,實現多種功能,但是形參大於實參或者實參大於形參又該如何?本文就發生函式呼叫過程中,值傳遞,引數的不對等處理原則等關於引數的一些
文字處理——基於 word2vec 和 CNN 的文字分類 :綜述 & 實踐(一)
導語傳統的向量空間模型(VSM)假設特徵項之間相互獨立,這與實際情況是不相符的,為了解決這個問題,可以採用文字的分散式表示方式(例如 word embedding形式),通過文字的分散式表示,把文字表示成類似影象和語音的連續、稠密的資料。這樣我們就可以把深度學習方法遷移到文字
按顏色分類:綠色系(Green)
綠色也是在網頁中使用最為廣泛的顏色之一。 因為它本身具有一定的與健康相關的感覺,所以也經常用於與健康相關的站點。綠色還經常用於一些公司的公關站點或教育站點。 當搭配使用綠色和白色時,可以得到自然的感覺。 當搭配使用綠色與紅色時,可以得到鮮明且豐富的
ADF 第八篇:傳遞引數(Pipeline的Parameter和Variable,Activity的output)和應用表示式
Azure Data Factory 系列部落格: ADF 第一篇:Azure Data Factory介紹 ADF 第二篇:使用UI建立資料工廠 ADF 第三篇:Integration runtime和 Linked Service ADF 第四篇:管道的執行和觸發器 ADF 第五篇:轉換資料 ADF 第
在Python中用Request庫模擬登錄(一):字幕庫(無加密,無驗證碼)
用戶名 com color 了無 1-1 value img requests log 如此簡單(不安全)的登錄表單已經不多見了。字幕庫的登錄表單如下所示,其中省去了無關緊要的內容: 1 <form class="login-form" action="/User/
POJ 3687:Labeling Balls(優先隊列+拓撲排序)
avi sat 一個 排序 com script memory std from id=3687">Labeling Balls Time Limit: 1000MS Memory Limit: 65536K T
MySQL鎖和事務(一):InnoDB鎖(MySQL 官方文檔粗翻)
空間索引 系統 聚集索引 rds update 能夠 conf 沒有 得到 // 寫在前面,實際上,數據庫加鎖的類型和範圍受到多種因素的影響,例如數據庫隔離等級,SQL語句,是否使用主鍵、索引等等。可以查看博文: http://www.cnblogs.com/zhaoy
Gartner:2017年SIEM(安全信息與事件管理)市場分析
gartner siem mq soc 安全管理平臺 2017年度的Gartner SIEM魔力象限在比往常推遲了4個月之後終於發布了。在Gartner眼中,SIEM已經是一個成熟市場。但這個市場依然十分活躍:客戶需求在變化,市場格局也在變化,技術革新也在不斷重塑SIEM自身。讓我們先看矩
2018杭電多校第二場1003(DFS,歐拉回路)
歐拉路 style ear bits its space nbsp 記錄 一個隊列 #include<bits/stdc++.h>using namespace std;int n,m;int x,y;int num,cnt;int degree[100007]
Java設計模式(一)之建立型模式:工廠模式(簡單工廠模式+工廠方法模式)
在面向物件程式設計中, 最通常的方法是一個new操作符產生一個物件例項,new操作符就是用來構造物件例項的。但是在一些情況下, new操作符直接生成物件會帶來一些問題。舉例來說,許多型別物件的建立需要一系列的步驟:你可能需要計算或取得物件的初始位置;選擇生成哪個子物件例項;或在你生成你需要的物件
MySQL技術內幕 InnoDB儲存引擎:鎖問題(髒讀、不可重複讀)
1、髒讀 在理解髒讀(Dirty Read)之前,需要理解髒資料的概念。但是髒資料和之前所介紹的髒頁完全是兩種不同的概念。髒頁指的是在緩衝池中已經被修改的頁,但是還沒有重新整理到磁碟中,即資料庫例項記憶體中的頁和磁碟中的頁的資料是不一致的,當然在重新整理到磁碟之前,日誌都已經被寫人到
《零基礎入門學習Python》(21)--函式:lambda表示式(內建BIF filte()和map())
前言 接下來學習怎麼建立匿名函式 知識點 lambda 表示式 Python 允許使用lambda關鍵字建立匿名函式 lambda 函式怎麼使用? 單個引數 >>> def add(x): retur
HDU - 4336:Card Collector(min-max容斥求期望)
In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, for example, if you collect all the 108 people in t
hdoj1176:免費餡餅(dp基礎題-數塔思想)
目錄 免費餡餅 解題思路: ac程式碼: 免費餡餅 Problem Description 都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10米範圍內。