在二元分类中使用Lasso回归查找最佳特征

时间:2015-12-12 10:06:10

标签: 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
...

当我从前一个问题得到一些建议时,我试图找到属性系数高的重要特征,使用Lasso回归使用L1惩罚,因为它使得不重要的特征得分为0。

我正在使用scikit-learn库进行这项工作。

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

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

  2. 如何使用LassoCV找到alpha的最佳值?该文件称LassoCV支持它,但我找不到该功能。

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

  4. 非常感谢。

1 个答案:

答案 0 :(得分:7)

您应该使用分类器而不是回归器,因此SVM或Logistic回归都可以完成这项工作。相反,您可以使用SGDClassifier,您可以将损耗参数设置为Logistic回归的“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:对于弹性网正则化,使用l1_ratio参数稍作一点。