打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
特征选择(6)

上一篇讲解了使用基于递归消除法,从大范围来讲是通过 wrapper 的方法,中文就是包装的方法,递归消除是这其中主要的方法,还有其他类似 GA 等启发式搜索方法。从根本上来说基于 wrapper 是一种搜索方式,将当前的特征组合作为待搜索的大集合,然后在其中找出最优的特征组合然后返回结果。

区别于 wrapper 方法,embedded 方法是在选定模型的情况下,选取出对模型训练有利的特征,常见的有 L1,L2,基于 L2 的回归又叫岭回归

为什么说 l1 和 l2 可以用来进行特征选择?

去网上一搜给出的结果都是 l1 可以得到稀疏解之类的说法,的确是这种情况,现在只是用白话的方式描述一下。

最早接触 l1 和 l2 是在优化问题中的惩罚项,常见的比如线性回归如果加入 l1 惩罚项可以得到稀疏解,这些稀疏解就是我们求解的线性模型的各个特征的权重系数,所谓稀疏也就是说其中有些权重系数的值是为 0,此时可以看到这些权重系数的为 0 的特征对最终的结果无贡献,那样的话就可以把这些特征去除掉,到这一步是不是就可以知道为什么 l1 可以用来进行特征选择。

虽然 l1 做到了稀疏解,但是他选出的结果并不一定是最优,他只是把具有相同贡献的特征选取其中一个作为输出的结果,没有被选中的不代表不重要,因此可以使用 l2 来弥补这其中的不足,具体操作为:若一个特征在 L1 中的权值为 1,选择在 L2 中权值差别不大且在 L1 中权值为 0 的特征构成同类集合,将这一集合中的特征平分 L1 中的权值。

sklearn 相关介绍

Linear models penalized with the L1 norm have sparse solutions: many of their estimated coefficients are zero. When the goal is to reduce the dimensionality of the data to use with another classifier, they can be used along with feature_selection.SelectFromModel to select the non-zero coefficients. In particular, sparse estimators useful for this purpose are the linear_model.Lasso for regression, and of linear_model.LogisticRegression and svm.LinearSVC for classification:

上述红字的部分:使用 l1 正则项主要是 lasso 和 lr、svc。

svc 剖析

  1. from sklearn.feature_selection import SelectFromModel
  2. from sklearn.svm import LinearSVC
  3. mod=LinearSVC(C=0.01, penalty="l1", dual=False).fit(irisdata.data,irisdata.target)
  4. selectmod=SelectFromModel(mod, prefit=True)
  5. selectmod.transform(irisdata.data)

输出

  1. array([[ 5.1, 3.5, 1.4],
  2. [ 4.9, 3. , 1.4],
  3. [ 4.7, 3.2, 1.3],
  4. [ 4.6, 3.1, 1.5],
  5. [ 5. , 3.6, 1.4],
  6. [ 5.4, 3.9, 1.7],
  7. [ 4.6, 3.4, 1.4],
  8. [ 5. , 3.4, 1.5],
  9. [ 4.4, 2.9, 1.4],

lasso 剖析

  1. from sklearn.linear_model import LassoCV
  2. lassomodel=LassoCV()
  3. selectmod1=SelectFromModel(lassomodel,threshold=0.1)
  4. selectmod1.fit(irisdata.data,irisdata.target)
  5. selectmod1.transform(irisdata.data)

输出

  1. array([[ 1.4, 0.2],
  2. [ 1.4, 0.2],
  3. [ 1.3, 0.2],
  4. [ 1.5, 0.2],
  5. [ 1.4, 0.2],
  6. [ 1.7, 0.4],
  7. [ 1.4, 0.3],
  8. [ 1.5, 0.2],

lr 剖析

  1. from sklearn.linear_model import LogisticRegressionCV
  2. lrmodel=LogisticRegressionCV(penalty='l1',solver='liblinear')
  3. selectmod2=SelectFromModel(lrmodel,threshold=10)
  4. selectmod2.fit(irisdata.data,irisdata.target)
  5. selectmod2.transform(irisdata.data)

输出

  1. array([[ 1.4, 0.2],
  2. [ 1.4, 0.2],
  3. [ 1.3, 0.2],
  4. [ 1.5, 0.2],
  5. [ 1.4, 0.2],
  6. [ 1.7, 0.4],
  7. [ 1.4, 0.3],
  8. [ 1.5, 0.2],
  9. [ 1.4, 0.2],
  10. [ 1.5, 0.1],
  11. [ 1.5, 0.2],

使用 l1 和 l2 综合选取特征

  1. # -*- coding: utf-8 -*-
  2. from sklearn.linear_model import LogisticRegression
  3. from sklearn.datasets import load_iris
  4. from sklearn.feature_selection import SelectFromModel
  5.  
  6. class LR(LogisticRegression):
  7. def __init__(self, threshold=0.01, dual=False, tol=1e-4, C=1.0,
  8. fit_intercept=True, intercept_scaling=1, class_weight=None,
  9. random_state=None, solver='liblinear', max_iter=100,
  10. multi_class='ovr', verbose=0, warm_start=False, n_jobs=1):
  11.  
  12. #权值相近的阈值
  13. self.threshold = threshold
  14. LogisticRegression.__init__(self, penalty='l1', dual=dual, tol=tol, C=C,
  15. fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight=class_weight,
  16. random_state=random_state, solver=solver, max_iter=max_iter,
  17. multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs)
  18. #使用同样的参数创建 L2 逻辑回归
  19. self.l2 = LogisticRegression(penalty='l2', dual=dual, tol=tol, C=C, fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight = class_weight, random_state=random_state, solver=solver, max_iter=max_iter, multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs)
  20.  
  21. def fit(self, X, y, sample_weight=None):
  22. #训练 L1 逻辑回归
  23. super(LR, self).fit(X, y, sample_weight=sample_weight)
  24. self.coef_old_ = self.coef_.copy()
  25. #训练 L2 逻辑回归
  26. self.l2.fit(X, y, sample_weight=sample_weight)
  27.  
  28. cntOfRow, cntOfCol = self.coef_.shape
  29. #权值系数矩阵的行数对应目标值的种类数目
  30. for i in range(cntOfRow):
  31. for j in range(cntOfCol):
  32. coef = self.coef_[i][j]
  33. #L1 逻辑回归的权值系数不为 0
  34. if coef != 0:
  35. idx = [j]
  36. #对应在 L2 逻辑回归中的权值系数
  37. coef1 = self.l2.coef_[i][j]
  38. for k in range(cntOfCol):
  39. coef2 = self.l2.coef_[i][k]
  40. #在 L2 逻辑回归中,权值系数之差小于设定的阈值,且在 L1 中对应的权值为 0
  41. if abs(coef1-coef2) < self.threshold and j != k and self.coef_[i][k] == 0:
  42. idx.append(k)
  43. #计算这一类特征的权值系数均值
  44. mean = coef / len(idx)
  45. self.coef_[i][idx] = mean
  46. return self
  47.  
  48.  
  49.  
  50. def main():
  51. iris=load_iris()
  52. print SelectFromModel(LR(threshold=0.5,C=0.1),threshold=1).fit_transform(iris.data,iris.target)
  53.  
  54. if __name__ == '__main__':
  55. main()
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
sklearn:sklearn.feature_selection的SelectFromModel函数的简介、使用方法之详细攻略
经典机器学习算法-第六章支持向量机
手把手带你入门和实践特征工程的万字笔记
谁动了我的特征?
KNN算法(K近邻算法)实现与剖析
史上最详细的XGBoost实战(下)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服