当前位置:   article > 正文

机器学习中特征选择的几种方法原理和代码实现(python)_selectkbest原理

selectkbest原理

 

一.特征选择-单变量特征选择

1.SelectKBest可以依据相关性对特征进行选择,保留k个评分最高的特征。

方差分析

分类问题使用f_classif,回归问题使用f_regression。

f_classif:分类任务

跟目标的分类,将样本划分成n个子集,S1,S2,..,Sn,我们希望每个子集的均值μ1,μ2,...,μn不相等。

我们假设H0:μ1=μ2=...=μn,当然我们希望拒绝H0,所以我们希望构造出来f最大越好。所以我们可以通过第i个特征xi对分类进行预测。f值越大,预测值越好。

f_regression:回归任务

引用参考:https://blog.csdn.net/jetFlow/article/details/78884619

要计算f_regression中的ff值,我们首先要计算的是,这个就是i号特征和因变量y之间的样本相关系数。

我们计算的 ,才是f_regression中的ff值,服从F(1,n−2)F(1,n−2)分布。

ff值越大,i号特征和因变量y之间的相关性就越大,据此我们做特征选择。
 

  1. from sklearn.feature_selection import SelectKBest
  2. from sklearn.feature_selection import f_classif
  3. from sklearn.datasets import load_iris
  4. # 特征选择
  5. data = load_iris()
  6. slectKBest = SelectKBest(f_classif,k=2)
  7. dataK = slectKBest.fit_transform(data.data,data.target)

2.基于学习模型的特征排序

针对每个单独的特征和响应变量建立预测模型。其实Pearson相关系数等价于线性回归里的标准化回归系数。假如某个特征和响应变量之间的关系是非线性的,可以用基于树的方法(决策树、随机森林)、或者扩展的线性模型等。基于树的方法比较易于使用,因为他们对非线性关系的建模比较好,并且不需要太多的调试。但要注意过拟合问题,因此树的深度最好不要太大,再就是运用交叉验证
在波士顿房价数据集使用sklearn的随机森林回归给出一个单变量选择的例子:

  1. from sklearn.cross_validation import cross_val_score, ShuffleSplit
  2. from sklearn.datasets import load_boston
  3. from sklearn.ensemble import RandomForestRegressor
  4. #Load boston housing dataset as an example
  5. boston = load_boston()
  6. X = boston["data"]
  7. Y = boston["target"]
  8. names = boston["feature_names"]
  9. rf = RandomForestRegressor(n_estimators=20, max_depth=4)
  10. scores = []
  11. for i in range(X.shape[1]):
  12. score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
  13. cv=ShuffleSplit(len(X), 3, .3))
  14. scores.append((round(np.mean(score), 3), names[i]))
  15. print sorted(scores, reverse=True)

结果:

[(0.636, ‘LSTAT’), (0.59, ‘RM’), (0.472, ‘NOX’), (0.369, ‘INDUS’), (0.311, ‘PTRATIO’), (0.24, ‘TAX’), (0.24, ‘CRIM’), (0.185, ‘RAD’), (0.16, ‘ZN’), (0.087, ‘B’), (0.062, ‘DIS’), (0.036, ‘CHAS’), (0.027, ‘AGE’)]

二.递归特征消除(RFE)

递归特征消除(Recursive feature elimination)

递归特征消除的主要思想是反复构建模型,然后选出最好的(或者最差的)特征(根据系数来选),把选出来的特征放到一边,然后在剩余的特征上重复这个过程,直到遍历了所有的特征。在这个过程中被消除的次序就是特征的排序。

RFE的稳定性很大程度上取决于迭代时,底层用的哪种模型。比如RFE采用的是普通的回归(LR),没有经过正则化的回归是不稳定的,那么RFE就是不稳定的。假如采用的是Lasso/Ridge,正则化的回归是稳定的,那么RFE就是稳定的。

下面的示例使用RFE和logistic回归算法来选出前三个特征。算法的选择并不重要,只需要熟练并且一致:

  1. Import the required packages
  2. Import pandas to read csv
  3. Import numpy for array related operations
  4. Import sklearn's feature selection algorithm from sklearn.feature_selection import RFE
  5. Import LogisticRegression for performing chi square test from sklearn.linear_model import LogisticRegression
  6. #URL for loading the dataset
  7. url ="https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-dia betes/pima-indians-diabetes.data"
  8. #Define the attribute names
  9. names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
  10. #Create pandas data frame by loading the data from URL
  11. dataframe = pandas.read_csv(url, names=names)
  12. #Create array from data values
  13. array = dataframe.values
  14. #Split the data into input and target
  15. X = array[:,:8]
  16. Y = array[:,8]
  17. #Feature extraction
  18. model = LogisticRegression()
  19. rfe = RFE(model, 3)
  20. fit = rfe.fit(X, Y)
  21. print("Num Features: %d"% fit.n_features_) 
  22. print("Selected Features: %s"% fit.support_)
  23. print("Feature Ranking: %s"% fit.ranking_)

3.主成分分析

原理参考:https://blog.csdn.net/program_developer/article/details/80632779

PCA python 代码实现:

  1. #Python实现PCA
  2. import numpy as np
  3. def pca(X,k):#k is the components you want
  4. #mean of each feature
  5. n_samples, n_features = X.shape
  6. mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
  7. #normalization
  8. norm_X=X-mean
  9. #scatter matrix
  10. scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
  11. #Calculate the eigenvectors and eigenvalues
  12. eig_val, eig_vec = np.linalg.eig(scatter_matrix)
  13. eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
  14. # sort eig_vec based on eig_val from highest to lowest
  15. eig_pairs.sort(reverse=True)
  16. # select the top k eig_vec
  17. feature=np.array([ele[1] for ele in eig_pairs[:k]])
  18. #get new data
  19. data=np.dot(norm_X,np.transpose(feature))
  20. return data
  21. X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
  22. print(pca(X,1))

上面代码实现了对数据X进行特征的降维。结果如下:

[[-0.50917706],[-2.40151069],[]-3.7751606],[1.20075534],[2.05572155],[3.42937146]]

2)用sklearn的PCA

  1. ##用sklearn的PCA
  2. from sklearn.decomposition import PCA
  3. import numpy as np
  4. X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
  5. pca=PCA(n_components=1)pca.fit(X)
  6. print(pca.transform(X)

相关博客:

Reference:

(1) 主成分分析(PCA)原理详解

http://blog.csdn.net/zhongkelee/article/details/44064401

(2) 机器学习之PCA主成分分析 - steed灬 - 博客园

https://www.cnblogs.com/steed/p/7454329.html

(3) 简单易学的机器学习算法——主成分分析(PCA)

https://blog.csdn.net/google19890102/article/details/27969459

(4) 机器学习实战之PCA - 笨鸟多学 - 博客园

https://www.cnblogs.com/zy230530/p/7074215.html

(5) 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用 - LeftNotEasy - 博客园

http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html

(6) 从PCA和SVD的关系拾遗

https://blog.csdn.net/Dark_Scope/article/details/53150883

(7) CodingLabs - PCA的数学原理

http://blog.codinglabs.org/articles/pca-tutorial.html

(8) PCA(主成分分析)python实现

https://www.jianshu.com/p/4528aaa6dc48

(9) 主成分分析PCA(Principal Component Analysis)在sklearn中的应用及部分源码分析

https://www.cnblogs.com/lochan/p/7001907.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/140917?site
推荐阅读
相关标签
  

闽ICP备14008679号