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

 

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

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

你可能感兴趣的:(机器学习,python)