Применение моделей к данным - Наследование или доступ к атрибутам корневого класса (данных) из подкласса (модели) - PullRequest
0 голосов
/ 25 мая 2019

Я подгоняю несколько моделей к нескольким наборам данных. Я хотел бы сохранить методы и атрибуты наборов данных (например, X, y, trainTestSplit () и т. Д.) В объектах «Набор данных» и сохранить методы и атрибуты моделей (например, fit (), гиперпараметры, оценки и т. д.) в объектах «Модель» и сохраните «Модели» в «наборах данных» (несколько моделей для каждого набора данных).

Я пробовал несколько разных способов заставить это работать, включая наследование с использованием super (); выравнивание (вложение) класса Model внутри класса набора данных; и с функциями в классе Dataset, которые могут быть вызваны классом Model.

Это примерно так близко, как я пришел:

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)

В приведенном выше примере переменные недоступны для класса Model, поэтому он возвращает и ошибку.

Если бы это сработало, я ожидал бы выполнить следующие вызовы функций, как примеры.

Создание экземпляра объекта набора данных:

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

Разделение данных на обучающие и тестовые наборы:

dataset_1.trainTestSplit(test_size=0.3))

Создание экземпляра модели и применение его к набору данных:

dataset_1.svr = Model(SVR(hyperParams))

Примерка модели:

dataset_1.svr.fit()

На самом деле, если я правильно подумаю об этом, метод fit () класса Model может быть применен как часть init , так что он подходит для набора данных на конкретизации.

Чтение результатов обучения:

dataset_1.svr.training_score_

Поскольку у меня так много наборов данных, и я буду приспосабливать множество моделей к каждой, сохранение методов и атрибутов таким образом, казалось, имело смысл, но я не уверен, как это реализовать.

Есть ли способ создать экземпляр класса (назовите его подклассом), чтобы он наследовал или имел доступ к атрибутам или объектам, содержащимся в другом классе (скажем, к корневому классу), и поэтому подкласс содержится как объект внутри корневого класса? Или я думаю об этом не так?

1 Ответ

0 голосов
/ 26 мая 2019

Так что я, возможно, пытался использовать классы, где словарь был бы более подходящим.

Кажется, что то, что я пытаюсь сделать, выполняет следующее: хранить набор данных и результаты моделей.применяется к нему в одном объекте (другие атрибуты, такие как обучение / CV / результаты тестов и т. д. все еще должны быть добавлены в ответе ниже).

Если у кого-либо есть какие-либо предложения / комментарии относительно того, как это можно сделатьлучше, пожалуйста, прокомментируйте.

Спасибо.

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)
...