Перебор нескольких зависимых переменных в рабочем процессе ML - PullRequest
0 голосов
/ 09 января 2020

Допустим, я хочу предсказать, будет ли продукт куплен или нет. Моя характеристика будет зависеть от того, купил ли кто-то другие продукты и сколько дней прошло с момента покупки этого продукта.

Как выполнить итерацию всего моего рабочего процесса ML для каждого продукта?

import numpy as np

columns = ["Product_" + str(i) for i in np.arange(1, 6)] +\
          ["Product_" + str(i) + "_days" for i in np.arange(1, 6)]

## mock df 
df = pd.DataFrame(np.concatenate((np.random.binomial(1, 0.5, size=(5, 5)),
                  np.random.random_integers(0, 100, size=(5, 5))), axis=1),
                      columns=columns)

## Example for one run 
X = df.drop(['Product_1', 'Product_days_1'], axis=1) 
Y = df[['Product_1']]

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

#### ML workflow ####

## split into train test
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=2020)

## functions
def run_gridsearch(X, y, clf, param_grid, cv=5):
    ...

def report(grid_scores, n_top=3):
    ...

def run_prediction(test, clf_object):
    ...

def run_tuned_model(model, X, y):
    ...

class report_accuracy:
    ...

## set of parameters to test
param_grid = {...}

## Instantiate model object
clf = DecisionTreeClassifier()

## Run tuning
clf_cv = run_gridsearch(X_train, y_train, clf, param_grid, cv=5)

## train model with best params
clf_train = run_tuned_model(clf_cv, X_train, y_train)

## Predict on test set
pred = run_prediction(X_test, clf_train)

## Get accuracy report on test set
report_accuracy.all_reports(y_test, pred)

Ожидаемый результат Я не совсем уверен во всем, что я хочу, поэтому любые предложения / идеи будут оценены на этом этапе, но я ищу что-то вроде:

  1. Мне бы хотелось иметь хотя бы фрейм данных со всеми моими прогнозами для каждого продукта, чтобы его можно было легко объединить с исходным набором данных.

  2. Словарь отчета о точности по продукту

  3. И я также мечтаю сделать объект класса, чтобы я мог получить доступ к каждому прогнозу или обученной модели по продуктам индивидуально, например, MyWorkflow.models.Product_1.tuned_model.set_params ()

Но моя главная задача - заставить работать итерацию, и тогда придет остальное.

РЕДАКТИРОВАТЬ Я начал с этой проблемы, разбив ее на более мелкие проблемы, поэтому мой первый подвопрос:

Как я могу отбрасывать столбцы и создавать вложенные устанавливает, используя списки и словари?

(Мод: Должен ли это быть новый пост, вместо этого ссылка на этот пост?)

grouped = df.groupby(lambda x: re.match("^(.*?)\_\S", x).group(), axis=1)

dfList = []
for name, group in grouped:
    print('group name:', name)
    print(group)
    print(group.columns)
    dfList.append(df.drop(group.columns, axis=1))

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

...