R randomForest для классификации

Я пытаюсь сделать классификацию с randomForest, но я неоднократно получаю сообщение об ошибке, для которого, похоже, нет очевидного решения (randomForest хорошо работал для меня, делая регрессию в прошлом). Я вставил свой код ниже. "успех" - это фактор, все зависимые переменные-это числа. Любые предложения о том, как правильно запустить эту классификацию?

> rf_model<-randomForest(success~.,data=data.train,xtest=data.test[,2:9],ytest=data.test[,1],importance=TRUE,proximity=TRUE)

Error in randomForest.default(m, y, ...) : 
  NA/NaN/Inf in foreign function call (arg 1)

кроме того, вот пример набора данных:

руководителя(сведения)

success duration  goal reward_count updates_count comments_count backers_count     min_reward_level max_reward_level
True 20.00000  1500           10            14              2            68                1             1000
True 30.00000  3000           10             4              3            48                5             1000
True 24.40323 14000           23             6             10           540                5             1250
True 31.95833 30000            9            17              7           173                1            10000
True 28.13211  4000           10            23             97          2936               10              550
True 30.00000  6000           16            16            130          2043               25              500

5 ответов


вы пробовали регрессию по тем же данным? если нет, то проверьте значения "Inf" в ваших данных и попробуйте удалить его, если таковые имеются, после удаления NAs и NaNs. Вы можете найти полезную информацию, касающуюся удаления Inf снизу,

R есть ли способ найти значения Inf/-Inf?

например,

Class V1    V2  V3  V4  V5  V6  V7  V8  V9
1   11  Inf 4   232 23  2   2   34  0.205567767
1   11  123 4   232 23  1   2   34  0.162357601
1   13  123 4   232 23  1   2   34  -0.002739357
1   13  123 4   232 23  1   2   34  0.186989878
2   67  14  4   232 67  1   2   34  0.109398677
2   67  14  4   232 67  2   2   34  0.18491187
2   67  14  4   232 34  2   2   34  0.098728256
2   44  769.03  4   21  34  2   2   34  0.204405869
2   44  34  4   11  34  1   2   34  0.218426408

# When Classification was performed, following error pops out.
rf_model<-randomForest(as.factor(Class)~.,data=data,importance=TRUE,proximity=TRUE)
Error in randomForest.default(m, y, ...) : 
NA/NaN/Inf in foreign function call (arg 1)

# Regression was performed, following error pops out.
rf_model<-randomForest(Class~.,data=data,importance=TRUE,proximity=TRUE)
Error in randomForest.default(m, y, ...) : 
NA/NaN/Inf in foreign function call (arg 1)

Итак, пожалуйста, проверьте свои данные очень тщательно. Кроме того: предупреждение: В randomForest.по умолчанию (m, y,...) : Ответ пять или меньше уникальных значений. Вы уверены, что хотите сделать регресс?


помимо очевидных фактов вокруг присутствия NAs и т. д. эта ошибка почти всегда вызвана наличием типов символьных объектов в наборе данных. Способ понять это-рассмотреть, что на самом деле делает случайный лес. Вы разделяете набор данных по компонентам. Итак, если один из объектов является символьным вектором, как бы вы разделили набор данных? Вам нужны категории для разделения данных. Сколько "мужских" против "женских" - категорий...

для числовых характеристики как возраст, или цена, вы можете создать категории, сегментация; больше определенного возраста, меньшей, чем определенная цена и т. д. Вы не можете сделать это с чистыми чертами характера. Поэтому они нужны вам как факторы в наборе данных.


В общем, есть 2 основные причины, по которым вы получаете это сообщение об ошибке:

  1. если фрейм данных содержит столбец символьного вектора вместо факторов. Просто преобразуйте столбец символов в factor

2.Если данные содержат неверные значения, применение случайного леса также приведет к этой ошибке.Головка не будет отображать значения выбросов. Например:

x = rep(x = sample(c (0,1)), times = 24 )

y = c(sample.int(n=50,size = 40),Inf,Inf)

df = data.frame(col1 = x , col2 = y )

head(df)
    col1 col2
>  1    1   26
>  2    0   33
>  3    1   23
>  4    0   21
>  5    1   45
>  6    0   27

теперь применение randomForest на df вызовет ту же ошибку:

model = randomForest (data = df , col2 ~ col1 , ntree = 10)

ошибка в randomForest.по умолчанию (m, y,...) : NA/NaN / Inf в вызове внешней функции (arg 2)

решение: позволяет определить плохие значения в df. Как написал выше.метод finite () проверяет, содержит ли входной вектор правильные конечные значения или нет. Например:

есть.конечный (c (5,6,1000000, NaN,Inf))
[1] ВЕРНО НЕВЕРНО НЕВЕРНО

теперь давайте определим столбцы, содержащие плохие значения в нашем фрейме данных, и подсчитаем их.

sum(!есть.конечное(как.вектор (df [, имена (df) %в% c ("col2")])))
[1] 4
sum (!есть.конечное(как.вектор (df [, names (df) %in% c ("col1")])))
[1] 0

давайте отбросим эти записи и возьмем только хорошие записи :

df1 =df[is.конечное(как.вектор (df [, имена (df) %в% c ("col2")]))&
есть.конечное(как.вектор(df[,names(df) %in% c("col1")]),]

и запустите randomForest еще раз:

model1 = randomForest (data = df1 , col2 ~ col1 , ntree = 10)
Звоните:
randomForest (формула = col2 ~ col1, data = df1, ntree = 10)


Это потому, что для одной из ваших переменных существует более 32 уровней. Уровень имеет различные значения для одной переменной. Удалите эту переменную и повторите попытку.


просто преобразовав все столбцы в фактор, вы можете избежать этой ошибки. Даже я столкнулся с этой ошибкой. Колонка, которая не превращалась в фактор. Я написал специально как.фактор для этого. И наконец мой код сработал.