将模型应用于数据 - 从子 class(模型)继承或访问根 class(数据)的属性

Applying models to data - Inheriting or accessing the attributes of a root class (data) from a sub-class (model)

我正在为几个不同的数据集拟合多个模型。我想将数据集的方法和属性(例如 X、y、trainTestSplit() 等)存储在 'Dataset' 对象中,并存储模型的方法和属性(例如 fit()、超参数,分数等)在'Model'对象中,并将'Models'存储在'Datasets'(每个数据集的几个模型)中。

我尝试了几种不同的方法来完成这项工作,包括使用 super() 进行继承;缩进(嵌套)数据集 class 中的模型 class;以及数据集 class 中的函数,模型 class 可以调用这些函数。

这与我来的差不多:

class Dataset :
    def __init__(self, X, y, attr) :
       self.X = X
       self.y = y
       self.attr = attr

    def trainTestSplit(self, **kwargs):
       self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(self.X, self.y, **kwargs)

class Model(Dataset) :
    def __init__(self, regressor):
        self.reg = regressor
        super().__init__(self)

    def fit(self):
        self.reg.fit(X=self.X_train, y=self.y_train)

    def predict(self):
        self.yPredict = self.reg.predict(X=self.X_test)

在上面,模型无法访问变量 class,因此 returns 和错误。

如果这可行,我希望执行以下函数调用,例如。

正在创建数据集对象的实例:

dataset_1 = Dataset(X, y, 'string')

将数据拆分为训练集和测试集:

dataset_1.trainTestSplit(test_size=0.3))

创建模型实例,并将其应用于数据集:

dataset_1.svr = Model(SVR(hyperParams))

拟合模型:

dataset_1.svr.fit()

实际上,如果我以正确的方式考虑这个问题,模型 class 的 fit() 方法可以作为 init 的一部分应用, 因此它适合实例化时的数据集。

正在读取训练分数:

dataset_1.svr.training_score_

因为我有这么多数据集,并且要为每个数据集拟合大量模型,以这种方式存储方法和属性似乎很有意义,但我不确定如何实现它。

有什么方法可以实例化一个 class(称之为子 class),这样它就可以继承或访问另一个 class 中包含的属性或对象(比如根 class),因此子 class 作为对象包含在根 class 中?还是我的想法不对?

所以我可能一直在尝试使用 类 字典更适合的地方。

以下似乎完成了我正在尝试做的事情,即将数据集和应用于它的模型的结果存储在一个对象中(其他属性,如 training/CV/test 分数等是仍待添加在下面的答案中)。

如果有人 suggestions/comments 关于如何做得更好,请发表评论。

谢谢。

from sklearn.model_selection import train_test_split

class Dataset(object):

def __init__(self, X, y):
    self.X = X
    self.y = y
    self.models = {}

def add_model(self, model, regressor):
    self.models[model] = {}
    self.models[model]['reg'] = regressor
    regressor.fit(self.X_train, self.y_train)
    yPredict = regressor.predict(self.X_test)
    self.models[model]['yPredict'] = yPredict

def trainTestSplit(self, **kwargs):
   self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(self.X, self.y, **kwargs)