python - 在二进制分类中使用套索回归寻找最佳特征

标签 python machine-learning scikit-learn classification regression

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

我的数据集有大约 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 惩罚的套索回归来找到重要特征的属性系数,因为它会使不重要特征的得分为 0。

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

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

  1. 我可以对有偏见的二进制类使用套索回归吗?如果不是,那么使用 Logistic 回归是否是一个很好的解决方案,尽管它不使用 L1 惩罚?

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

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

非常感谢。

最佳答案

您应该使用分类器而不是回归器,这样 SVM 或 Logistic 回归都可以完成这项工作。相反,您可以使用 SGDClassifier,您可以在其中将损失参数设置为逻辑回归的“log”或 SVM 的“hinge”。 在 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_)    

这会搜索您在 tuned_pa​​rameters 中提供的 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 参数。

关于python - 在二进制分类中使用套索回归寻找最佳特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34238590/

相关文章:

python - 如何定位字幕?

Python:相对于当前运行脚本添加到 sys.path 的最佳方式

machine-learning - 特征分布接近正态 : what does that imply for my ML model?

python - 在 scikit-learn 中获得二元概率分类器的最大准确度

python - 使用 Scikit-Learn 计算平均 AUC 的差异

scikit-learn - sklearn 如何一步步计算准确度分数?

python - 如何在GimpFU中传递图像路径

python - 计算两天之间每个月的天数

python - 学习曲线

python - 从数组数组中删除 Nan