Предполагая, что у меня есть данные, которые выглядят следующим образом:
| group_id | x1 | x2 | y |
|----------+----+----+---|
| 1 | 0 | 0 | 1 |
| 1 | 0 | 0 | 2 |
| 2 | 0 | 0 | 3 |
| 2 | 0 | 0 | 4 |
| 3 | 0 | 0 | 5 |
| 3 | 0 | 0 | 6 |
Ключевым качеством этого набора данных является то, что все строки имеют одинаковый тип данных, но каждая строка принадлежит определенной группе.
Что я могу использовать в Scikit, чтобы научиться выполнять следующее:
Для каждого group_id
найдите подмножество group_id
s, которые приводят к наилучшей производительности дляОценщик, определенный пользователем.
Пример вывода:
Модель LinearRegression
будет использоваться в качестве оценщика ...
LinearRegression
лучше всего работает на group_id(1)
, когда вы фильтруете набор данных, чтобы включить только group_ids([1, 2, 3])
LinearRegression
лучше всего работает на group_id(2)
, когда вы фильтруете набор данных, чтобы включить только group_ids([1, 2])
LinearRegression
лучше всего работает на group_id(3)
, когда вы фильтруете набор данных, чтобы включить только group_ids([3])
Пример реализации (но есть ли более эффективный способ?):
class FilterDownEstimator:
def __init__(self, subset_ids):
self.subset_ids = subset_ids
self.model_ = None
def fit(self, X):
# filter down X to only ids in self.subset_ids
self.model_ = LinearRegression().fit(filtered_down_X)
def predict(self, X):
self.model_.predict(X)
# ideally generated using itertools.combinations
grid = {
'subset_ids': [
(1,),
(2,),
(3,),
(1, 2),
(1, 3),
(2, 3),
(1, 2, 3),
],
}
best_params = {
1: None,
2: None,
3: None,
}
for group_id in full_data_df.group_id.unique():
grid_cv = GridSearchCV(estimator=FilterDownEstimator, param_grid=grid)
# y = y's for this particular group_id
grid_cv.fit(full_data_df[['group_id', 'x1', 'x2']], y)
best_params[group_id] = grid_cv.best_params_
print(best_params)
# { 1: (1, 2, 3), 2: (1, 2), 3: (3,) }