在二元分类中使用Lasso回归寻找最优特征

我正在处理大量数据,希望找出重要的特征。作为一个生物学家,请原谅我的知识不足。

我的数据集有大约5000个属性和500个样本,样本分为二元类别0和1。此外,数据集存在偏差——大约有400个0和100个1的样本。我想找到一些对确定类别影响最大的特征。

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

根据之前问题的建议,我尝试使用Lasso回归和L1惩罚来寻找系数较高的属性作为重要特征,因为它可以将不重要特征的得分设为0。

我使用的是scikit-learn库来进行这项工作。

所以,我的疑问如下:

  1. 我可以对偏差的二元类别使用Lasso回归吗?如果不能,尽管Logistic回归不使用L1惩罚,但它是一个好的解决方案吗?

  2. 如何使用LassoCV找到alpha的最优值?文档说LassoCV支持这个功能,但我找不到这个函数。

  3. 对于这种分类问题,还有其他好的方法吗?

非常感谢。


回答:

你应该使用分类器而不是回归器,因此SVM或Logistic回归都可以胜任。你也可以使用SGDClassifier,其中可以将损失参数设置为’log’以使用Logistic回归,或设置为’hinge’以使用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')#现在clf是给定搜索空间中找到的最佳分类器clf.fit(X_train, Y_train)#你可以在这里找到最佳的alpha值print(clf.best_params_)    

这将在你提供的tuned_parameters中的alpha值范围内进行搜索,然后找到最佳值。你可以将性能标准从’f1_macro’更改为’f1_weighted’或其他指标。

为了解决数据集在标签上的偏斜问题,可以使用SGDCassifier的class_weight参数,并将其设置为”balanced”。

要找出对类别标签贡献最大的前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参数。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注