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 основные причины, по которым вы получаете это сообщение об ошибке:
- если фрейм данных содержит столбец символьного вектора вместо факторов. Просто преобразуйте столбец символов в 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 уровней. Уровень имеет различные значения для одной переменной. Удалите эту переменную и повторите попытку.
просто преобразовав все столбцы в фактор, вы можете избежать этой ошибки. Даже я столкнулся с этой ошибкой. Колонка, которая не превращалась в фактор. Я написал специально как.фактор для этого. И наконец мой код сработал.