使用数据库(不同表)中的数据定义 mlr3 任务?
Define mlr3 task using data from a database (different tables)?
这是一个新手问题。
如何定义使用来自 (sqlite) 数据库的数据的(分类)tsk
? mlr3db example 似乎先从内存写入数据。就我而言,数据已经在数据库中。可能是更大的问题,目标数据和特征在不同的表中。
我尝试了什么:
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "my_data.db")
my_features <- dplyr::tbl(con, "my_features")
my_target <- dplyr::tbl(con, "my_targets")
task <- mlr3::TaskClassif$new("my_task", backend=my_features, target="???")
然后我不知道如何指定 target
参数。
也许解决方案是在数据库中创建一个连接特征和目标的视图?
将数据拆分为 (1) 多个 table 或 (2) 多个数据库是可能的。在您的情况下,数据看起来只是分成多个 table,但您可以使用相同的 DBI 连接来访问它们。
您只需要一个键列来连接两个 table。在下面的示例中,我使用一个简单的整数键列和一个 inner_join()
将两个 table 合并为一个新的 table,但这在某种程度上取决于您的数据库方案。
library(mlr3)
library(mlr3db)
# base data set
data = iris
data$row_id = 1:nrow(data)
# create data base with two tables, split data into features and target and
# keep key column `row_id` in both tables
path = tempfile()
con = DBI::dbConnect(RSQLite::SQLite(), dbname = path)
DBI::dbWriteTable(con, "features", subset(data, select = - Species))
DBI::dbWriteTable(con, "target", subset(data, select = c(row_id, Species)))
DBI::dbDisconnect(con)
# re-open table
con = DBI::dbConnect(RSQLite::SQLite(), dbname = path)
# access tables with dplyr
tbl_features = dplyr::tbl(con, "features")
tbl_target = dplyr::tbl(con, "target")
# join tables with an inner_join
tbl_joined = dplyr::inner_join(tbl_features, tbl_target, by = "row_id")
# convert to a backend and create the task
backend = as_data_backend(tbl_joined, primary_key = "row_id")
mlr3::TaskClassif$new("my_task", backend, target = "Species")
这是一个新手问题。
如何定义使用来自 (sqlite) 数据库的数据的(分类)tsk
? mlr3db example 似乎先从内存写入数据。就我而言,数据已经在数据库中。可能是更大的问题,目标数据和特征在不同的表中。
我尝试了什么:
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "my_data.db")
my_features <- dplyr::tbl(con, "my_features")
my_target <- dplyr::tbl(con, "my_targets")
task <- mlr3::TaskClassif$new("my_task", backend=my_features, target="???")
然后我不知道如何指定 target
参数。
也许解决方案是在数据库中创建一个连接特征和目标的视图?
将数据拆分为 (1) 多个 table 或 (2) 多个数据库是可能的。在您的情况下,数据看起来只是分成多个 table,但您可以使用相同的 DBI 连接来访问它们。
您只需要一个键列来连接两个 table。在下面的示例中,我使用一个简单的整数键列和一个 inner_join()
将两个 table 合并为一个新的 table,但这在某种程度上取决于您的数据库方案。
library(mlr3)
library(mlr3db)
# base data set
data = iris
data$row_id = 1:nrow(data)
# create data base with two tables, split data into features and target and
# keep key column `row_id` in both tables
path = tempfile()
con = DBI::dbConnect(RSQLite::SQLite(), dbname = path)
DBI::dbWriteTable(con, "features", subset(data, select = - Species))
DBI::dbWriteTable(con, "target", subset(data, select = c(row_id, Species)))
DBI::dbDisconnect(con)
# re-open table
con = DBI::dbConnect(RSQLite::SQLite(), dbname = path)
# access tables with dplyr
tbl_features = dplyr::tbl(con, "features")
tbl_target = dplyr::tbl(con, "target")
# join tables with an inner_join
tbl_joined = dplyr::inner_join(tbl_features, tbl_target, by = "row_id")
# convert to a backend and create the task
backend = as_data_backend(tbl_joined, primary_key = "row_id")
mlr3::TaskClassif$new("my_task", backend, target = "Species")