(1)特征选择
特征选择是只选择一部分特征,常见的方法有:移除低方差法,单变量统计法、基于模型的选择、递归特征消除等方法。
移除低方差特征 VarianceThreshold
#移除低方差特征,方差小代表这组数据相差不大,可以去掉
from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_iris
iris=load_iris()
X=iris.data
X_name=iris.feature_names
y=iris.target
#移除方差小于0.55的特征
sel=VarianceThreshold(threshold=0.55)
x_new=sel.fit_transform(X)
print("原数据:")
print(X.shape)
print("去除后")
print(x_new.shape)
VarianceThreshold只需传入一个阈值,经过fit_transform后会过滤掉方差小于该阈值的数据。
单变量数据选择:是基于统计检验选择最佳特征,从原始数据中选择K个最好的
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression
x=load_iris().data
y=load_iris().target
#选择k个最好的特征,返回选择特征后的数据
sel=SelectKBest(f_regression,k=2)
#f_regression是其中一种评估方式,计算每个特征和目标之间的f值和p值
#还有 chi2:卡方、mutual_info_classif:互信息(分类)、
#mutual_info_regression互信息(回归)
x_new=sel.fit_transform(x,y)#这里x y都要传入,和其他不同
print("评分:",sel.scores_)
print(x)
print(x_new)
SelectKBest函数需要传入两个参数,第一个是评价方式有多种:f_regression是其中一种评估方式,计算每个特征和目标之间的f值和p值还有 chi2:卡方、mutual_info_classif:互信息(分类)、
mutual_info_regression互信息(回归)。第二个是保留特征数,传入几就保留几个评分最高的特征。
基于模型的特征选择
基于模型的特征选择,是根据不同模型进行选择特征,这里以线性模型为例
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import Lasso
x=load_iris().data
y=load_iris().target
#使用L1正则化的线性模型
lasso = Lasso(alpha=0.01)
lasso.fit(x,y)
#特征选择
sel=SelectFromModel(lasso,threshold=0.1)
x_new=sel.fit_transform(x,y)
print(x)
print(x_new)
lasso是正则化后的特征值,threshold是阈值,只会保留重要性大于0.1的数据,其他重要性小于0.1的会被忽略。
(2)特征提取,这里介绍一下主成分分析(PCA)和线性判别分析(LDA)。
PCA的原理是通过线性变换把原始特征转化为一组线性不相关的变量,是为了找让点分的最开的方向,并按照方差大小排序,是一种无监督方式,最求的是最大化方差和。
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from matplotlib import pyplot as plt
from sympy.solvers.diophantine.diophantine import Linear
iris=load_iris()
x=iris.data
y=iris.target
#先给数据做个标准化,数据会更好
Stand_S=StandardScaler()
x_stand=Stand_S.fit_transform(x)
pca=PCA(n_components=2)
#n_components=2表示降维后的维度
# #还有一个svd_solver参数 指定求解器 一般默认,对于大型数据,使用'randomized'更高效
x_pca=pca.fit_transform(x_stand)
print(x_pca)
PCA函数中只需要传入一个参数,n_components=n即可,是表示原始数据降维后要保留的维数,上面代码是降维到2维。
LDA的原理是追求最大化类间距离,最小化类内距离,其是一种有监督方法,需要用到y值
#线性判别分析(LDA):最小化类内距离,最大化类间距离
#LDA是一种有监督的降维技术,需要用到标签信息
lda=LinearDiscriminantAnalysis(n_components=2)
#n_components=2表示降维后的维度
x_lda=lda.fit_transform(x_stand,y)
plt.scatter(x_lda[y==0,0],x_lda[y==0,1],color='r',marker='o',label='0')
plt.scatter(x_lda[y==1,0],x_lda[y==1,1],color='b',marker='x',label='1')
plt.show()
print(x_lda)
注意如果先把数据标准化之后再传入会好很多。再PCA和LDA之前都把数据标准化了,避免由于数据量纲不一样影响而影响数据特征的提取。