赞
踩
一.特征选择-单变量特征选择
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之间的相关性就越大,据此我们做特征选择。
- from sklearn.feature_selection import SelectKBest
- from sklearn.feature_selection import f_classif
- from sklearn.datasets import load_iris
- # 特征选择
- data = load_iris()
- slectKBest = SelectKBest(f_classif,k=2)
- dataK = slectKBest.fit_transform(data.data,data.target)
2.基于学习模型的特征排序
针对每个单独的特征和响应变量建立预测模型。其实Pearson相关系数等价于线性回归里的标准化回归系数。假如某个特征和响应变量之间的关系是非线性的,可以用基于树的方法(决策树、随机森林)、或者扩展的线性模型等。基于树的方法比较易于使用,因为他们对非线性关系的建模比较好,并且不需要太多的调试。但要注意过拟合问题,因此树的深度最好不要太大,再就是运用交叉验证
在波士顿房价数据集使用sklearn的随机森林回归给出一个单变量选择的例子:
- from sklearn.cross_validation import cross_val_score, ShuffleSplit
- from sklearn.datasets import load_boston
- from sklearn.ensemble import RandomForestRegressor
-
- #Load boston housing dataset as an example
- boston = load_boston()
- X = boston["data"]
- Y = boston["target"]
- names = boston["feature_names"]
-
- rf = RandomForestRegressor(n_estimators=20, max_depth=4)
- scores = []
- for i in range(X.shape[1]):
- score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
- cv=ShuffleSplit(len(X), 3, .3))
- scores.append((round(np.mean(score), 3), names[i]))
- 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回归算法来选出前三个特征。算法的选择并不重要,只需要熟练并且一致:
- Import the required packages
-
- Import pandas to read csv
- Import numpy for array related operations
-
- Import sklearn's feature selection algorithm from sklearn.feature_selection import RFE
-
- Import LogisticRegression for performing chi square test from sklearn.linear_model import LogisticRegression
-
- #URL for loading the dataset
- url ="https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-dia betes/pima-indians-diabetes.data"
- #Define the attribute names
-
- names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
-
- #Create pandas data frame by loading the data from URL
-
- dataframe = pandas.read_csv(url, names=names)
-
- #Create array from data values
- array = dataframe.values
- #Split the data into input and target
-
- X = array[:,:8]
-
- Y = array[:,8]
-
- #Feature extraction
-
- model = LogisticRegression()
- rfe = RFE(model, 3)
-
- fit = rfe.fit(X, Y)
-
- print("Num Features: %d"% fit.n_features_)
- print("Selected Features: %s"% fit.support_)
-
- print("Feature Ranking: %s"% fit.ranking_)
3.主成分分析
原理参考:https://blog.csdn.net/program_developer/article/details/80632779
PCA python 代码实现:
- #Python实现PCA
- import numpy as np
- def pca(X,k):#k is the components you want
- #mean of each feature
- n_samples, n_features = X.shape
- mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
- #normalization
- norm_X=X-mean
- #scatter matrix
- scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
- #Calculate the eigenvectors and eigenvalues
- eig_val, eig_vec = np.linalg.eig(scatter_matrix)
- eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
- # sort eig_vec based on eig_val from highest to lowest
- eig_pairs.sort(reverse=True)
- # select the top k eig_vec
- feature=np.array([ele[1] for ele in eig_pairs[:k]])
- #get new data
- data=np.dot(norm_X,np.transpose(feature))
- return data
-
- X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
- print(pca(X,1))
上面代码实现了对数据X进行特征的降维。结果如下:
[[-0.50917706],[-2.40151069],[]-3.7751606],[1.20075534],[2.05572155],[3.42937146]]
2)用sklearn的PCA
- ##用sklearn的PCA
- from sklearn.decomposition import PCA
- import numpy as np
- X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
- pca=PCA(n_components=1)pca.fit(X)
- 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。