Я работал с несколькими подходами к выбору признаков ранжирования. Как вы, возможно, знаете, алгоритмы этого типа ранжируют признаки в соответствии с каким-то конкретным методом (например, статистическим, разреженным обучением и т. д.), и они управляются несколькими гиперпараметрами, которые необходимо настроить для достижения наилучших результатов.
Современный уровень техники представляет другой подход к настройке параметров, и, просматривая Интернет, я наткнулся на следующий метод: подход с поиском по сетке. Как указано в этой ссылке, поиск состоит из следующих шагов:
- Селектор функций
- Метод поиска или выборки кандидатов;
- Пространство параметров
- Схема перекрестной проверки
- Функция оценки.
Я суммировал следующие шаги (начиная с пункта 3) в этом фрагменте кода:
tuned_parameters = {
'LASSO': {'alpha': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]},
}
# pick the i-th feature selector
for fs_name, fs_model in slb_fs.iteritems():
comb = []
params_name = []
for name, tun_par in tuned_parameters[fs_name].iteritems():
comb.append(tun_par)
params_name.append(name)
# function for creating all the exhausted combination of the parameters
print ('\t3 - Creating parameters space: ')
combs = create_grid(comb)
for comb in combs:
# pick the i-th combination of the parameters for the k-th feature selector
fs_model.setParams(comb,params_name,params[fs_name])
# number of folds for k-CV
k_fold = 5
X = dataset.data
y = dataset.target
kf = KFold(n_splits=k_fold)
print ('\t4 - Performing K-cross validation: ')
for train_index, test_index in kf.split(X):
X_train, X_test = X[train_index, :], X[test_index, :]
y_train, y_test = y[train_index], y[test_index]
print ('\t5.1 - Performing feature selection using: ', fs_name)
idx = fs_model.fit(X_train, y_train)
# At this point I have the ranked features
print ('5.2 - Classification...')
for n_rep in xrange(step, max_num_feat + step, step):
# Using classifier to evaluate the algorithm performance on the test set using incrementally the retrieved feature (1,2,3,...,max_num_feat)
X_train_fs = X_train[:, idx[0:n_rep]]
X_test_fs = X_test[:, idx[0:n_rep]]
_clf = clf.Classifier(names=clf_name, classifiers=model)
DTS = _clf.train_and_classify(X_train_fs, y_train, X_test_fs, y_test)
# Averaging results of the CV
print('\t4.Averaging results...')
В пункте 5.1 я использую классификатор для оценки производительности, полученной выбранным селектором функций на подмножестве функций (в моем случае я использую их постепенно, поскольку функция ранжируется) и усредняю результаты с помощью схемы перекрестной проверки. . Результаты, которые у меня есть на данный момент, представляют собой среднюю оценку точности для каждого подмножества функций (например, 1: 70%, 2:75, 3:77%,..., N: 100%).
Очевидно, что последние усредненные результаты получаются для каждой комбинации параметров (см. таблицу ниже). Например, предположим, что текущему селектору функций нужно просто настроить параметр альфа, результаты, которые я получу, перечислены в следующей таблице.
Мой вопрос: существует ли какой-либо известный подход для выбора наилучшей конфигурации параметров на основе достигнутых результатов для всех функций или фиксированного их количества?
Я думал о том, чтобы усреднить результаты и использовать его как «лучшую конфигурацию», но я не думаю, что это сработает. Кто-нибудь из вас знает какой-то конкретный подход?
Я был бы очень благодарен, если бы кто-то мог мне помочь.