Aufgabe: Die Anzahl der Fälle von Dengue Fieber vorhersagen für 2 Städte, San Juan in Puerto Rico und Iquitos in Peru, anhand von Klima- und Vegetationsdaten wie Temperatur, Feuchtigkeit und Vegetationsindex.
mehr info, über dengue fieber
Beschreibung der Daten, Liste der Features, usw.:
Homepage der Challenge
- R
- R Studio
- Google Maps
- ...
## 'data.frame': 1456 obs. of 25 variables:
## $ city : Factor w/ 2 levels "iq","sj": 1 1 1 1 1 1 1 1 1 1 ...
## $ year : int 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 ...
## $ weekofyear : int 26 27 28 29 30 31 32 33 34 35 ...
## $ week_start_date : Factor w/ 1049 levels "1990-04-30","1990-05-07",..: 530 531 532 533 534 535 536 537 538 539 ...
## $ ndvi_ne : num 0.193 0.217 0.177 0.228 0.329 ...
## $ ndvi_nw : num 0.132 0.276 0.173 0.145 0.322 ...
## $ ndvi_se : num 0.341 0.289 0.204 0.254 0.254 ...
## $ ndvi_sw : num 0.247 0.242 0.128 0.2 0.361 ...
## $ precipitation_amt_mm : num 25.4 60.6 55.5 5.6 62.8 ...
## $ reanalysis_air_temp_k : num 297 297 296 295 296 ...
## $ reanalysis_avg_temp_k : num 298 298 297 296 298 ...
## $ reanalysis_dew_point_temp_k : num 295 295 296 293 294 ...
## $ reanalysis_max_air_temp_k : num 307 307 304 304 307 ...
## $ reanalysis_min_air_temp_k : num 293 291 293 289 292 ...
## $ reanalysis_precip_amt_kg_per_m2 : num 43.2 46 64.8 24 31.8 ...
## $ reanalysis_relative_humidity_percent : num 92.4 93.6 95.8 87.2 88.2 ...
## $ reanalysis_sat_precip_amt_mm : num 25.4 60.6 55.5 5.6 62.8 ...
## $ reanalysis_specific_humidity_g_per_kg: num 16.7 16.9 17.1 14.4 15.4 ...
## $ reanalysis_tdtr_k : num 8.93 10.31 7.39 9.11 9.5 ...
## $ station_avg_temp_c : num 26.4 26.9 26.8 25.8 26.6 ...
## $ station_diur_temp_rng_c : num 10.8 11.6 11.5 10.5 11.5 ...
## $ station_max_temp_c : num 32.5 34 33 31.5 33.3 32 34 33 34 34 ...
## $ station_min_temp_c : num 20.7 20.8 20.7 14.7 19.1 17 19.9 20.5 19 20 ...
## $ station_precip_mm : num 3 55.6 38.1 30 4 11.5 72.9 50.1 89.2 78 ...
## $ total_cases : int 0 0 0 0 0 0 0 0 0 0 ...
## city year weekofyear week_start_date
## iq:520 Min. :1990 Min. : 1.00 2000-07-01: 2
## sj:936 1st Qu.:1997 1st Qu.:13.75 2000-07-08: 2
## Median :2002 Median :26.50 2000-07-15: 2
## Mean :2001 Mean :26.50 2000-07-22: 2
## 3rd Qu.:2005 3rd Qu.:39.25 2000-07-29: 2
## Max. :2010 Max. :53.00 2000-08-05: 2
## (Other) :1444
## ndvi_ne ndvi_nw ndvi_se
## Min. :-0.40625 Min. :-0.45610 Min. :-0.01553
## 1st Qu.: 0.04495 1st Qu.: 0.04922 1st Qu.: 0.15509
## Median : 0.12882 Median : 0.12143 Median : 0.19605
## Mean : 0.14229 Mean : 0.13055 Mean : 0.20378
## 3rd Qu.: 0.24848 3rd Qu.: 0.21660 3rd Qu.: 0.24885
## Max. : 0.50836 Max. : 0.45443 Max. : 0.53831
## NA's :194 NA's :52 NA's :22
## ndvi_sw precipitation_amt_mm reanalysis_air_temp_k
## Min. :-0.06346 Min. : 0.00 Min. :294.6
## 1st Qu.: 0.14421 1st Qu.: 9.80 1st Qu.:297.7
## Median : 0.18945 Median : 38.34 Median :298.6
## Mean : 0.20231 Mean : 45.76 Mean :298.7
## 3rd Qu.: 0.24698 3rd Qu.: 70.23 3rd Qu.:299.8
## Max. : 0.54602 Max. :390.60 Max. :302.2
## NA's :22 NA's :13 NA's :10
## reanalysis_avg_temp_k reanalysis_dew_point_temp_k
## Min. :294.9 Min. :289.6
## 1st Qu.:298.3 1st Qu.:294.1
## Median :299.3 Median :295.6
## Mean :299.2 Mean :295.2
## 3rd Qu.:300.2 3rd Qu.:296.5
## Max. :302.9 Max. :298.4
## NA's :10 NA's :10
## reanalysis_max_air_temp_k reanalysis_min_air_temp_k
## Min. :297.8 Min. :286.9
## 1st Qu.:301.0 1st Qu.:293.9
## Median :302.4 Median :296.2
## Mean :303.4 Mean :295.7
## 3rd Qu.:305.5 3rd Qu.:297.9
## Max. :314.0 Max. :299.9
## NA's :10 NA's :10
## reanalysis_precip_amt_kg_per_m2 reanalysis_relative_humidity_percent
## Min. : 0.00 Min. :57.79
## 1st Qu.: 13.05 1st Qu.:77.18
## Median : 27.25 Median :80.30
## Mean : 40.15 Mean :82.16
## 3rd Qu.: 52.20 3rd Qu.:86.36
## Max. :570.50 Max. :98.61
## NA's :10 NA's :10
## reanalysis_sat_precip_amt_mm reanalysis_specific_humidity_g_per_kg
## Min. : 0.00 Min. :11.72
## 1st Qu.: 9.80 1st Qu.:15.56
## Median : 38.34 Median :17.09
## Mean : 45.76 Mean :16.75
## 3rd Qu.: 70.23 3rd Qu.:17.98
## Max. :390.60 Max. :20.46
## NA's :13 NA's :10
## reanalysis_tdtr_k station_avg_temp_c station_diur_temp_rng_c
## Min. : 1.357 Min. :21.40 Min. : 4.529
## 1st Qu.: 2.329 1st Qu.:26.30 1st Qu.: 6.514
## Median : 2.857 Median :27.41 Median : 7.300
## Mean : 4.904 Mean :27.19 Mean : 8.059
## 3rd Qu.: 7.625 3rd Qu.:28.16 3rd Qu.: 9.567
## Max. :16.029 Max. :30.80 Max. :15.800
## NA's :10 NA's :43 NA's :43
## station_max_temp_c station_min_temp_c station_precip_mm total_cases
## Min. :26.70 Min. :14.7 Min. : 0.00 Min. : 0.00
## 1st Qu.:31.10 1st Qu.:21.1 1st Qu.: 8.70 1st Qu.: 5.00
## Median :32.80 Median :22.2 Median : 23.85 Median : 12.00
## Mean :32.45 Mean :22.1 Mean : 39.33 Mean : 24.68
## 3rd Qu.:33.90 3rd Qu.:23.3 3rd Qu.: 53.90 3rd Qu.: 28.00
## Max. :42.20 Max. :25.6 Max. :543.30 Max. :461.00
## NA's :20 NA's :14 NA's :22
unfertig!
bla bli blub, plots mit plotly und korrelationen, einfache regressionen oder so rein
fir jede oder manche vars jeweils ein paar plots machen: https://www.statmethods.net/advgraphs/layout.html
die “explosionen” genauer angucken: welche werte sind da auch hoch? wird das von nem linearen modell abgebildet? oder exponentiell/ interaktionseffekt?
Unsere grundsätzliche Vorgehensweise und der entsprechende R-Code dazu findet sich hier.
Als Minimallösung wurden keine Features bearbeitet oder neue erzeugt, und ein random forest Modell mit Standardeinstellungen an alle Features angepasst.
Das Modell liefert eine Varianzaufklärung von ~60% bei den Trainingsdaten und erreicht bei Upload einen Score (Mean Absolute Error, MAE) von 25.8966 (Rang 954 von 5633 auf drivendata - Stand 6.3.19).
Dieses Modell benutzen wir als Baseline, die wir versuchen zu übertreffen.
# Importe und Optionen ----------------------------------------------------
rm(list = ls())
cat("\014")
library(randomForest)
options(stringsAsFactors = T, scipen = 20, max.print = 300)
SPEICHERN <- F
datum <- format(Sys.time(), "%m-%d-%H%-%M")
savename <- paste0(datum, "_minimal") # filename zum speichern von Ergebnis und Model
# Ordnerstruktur ----------------------------------------------------------
pf.root <- "F:/Data Science/4. Semester/Advanced Data Challenge/dengue/"
pf.data <- paste0(pf.root, "data/")
pf.saves <- paste0(pf.root, "saves/")
# Daten einlesen ----------------------------------------------------------
train.features <- read.csv(paste0(pf.data, "dengue_features_train.csv"))
train.labels <- read.csv(paste0(pf.data, "dengue_labels_train.csv"))
test.features <- read.csv(paste0(pf.data, "dengue_features_test.csv"))
sub.form <- read.csv(paste0(pf.data, "submission_format.csv"))
# Preprocessing -----------------------------------------------------------
# train, test, ergebnis erzeugen
train <- merge(train.features, train.labels)
test <- test.features
test$total_cases <- 0
ergebnis <- sub.form
# Variablen loeschen
train$week_start_date <- NULL
test$week_start_date <- NULL
# Fehlende Werte imputieren -----------------------------------------------
# Median/Mode Imputation (wird spaeter anders gemacht)
train <- randomForest::na.roughfix(train)
test <- randomForest::na.roughfix(test)
# Feature Engineering -----------------------------------------------------
# kommt spaeter
# Model bilden und trainieren ---------------------------------------------
model <- randomForest::randomForest(total_cases ~ ., data=train)
# model <- readRDS(paste0(pf.saves, "_model.Rds"))
model
##
## Call:
## randomForest(formula = total_cases ~ ., data = train)
## Type of random forest: regression
## Number of trees: 500
## No. of variables tried at each split: 7
##
## Mean of squared residuals: 758.2141
## % Var explained: 60.08
mae_train <- mean(abs(train$total_cases - model$predicted))
mae_train
## [1] 14.16345
# cross validation, hyperparameter tuning, ... kommt spaeter
# Vorhersage --------------------------------------------------------------
pred <- predict(model, test)
ergebnis$total_cases <- pred
# Nachbearbeitung ---------------------------------------------------------
# falls negativ auf 0 setzen
ergebnis$total_cases <- ifelse(ergebnis$total_cases < 0, 0, ergebnis$total_cases)
# runden, Upload muss ganze Zahlen beinhalten
ergebnis$total_cases <- round(ergebnis$total_cases)
# Ergebnis und Model speichern --------------------------------------------
if(SPEICHERN){
write.csv(ergebnis, paste0(pf.saves, savename, "_result.csv"), quote = F, row.names = F)
saveRDS(model, paste0(pf.saves, savename, "_model.Rds"))
}
Die Zeit zwischen dem Stich der Aedes-Mücke und dem Auftreten der ersten Symptome (Inkubationszeit) beträgt drei bis 14 Tage. Meistens bricht die Infektion zwischen dem 4. und 7. Tag aus.
Das Dengue-Fieber hat sich in den vergangenen Jahrzehnten stark verbreitet. In den letzten 50 Jahren hat sich die Zahl der infizierten Menschen verdreißigfacht. Experten schätzen, dass weltweit jedes Jahr rund 400 Millionen Menschen am Dengue-Virus erkranken. Damit ist das Dengue-Fieber die am stärksten durch Mücken verbreitete Erkrankung der Welt.