详尽的网格搜索以选择功能

时间:2018-08-09 18:02:15

标签: python optimization machine-learning feature-selection hyperparameters

我一直在使用几种排名特征选择方法。如您所知,这些类型的算法会根据某些特定方法(例如统计,稀疏学习等)对功能进行排名,并且它们受多个超参数约束,必须对其进行调整才能获得最佳结果。

现有技术提出了用于参数调整的不同方法,通过查看Web,我发现了以下方法:网格搜索方法。根据此link的指定,搜索包括以下步骤:

  1. 功能选择器
  2. 搜索或采样候选者的方法;
  3. 参数空间
  4. 交叉验证方案
  5. 得分功能。

我在这段代码中总结了以下步骤(从第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%)。

显然,对于每个参数组合,都获得了后者的平均结果(请参见下表)。 例如,假设当前功能选择器仅需调整参数 alpha ,则下表中列出了我得到的结果。

enter image description here

我的问题是:是否有任何已知的方法可以根据所有功能或固定数量的功能所获得的结果来选择最佳的参数配置?

我考虑过将结果取平均值,并将其用作“最佳配置”,但我认为它不起作用。你们当中有人知道任何特定的方法吗?

如果有人可以帮助我,我将非常感激。

2 个答案:

答案 0 :(得分:0)

问题的至少一部分解决了您要用来选择超参数的度量。这取决于您的问题,但通常不应该将平均准确度用作度量。

为什么平均精度不正确?

平均准确度着重于最大的分类,或者对它更为敏感。但是通常这不是最有趣的课程。

通常最好使用F1-measure,它与平均准确度相似,但不相同。它是精度和查全率的谐波平均值,通常用于信息检索任务中,其中“正”类通常很小,而“负”类很大。

F1-Measure似乎在信息检索任务之外因为有偏见而受到批评,类似于准确性。更好的方法似乎是Matthews Correlation Coefficient。此度量使用混淆矩阵的所有单元,并且不会遭受与其他两个度量相同的偏差。我没有这种方法的经验,但是根据Wikipedia的文章,Davide Chicco在他的论文“ Ten quick tips for machine learning in computational biology”中建议使用。

答案 1 :(得分:0)

Ciao @DavideNardone

关于性能指标,@ kutschkem是正确的:如果您正在进行二进制分类,并且您的方法生成混淆矩阵,请使用 Matthews相关系数(MCC)代替精度或F1得分或其他比率。出于科学原因,请查看我的paper中的提示8。

关于如何为您的模型选择最佳配置,我认为您的多数方法是正确的方向。 我将以这种方式重新构架:

  1. 在特征数量变化时投票选择最佳配置(最高 Matthews相关系数MCC
  2. 选择投票数最多的配置。

也许这种方法不是世界上最好的方法,但肯定具有强大的科学背景(实际上,random forest中也使用了多数票)。

此外,我认为堆栈溢出可能不是询问计算智能问题的最佳位置;我建议您在Cross Validated或其他Stack Exchange websites上提出/提出这个问题。

祝你好运!