XGBoost解決多分類問題

2021-08-08 17:30:13 字數 3589 閱讀 6051

xgboost官方給的二分類問題的例子是區別蘑菇有無毒,資料集和**都可以在xgboost中的demo資料夾對應找到,我是用的anaconda安裝的xgboost,實現起來比較容易。唯一的梗就是在終端中執行所給命令:  ../../xgboost mushroom.conf 時會報錯,是路徑設定的問題,所以我乾脆把xgboost資料夾下的xgboost.exe拷到了mushroom.conf配置檔案所在資料夾下,這樣直接定位到該資料夾下就可以執行: xgboost mushroom.conf。二分類資料預處理,也就是data wraggling部分的**有一定的借鑑意義,值得一看。

[python]view plain

copy

#! /usr/bin/python

import

numpy as np  

import

xgboost as xgb  

# label need to be 0 to num_class -1

# if col 33 is '?' let it be 1 else 0, col 34 substract 1

data = np.loadtxt('./dermatology.data'

, delimiter=

',',converters= )  

sz = data.shape  

train = data[:int(sz[0

] * 

0.7), :] 

# take row 1-256 as training set

test = data[int(sz[0

] * 

0.7):, :]  

# take row 257-366 as testing set

train_x = train[:,0:33

]  train_y = train[:, 34

]  test_x = test[:,0:33

]  test_y = test[:, 34

]  xg_train = xgb.dmatrix( train_x, label=train_y)  

xg_test = xgb.dmatrix(test_x, label=test_y)  

# setup parameters for xgboost

param = {}  

# use softmax multi-class classification

param['objective'

] = 

'multi:softmax'

# scale weight of positive examples

param['eta'

] = 

0.1param['max_depth'

] = 

6param['silent'

] = 

1param['nthread'

] = 

4param['num_class'

] = 

6watchlist = [ (xg_train,'train'

), (xg_test, 

'test'

) ]  

num_round = 5

bst = xgb.train(param, xg_train, num_round, watchlist );  

# get prediction

pred = bst.predict( xg_test );  

print

('predicting, classification error=%f'

% (sum( int(pred[i]) != test_y[i] 

fori 

inrange(len(test_y))) / float(len(test_y)) ))  

# do the same thing again, but output probabilities

param['objective'

] = 

'multi:softprob'

bst = xgb.train(param, xg_train, num_round, watchlist );  

# note: this convention has been changed since xgboost-unity

# get prediction, this is in 1d array, need reshape to (ndata, nclass)

yprob = bst.predict( xg_test ).reshape( test_y.shape[0

], 6

)  ylabel = np.argmax(yprob, axis=1

)  # return the index of the biggest pro

print

('predicting, classification error=%f'

% (sum( int(ylabel[i]) != test_y[i] 

fori 

inrange(len(test_y))) / float(len(test_y)) ))  

結果如下:

[python]view plain

copy

[0] train-merror:

0.011719

test-merror:

0.127273

[1] train-merror:

0.015625

test-merror:

0.127273

[2] train-merror:

0.011719

test-merror:

0.109091

[3] train-merror:

0.007812

test-merror:

0.081818

[4] train-merror:

0.007812

test-merror:

0.090909

predicting, classification error=0.090909

[0] train-merror:

0.011719

test-merror:

0.127273

[1] train-merror:

0.015625

test-merror:

0.127273

[2] train-merror:

0.011719

test-merror:

0.109091

[3] train-merror:

0.007812

test-merror:

0.081818

[4] train-merror:

0.007812

test-merror:

0.090909

predicting, classification error=0.090909

不管是直接返回診斷型別,還是返回各型別的概率,然後取概率最大的那個對應的型別的index,結果都是一樣的。

邏輯回歸解決多分類問題

第二種方法 從演算法入手 傳統的邏輯回歸只能處理二分類問題,對於多分類任務,主要有如下兩種方案。某個分類演算法有n類,將某一類和另一模擬較作為二分類問題,總共可分為cn2 c cn 2 種不同的二分類模型,給定乙個新的樣本點,求出每種二分類對應的概率,概率最高的一類作為新樣本的 結果。某個分類演算法...

Tensorflow 多分類問題

import requests import numpy as np 複製 r requests.get 複製 with open iris.data w as f f.write r.text 複製 import pandas as pd 複製 data pd.read csv iris.data...

SVM多分類問題,解決方案

svm本身是乙個二值分類器 svm演算法最初是為二值分類問題設計的,當處理多類問題時,就需要構造合適的多類分類器。目前,構造svm多類分類器的方法主要有兩類 1 直接法,直接在目標函式上進行修改,將多個分類面的引數求解合併到乙個最優化問題中,通過求解該最優化問題 一次性 實現多類分類。這種方法看似簡...