我正在处理大量数据,希望找出重要的特征。作为一个生物学家,请原谅我的知识不足。
我的数据集有大约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库来进行这项工作。
所以,我的疑问如下:
-
我可以对偏差的二元类别使用Lasso回归吗?如果不能,尽管Logistic回归不使用L1惩罚,但它是一个好的解决方案吗?
-
如何使用LassoCV找到alpha的最优值?文档说LassoCV支持这个功能,但我找不到这个函数。
-
对于这种分类问题,还有其他好的方法吗?
非常感谢。
回答:
你应该使用分类器而不是回归器,因此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参数。