我有一个大的森林火灾数据集,我想预测火灾何时点燃。这种情况很少发生:620 000 次中有 290 次。
A tibble: 62,905 x 13
amplitude polarity DEM_avg DC DMC DSR FFMC Pd RH TEMP WS tree_cover fire
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct>
1 -37.8 0 165. 269. 21.9 0.607 84.0 0 65.1 290. 4.36 8 0
2 -68.1 0 303. 168. 44.5 1.41 89.9 0 46.6 296. 0.692 34.7 0
3 -54.3 0 332. 168. 44.5 1.41 89.9 0 46.6 296. 0.692 35.8 1
4 -108. 0 338. 168. 44.5 1.41 89.9 0 46.6 296. 0.692 30.3 0
5 -60.3 0 374. 171. 35.7 2.30 88.9 0.3 51.7 295. 4.01 29.6 1
6 -82.8 0 48.2 133. 18.4 0.210 84.9 0 65.1 289. 1.35 18.7 0
7 -99.6 0 299. 219. 42.6 2.09 90.8 0 34.2 297. 1.42 7 1
8 -98.1 0 116. 153. 44.7 0.988 89.0 0 41.3 298. 0.235 32.6 0
我尝试使用 SMOTE 来平衡我高度不平衡的数据集与 StupidWolf 建议的更改。我执行以下操作:
library(readr)
library(tidyverse)
library(caret)
library(DMwR)
data <- read_csv("data/fire2018.csv",
col_types = cols(fire = col_factor(levels = c("0",
"1"))))
training.samples <- data$fire %>% createDataPartition(p = 0.8, list = FALSE)
train.data <- data[training.samples, ]
test.data <- data[-training.samples, ]
SMOTE(fire ~ amplitude + polarity_dummy + DEM_avg + DC + DMC + DSR + FFMC + Pd + RH + T + VPD + WS + tree_cover, data = data.frame(train.data), perc.over = 600, perc.under = 100)
但是,当我使用 DMwR 包中的 SMOTE 时,我现在收到以下错误:
Error in factor(newCases[, a], levels = 1:nlevels(data[, a]), labels = levels(data[, :
invalid 'labels'; length 0 should be 1 or 2
In addition: Warning messages:
1: In if (class(data[, col]) %in% c("factor", "character")) { :
the condition has length > 1 and only the first element will be used
2: In smote.exs(data[minExs, ], ncol(data), perc.over, k) :
NAs introduced by coercion
3: In smote.exs(data[minExs, ], ncol(data), perc.over, k) :
NAs introduced by coercion
我一直在寻找不同的解决方案。一位建议将变量转换为数值和因子,但我的变量已经正确转换。我的因变量是 2 个水平的因子,自变量是数字,我的任何变量都没有 N/A。但是,这对我的情况没有帮助。我遇到了类似的错误。