xgboost implémente une démonstration et un principe de problèmes multi-catégories

Cet article écrit d'abord la démo du problème de multi-classification pris en charge par xgboost, imprime la structure arborescente générée, puis comprend le principe de xgboost pour réaliser le problème de multi-classification. Cette commande est plus facile à comprendre.

Démo de problèmes multi-catégories xgboost

Cette démo peut être vue à partir du code source de xgboost. À cet emplacement : /demo/multiclass_classification/train.py. Les données du fichier train.py (dermatology.data) peuvent être     téléchargées sur https://archive.ics.uci.edu/ml/machine-learning-databases/dermatology/dermatology.data . Le suffixe du fichier téléchargé est .data, et il peut être utilisé directement en le changeant en .csv ou .txt. J'ai changé les données en 'data.txt' .

Examinons maintenant le code dans train.py~

J'ai écrit le code directement ci-dessous : il existe 6 types d'étiquettes pour ces données, et j'ai défini le code ci-dessous pour itérer pendant 2 tours.

import numpy as np
import xgboost as xgb

# label need to be 0 to num_class -1
data = np.loadtxt('data.txt', delimiter='\t',
        converters={33: lambda x:int(x == '?'), 34: lambda x:int(x) - 1})
sz = data.shape

train = data[:int(sz[0] * 0.7), :]
test = data[int(sz[0] * 0.7):, :]

train_X = train[:, :33]
train_Y = train[:, 34]

