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

Finding optimal feature using Lasso regression in binary classification

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

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

  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. 我可以对偏向二进制class使用套索回归吗?如果不是,那么使用Logistic回归是不是一个很好的解决方案,虽然它不使用L1惩罚?

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

  3. 这种class化还有其他好的方法吗?

非常感谢。

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

#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_parameters 中提供的 alpha 值范围,然后找到最佳值。您可以将性能标准从 'f1_macro' 更改为 'f1_weighted' 或其他指标。

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

要查找对 class 标签有贡献的前 10 个特征,您可以找到以下索引:

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

注意 1:将数据集的某些部分放在一边作为 validation/test 设置总是好的,并且在找到最佳模型后对保留的数据进行评估。

注2:通过将一行或一列划分为行或列的'l2'或'l1',通常可以玩一点不同类型的特征归一化和样本归一化使用 normalizer

查看它对性能的影响

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