XGBOOST-Multi класс предсказания. Матрица прогнозирования - это набор вероятностей для классов. Как выполнить путаницу матрицы - PullRequest
1 голос
/ 29 января 2020

Я использовал XGBOOST для прогнозирования меток для нескольких классов.

Это прогноз для нескольких меток. т.е. мое целевое значение содержит 8 классов, и у меня есть около 6 функций, которые я использую, поскольку они очень сильно коррелируют с целевым значением.

Я создал свой набор данных прогноза. Я преобразовал данные в матрицу с помощью as.data.frame

Я хотел проверить точность своего прогноза. Я не уверен, как, так как имена col меняются, и в моем наборе данных нет уровней. Все типы данных, которые я использую, являются целыми и числовыми.

 Response <- train$Response
 label <- as.integer(train$Response)-1
 train$Response <- NULL

 train.index = sample(n,floor(0.75*n))
 train.data = as.matrix(train[train.index,])
 train.label = label[train.index]`
 test.data = as.matrix(train[-train.index,])
 test.label = label[-train.index]

 View(train.label)

 # Transform the two data sets into xgb.Matrix
 xgb.train = xgb.DMatrix(data=train.data,label=train.label)
 xgb.test = xgb.DMatrix(data=test.data,label=test.label)




  params = list(
          booster="gbtree",
          eta=0.001,
          max_depth=5,
          gamma=3,
          subsample=0.75,
          colsample_bytree=1,
          objective="multi:softprob",
          eval_metric="mlogloss",
          num_class=8)

    xgb.fit <-xgb.train(
    params=params,
    data=xgb.train,
    nrounds=10000,
    nthreads=1,
    early_stopping_rounds=10,
    watchlist=list(val1=xgb.train,val2=xgb.test),
    verbose=0
      )

   xgb.fit



  xgb.pred = predict(xgb.fit,test.data,reshape = T)
  class(xgb.pred)
  xgb.pred = as.data.frame(xgb.pred)

   """

Теперь я получил свои вероятности предсказания в форме ниже, так как в 8 классах у меня 8 вероятностей. Я не знаю, какая вероятность принадлежит какой переменной.

1   0.12233257  0.07373134  0.044682350 0.0810693502    0.06272415  0.134308174 0.066143863 0.415008187

Я хочу преобразовать их в значимые метки. что я не могу сделать. Для выполнения путаницы матрицы

Ответы [ 2 ]

1 голос
/ 30 января 2020

Скажем, ваши данные примерно такие:

train = data.frame(
  Medical_History_23 = sample(1:5,2000,replace=TRUE), 
  Medical_Keyword_3 = sample(1:5,2000,replace=TRUE), 
  Medical_Keyword_15 = sample(1:5,2000,replace=TRUE), 
  BMI = rnorm(2000), 
  Wt = rnorm(2000), 
  Medical_History_4 = sample(1:5,2000,replace=TRUE), 
  Ins_Age = rnorm(2000), 
  Response = sample(1:8,2000,replace=TRUE)) 

И мы проводим обучение и тестирование:

library(xgboost)
label <- as.integer(train$Response)-1
train$Response <- NULL
n = nrow(train)
train.index = sample(n,floor(0.75*n))
train.data = as.matrix(train[train.index,])
train.label = label[train.index]
test.data = as.matrix(train[-train.index,])
test.label = label[-train.index]
xgb.train = xgb.DMatrix(data=train.data,label=train.label)
xgb.test = xgb.DMatrix(data=test.data,label=test.label)

params = list(booster="gbtree",eta=0.001,
          max_depth=5,gamma=3,subsample=0.75,
          colsample_bytree=1,objective="multi:softprob",
          eval_metric="mlogloss",num_class=8)

xgb.fit <-xgb.train(params=params,data=xgb.train,
    nrounds=10000,nthreads=1,early_stopping_rounds=10,
    watchlist=list(val1=xgb.train,val2=xgb.test),
    verbose=0
      )

xgb.pred = predict(xgb.fit,test.data,reshape = T)

Ваш прогноз выглядит следующим образом, каждый столбец - это вероятность будучи 1,2 ... 8

> head(xgb.pred)
         V1        V2        V3        V4        V5        V6        V7        V8
1 0.1254475 0.1252269 0.1249843 0.1247929 0.1246919 0.1248430 0.1248226 0.1251909
2 0.1255558 0.1249674 0.1250741 0.1250397 0.1249939 0.1247931 0.1248649 0.1247111
3 0.1249737 0.1250508 0.1249501 0.1250445 0.1250142 0.1249630 0.1249194 0.1250844

Чтобы получить метку предсказания, мы делаем

predicted_labels= factor(max.col(xgb.pred),levels=1:8)
obs_labels = factor(test.label,levels=1:8)

Чтобы получить матрицу путаницы:

caret::confusionMatrix(obs_labels,predicted_labels)

Конечно этот пример будет иметь низкую точность, потому что в переменных нет полезной информации, но код должен работать на вас.

1 голос
/ 30 января 2020

В том же порядке, что и ваш ярлык. Например:

0.415008187

- вероятность возникновения восьмого класса и так далее.

...