我正在处理大数据,我想找到重要的特征。 由于我是生物学家,所以请原谅我的知识不足。
我的数据集有大约 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 库完成这项工作。
所以,我的问题是这样的。
我可以对有偏见的二进制类使用套索回归吗?如果不是,那么使用 Logistic 回归是否是一个很好的解决方案,尽管它不使用 L1 惩罚?
如何使用 LassoCV 找到最优的 alpha 值?文档上说LassoCV支持,但是我找不到这个函数。
这种分类还有其他好的方法吗?
非常感谢。
最佳答案
您应该使用分类器而不是回归器,这样 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_parameters 中提供的 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/