在二进制分类中使用套索回归寻找最佳特征
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 库完成这项工作。
所以,我的问题是这样的。
我可以对偏向二进制class使用套索回归吗?如果不是,那么使用Logistic回归是不是一个很好的解决方案,虽然它不使用L1惩罚?
如何使用 LassoCV 找到最优的 alpha 值?文档上说LassoCV支持,但是我找不到函数
这种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 参数。
我正在处理大数据,我想找到重要的特征。 由于我是生物学家,所以请原谅我的知识不足。
我的数据集有大约 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 库完成这项工作。
所以,我的问题是这样的。
我可以对偏向二进制class使用套索回归吗?如果不是,那么使用Logistic回归是不是一个很好的解决方案,虽然它不使用L1惩罚?
如何使用 LassoCV 找到最优的 alpha 值?文档上说LassoCV支持,但是我找不到函数
这种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 参数。