2011-12-31 29 views
12

Tôi đang cố gắng chạy randomForest trên tập dữ liệu lớn-ish (5000x300). Đáng tiếc là tôi nhận được một thông báo lỗi như sau:R có cách nào để tìm giá trị Inf/-Inf không?

> RF <- randomForest(prePrior1, postPrior1[,6] 
+     ,,do.trace=TRUE,importance=TRUE,ntree=100,,forest=TRUE) 
Error in randomForest.default(prePrior1, postPrior1[, 6], , do.trace = TRUE, : 
    NA/NaN/Inf in foreign function call (arg 1) 

Vì vậy, tôi cố gắng để tìm thấy bất kỳ của Quốc hội sử dụng:

> df2 <- prePrior1[is.na(prePrior1)] 
> df2 
character(0) 
> df2 <- postPrior1[is.na(postPrior1[,6])] 
> df2 
numeric(0) 

dẫn tôi để tin rằng nó là của Inf đó là những vấn đề như có don' t dường như là bất kỳ của NA.

Bất kỳ đề xuất nào về cách root của Inf?

+0

Nó không phải được 'Inf'. Nó cũng có thể là 'NaN', như các lỗi nói. Bất kể, '? Inf' trả lời câu hỏi của bạn. –

Trả lời

22

Có thể bạn đang tìm kiếm is.finite, mặc dù tôi không chắc chắn 100% rằng sự cố là Infs trong dữ liệu đầu vào của bạn.

Hãy chắc chắn đọc trợ giúp dành cho is.finite cẩn thận về những kết hợp bị thiếu, vô hạn, v.v. nó chọn ra. Cụ thể, điều này:

> is.finite(c(1,NA,-Inf,NaN)) 
[1] TRUE FALSE FALSE FALSE 
> is.infinite(c(1,NA,-Inf,NaN)) 
[1] FALSE FALSE TRUE FALSE 

Một trong những điều này không giống những thứ khác. Không ngạc nhiên, có một hàm is.nan.

+0

Điều đó đã làm điều đó, cảm ơn bạn rất nhiều! – screechOwl

+3

Nói chung, các cảnh báo về NA/NaN/Inf từ randomForest là ** không ** do NA/NaN/Inf gây ra, nhưng thực tế là do dữ liệu ký tự. – smci

4

Tương tự như is.na, bạn có thể sử dụng is.infinite để tìm các lần xuất hiện của infinites.

2

Hãy xem with, ví dụ:

> with(df, df == Inf) 
     foo bar baz abc ... 
[1,] FALSE FALSE TRUE FALSE ... 
[2,] FALSE TRUE FALSE FALSE ... 
... 
10

randomForest của 'NA/NaN/Inf trong chức năng gọi nước ngoài thường là một cảnh báo sai, và thực sự khó chịu:

  • bạn sẽ nhận được thông báo này nếu bất kỳ biến nào được chuyển là ký tự
  • NaN thực và số Infs hầu như không bao giờ xảy ra trong dữ liệu sạch

nhanh và dơ bẩn lừa để thu hẹp điều xuống, làm một nhị phân tìm kiếm trong danh sách biến của bạn, và sử dụng các thông số dấu hiệu như ntree=2 để có được một đường chuyền liền/thất bại trên tập hợp con của các biến:

RF <- randomForest(prePrior1[m:n],ntree=2,...) 
1

Câu trả lời của joran là những gì bạn muốn và mang tính thông tin. Để biết thêm chi tiết về is.na()is.infinite(), bạn nên kiểm tra https://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/is.na-methods.html và bên cạnh đó, sau khi bạn nhận được vectơ logic cho biết mỗi phần tử của vectơ gốc là NA/Inf, bạn có thể sử dụng hàm which() để nhận các chỉ mục, này:

> v1 <- c(1, Inf, 2, NaN, Inf, 3, NaN, Inf) 
> is.infinite(v1) 
[1] FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE 
> which(is.infinite(v1)) 
[1] 2 5 8 
> is.na(v1) 
[1] FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE 
> which(is.na(v1)) 
[1] 4 7 

tài liệu cho which() là ở đây https://stat.ethz.ch/R-manual/R-devel/library/base/html/any.html

Các vấn đề liên quan