test_X = test[:, :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.1
param['max_depth'] = 6
param['silent'] = 1
param['nthread'] = 4
param['num_class'] = 6

watchlist = [(xg_train, 'train'), (xg_test, 'test')]
num_round = 2   # 轮数设置成2轮
bst = xgb.train(param, xg_train, num_round, watchlist)
# get prediction
pred = bst.predict(xg_test)
error_rate = np.sum(pred != test_Y) / test_Y.shape[0]
print('Test error using softmax = {}'.format(error_rate))

Principe d'implémentation du problème de multi-classification xgboost

Après la formation, l'étape clé consiste à imprimer l'arborescence formée pour une visualisation facile. Le code suivant peut enregistrer la structure de l'arborescence sous forme de texte. Je pense que la forme textuelle est bien meilleure que la forme graphique.

bst.dump_model('multiclass_model')

Ensuite, nous ouvrons ce fichier. Chaque booster représente un arbre. Il y a 12 arbres dans ce modèle, et le booster va de 0 à 11.

booster[0]:
0:[f19<0.5] yes=1,no=2,missing=1
	1:[f21<0.5] yes=3,no=4,missing=3
		3:leaf=-0.0587906
		4:leaf=0.0906977
	2:[f6<0.5] yes=5,no=6,missing=5
		5:leaf=0.285523
		6:leaf=0.0906977
booster[1]:
0:[f27<1.5] yes=1,no=2,missing=1
	1:[f12<0.5] yes=3,no=4,missing=3
		3:[f31<0.5] yes=7,no=8,missing=7
			7:leaf=-1.67638e-09
			8:leaf=-0.056044
		4:[f4<0.5] yes=9,no=10,missing=9
			9:leaf=0.132558
			10:leaf=-0.0315789
	2:[f4<0.5] yes=5,no=6,missing=5
		5:[f11<0.5] yes=11,no=12,missing=11
			11:[f10<0.5] yes=15,no=16,missing=15
				15:leaf=0.264427
				16:leaf=0.0631579
			12:leaf=-0.0428571
		6:[f15<1.5] yes=13,no=14,missing=13
			13:leaf=-0.00566038
			14:leaf=-0.0539326
booster[2]:
0:[f32<1.5] yes=1,no=2,missing=1
	1:leaf=-0.0589339
	2:[f9<0.5] yes=3,no=4,missing=3
		3:leaf=0.280919
		4:leaf=0.0631579
booster[3]:
0:[f4<0.5] yes=1,no=2,missing=1
	1:[f0<1.5] yes=3,no=4,missing=3
		3:[f3<0.5] yes=7,no=8,missing=7
			7:[f27<0.5] yes=13,no=14,missing=13
				13:leaf=-0.0375
				14:leaf=0.0631579
			8:leaf=-0.0515625
		4:leaf=-0.058371
	2:[f2<1.5] yes=5,no=6,missing=5
		5:[f32<0.5] yes=9,no=10,missing=9
			9:[f15<0.5] yes=15,no=16,missing=15
				15:leaf=-0.0348837
				16:leaf=0.230097
			10:leaf=-0.0428571
		6:[f3<0.5] yes=11,no=12,missing=11
			11:leaf=0.0622641
			12:[f16<1.5] yes=17,no=18,missing=17
				17:leaf=-1.67638e-09
				18:[f3<1.5] yes=19,no=20,missing=19
					19:leaf=-0.00566038
					20:leaf=-0.0554622
booster[4]:
0:[f14<0.5] yes=1,no=2,missing=1
	1:leaf=-0.0590296
	2:leaf=0.255665
booster[5]:
0:[f30<0.5] yes=1,no=2,missing=1
	1:leaf=-0.0591241
	2:leaf=0.213253
booster[6]:
0:[f19<0.5] yes=1,no=2,missing=1
	1:[f21<0.5] yes=3,no=4,missing=3
		3:leaf=-0.0580493
		4:leaf=0.0831786
	2:leaf=0.214441
booster[7]:
0:[f27<1.5] yes=1,no=2,missing=1
	1:[f12<0.5] yes=3,no=4,missing=3
		3:[f31<0.5] yes=7,no=8,missing=7
			7:leaf=0.000227226
			8:leaf=-0.0551713
		4:[f15<1.5] yes=9,no=10,missing=9
			9:leaf=-0.0314418
			10:leaf=0.121289
	2:[f4<0.5] yes=5,no=6,missing=5
		5:[f11<0.5] yes=11,no=12,missing=11
			11:[f10<0.5] yes=15,no=16,missing=15
				15:leaf=0.206326
				16:leaf=0.0587528
			12:leaf=-0.0420568
		6:[f15<1.5] yes=13,no=14,missing=13
			13:leaf=-0.00512865
			14:leaf=-0.0531389
booster[8]:
0:[f32<1.5] yes=1,no=2,missing=1
	1:leaf=-0.0581933
	2:[f11<0.5] yes=3,no=4,missing=3
		3:leaf=0.0549185
		4:leaf=0.218241
booster[9]:
0:[f4<0.5] yes=1,no=2,missing=1
	1:[f0<1.5] yes=3,no=4,missing=3
		3:[f3<0.5] yes=7,no=8,missing=7
			7:[f27<0.5] yes=13,no=14,missing=13
				13:leaf=-0.0367718
				14:leaf=0.0600201
			8:leaf=-0.0506891
		4:leaf=-0.0576147
	2:[f27<0.5] yes=5,no=6,missing=5
		5:[f3<0.5] yes=9,no=10,missing=9
			9:leaf=0.0238016
			10:leaf=-0.054874
		6:[f5<1] yes=11,no=12,missing=11
			11:leaf=0.200442
			12:leaf=-0.0508502
booster[10]:
0:[f14<0.5] yes=1,no=2,missing=1
	1:leaf=-0.058279
	2:leaf=0.201977
booster[11]:
0:[f30<0.5] yes=1,no=2,missing=1
	1:leaf=-0.0583675
	2:leaf=0.178016

N'oubliez pas que nous sommes un problème à 6 catégories et que le nombre de tours d'entraînement num_round est fixé à 2. Parmi ces 12 arbres, il y a 6 arbres au premier tour, correspondant à booster0-booster5, et 6 arbres au second tour, correspondant à booster6-booster11. Le nième arbre du deuxième tour est appris sur la base du nième arbre du premier tour, puis les résultats des deux arbres sont additionnés, puis via la fonction softmax, la probabilité d'être prédit comme la nième classe est obtenu. Donc, ici, vous devez savoir comment xgboost entraîne les problèmes de multi-classification. En fait, à chaque tour, 6 arbres doivent être entraînés. Si vous ne comprenez pas softmax, vous pouvez vous référer à  la fonction softmax et à la dérivation de la fonction de perte des problèmes de multi-classification .

Quant à la dérivation de formule du problème multi-catégorie xgboost, elle n'est pas écrite dans ce blog, et je prévois d'écrire un article spécial sur la dérivation de formule ~

C'est la fin. S'il y a quelque chose qui ne va pas, veuillez laisser un message ~

 

おすすめ

転載: blog.csdn.net/qq_32103261/article/details/116748189