Допустим, я хочу предсказать, будет ли продукт куплен или нет. Моя характеристика будет зависеть от того, купил ли кто-то другие продукты и сколько дней прошло с момента покупки этого продукта.
Как выполнить итерацию всего моего рабочего процесса 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)
Ожидаемый результат Я не совсем уверен во всем, что я хочу, поэтому любые предложения / идеи будут оценены на этом этапе, но я ищу что-то вроде:
Мне бы хотелось иметь хотя бы фрейм данных со всеми моими прогнозами для каждого продукта, чтобы его можно было легко объединить с исходным набором данных.
Словарь отчета о точности по продукту
И я также мечтаю сделать объект класса, чтобы я мог получить доступ к каждому прогнозу или обученной модели по продуктам индивидуально, например, 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))
С этим кодом я смог сгруппировать столбцы, которые я хочу отбросить для каждого прогона, но фактическая строка сброса не запустилась.