【问题标题】:Finding optimal feature using Lasso regression in binary classification在二元分类中使用 Lasso 回归寻找最优特征
【发布时间】:2016-03-18 06:06:57
【问题描述】:

我正在处理大数据,我想找到重要的特征。 由于我是生物学家,所以请原谅我缺乏知识。

我的数据集有大约 5000 个属性和 500 个样本,它们具有二进制类 0 和 1。此外,数据集是有偏差的 - 样本大约有 400 个 0 和 100 个 1。 我想找到一些对确定类影响最大的特征。

  A1   A2   A3  ... Gn Class
S1    1.0  0.8 -0.1 ... 1.0 0 
S2    0.8  0.4  0.9 ... 1.0 0
S3   -1.0 -0.5 -0.8 ... 1.0 1
...

由于我从上一个问题中得到了一些建议,我正在尝试使用 L1 惩罚的 Lasso 回归来找到其作为重要特征的属性系数,因为它使不重要特征的得分为 0。

我正在使用 scikit-learn 库来完成这项工作。

所以,我的问题是这样的。

  1. 我可以对 biased 二元类使用 Lasso 回归吗?如果不是,虽然不使用 L1 惩罚,但使用 Logistic 回归是否是一个很好的解决方案?

  2. 如何使用 LassoCV 找到 alpha 的最佳值?文档说LassoCV支持,但是找不到功能。

  3. 这种分类还有其他好办法吗?

非常感谢。

【问题讨论】:

    标签: python machine-learning scikit-learn classification regression


    【解决方案1】:

    您应该使用分类器而不是回归器,这样 SVM 或逻辑回归都可以完成这项工作。相反,您可以使用 SGDClassifier,您可以将损失参数设置为逻辑回归的“log”或 SVM 的“铰链”。 在 SGDClassifier 中,您可以将惩罚设置为“l1”、“l2”或“elasticnet”中的任何一个,后者是两者的组合。

    您可以通过遍历不同的 alpha 值并评估验证集的性能来找到“alpha”的最佳值,或者您可以将 gridsearchcv 用作:

    tuned_parameters = {'alpha': [10 ** a for a in range(-6, -2)]}
    clf = GridSearchCV(SGDClassifier(loss='hinge', penalty='elasticnet',l1_ratio=0.15, n_iter=5, shuffle=True, verbose=False, n_jobs=10, average=False, class_weight='balanced')
                      , tuned_parameters, cv=10, scoring='f1_macro')
    
    #now clf is the best classifier found given the search space
    clf.fit(X_train, Y_train)
    #you can find the best alpha here
    print(clf.best_params_)    
    

    这会搜索您在 tune_parameters 中提供的 alpha 值范围,然后找到最佳值。您可以将性能标准从“f1_macro”更改为“f1_weighted”或其他指标。

    要解决数据集在标签方面的偏斜问题,请使用 SGDCassifier 的 class_weight 参数并将其设置为“平衡”。

    要查找有助于类标签的前 10 个特征,您可以找到以下索引:

    for i in range(0, clf.best_estimator_.coef_.shape[0]):
        top10 = np.argsort(clf.best_estimator_.coef_[i])[-10:]
    

    注意 1:最好将数据集的某些部分保留为验证/测试集,并在找到最佳模型后对保留的数据进行评估。

    注意 2:通过将行或列划分为行或列的 'l2' 或 'l1' 来看看它对不同类型的特征归一化和样本归一化的影响性能使用normalizer

    注意 3:对于 elasticnet 正则化,请使用 l1_ratio 参数。

    【讨论】:

    • 看来对我帮助很大。我虽然应该在选择好的特征(用于降维)之后进行分类,但是 SGDClassifier 似乎只做一次 - 所以我不需要单独考虑特征选择和分类。虽然我以前从未听说过 SGD 的概念,但我想尝试一下。非常感谢您的详细解答。
    • SGDClassifier 成本函数等于逻辑回归和 SVM,具体取决于损失参数设置('log' 或 'hinge')。唯一的区别是,它不是在 SVM 和 LR 中更新模型的整个参数,而是在迭代样本或批量样本时逐渐更新它。
    • 是的,这是真的。通过从标记数据中学习,在监督模型中自动完成特征选择。
    • clf.best_estimator_.coef 是矩阵 M x N,其中 N 是特征数,M 是输出类数,在您的情况下为 2。 coef[i, j] 是特征 j 在类 i 中的重要性。 argsort(coef[i]) 为您提供按 i 类中的重要性(从低到高)排序的特征索引。上面代码中的 [-10:0] 为您提供了前 10 个索引(最后一个)。 Lasso 是“l1”正则化,因此如果您在参数中将惩罚设置为“l1”,则意味着您正在使用 lasso,这会使 coef 矩阵中的许多权重为零。所以只需使用 'l1' 作为惩罚,并使用 argsort 来获取顶级功能。
    • coef[i] 是一个向量,每个特征都有 N 维。每个特征在这个向量中都有一个权重,这意味着该特征对于识别类 i 的重要性。所以除了权重为零时,所有特征都被使用。使用“l1”正则化(套索),您可以强制这些权重中的许多变为零,并且只保留最好的权重。 coef[i,j] 越高,特征 j 在识别类 i 中越重要。因此,它不像选择或未选择功能。权重表示每个特征被选择了多少。
    猜你喜欢
    • 2017-05-25
    • 2016-12-13
    • 1970-01-01
    • 2014-02-18
    • 2019-03-09
    • 1970-01-01
    • 2019-04-07
    • 2011-02-17
    • 2019-11-24
    相关资源
    最近更新 更多