在二元分类中使用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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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