单变量特征选择是通过选择那些基于单变量统计检验(univariate statistical tests)得出的最优特征来实现的。它可以看作是估计器的一个预处理步骤。Scikit-learn将一系列特征选择程序作为不同的类提供给我们,这些类都实现了 transform
方法:
例如,我们可以对样本执行一个χ2测试来挑选出两个最好的特征(chi2方式)
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import chi2
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)
这些对象把输入当做计分函数,返回单变量分数(univariate scores)和p值(或对于SelectKBest
和 SelectPercentile
来说,仅仅返回分数):
基于F-检验的方法可以估计两个随机变量之间的线性依赖度(linear dependency)。另一方面,基于互信息(mutual information)的方法可以捕捉任何类型的统计依赖性(statistical dependency),但由于互信息方法是无参数的,他们需要更多的样本才能进行准确的估计。
#特征相关性权重柱状图输出
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest,f_classif
from sklearn.feature_selection import chi2
import numpy as np
iris=load_iris()
x,y=iris.data,iris.target
print(x.shape)
x_new=SelectKBest(f_classif,k=2).fit_transform(x,y)
print(x_new.shape)
#方法1-采用卡方检验的方式进行特征的提取(统计依赖度)
import numpy as np
from sklearn.feature_selection import SelectKBest,chi2
import matplotlib.pyplot as plt
selector=SelectKBest(chi2,k=2)
selector.fit(x,y)
s=-1*np.log10(selector.pvalues_)
plt.bar(range(len(iris.feature_names)),s)
plt.xticks(range(len(iris.feature_names)),iris.feature_names)
plt.show()
#方法2-采用F检验方法的方式进行特征的提取(线性依赖度)
import numpy as np
from sklearn.feature_selection import SelectKBest,f_classif
import matplotlib.pyplot as plt
selector=SelectKBest(f_classif,k=2)
selector.fit(x,y)
s=-1*np.log10(selector.pvalues_)
plt.bar(range(len(iris.feature_names)),s)
plt.xticks(range(len(iris.feature_names)),iris.feature_names)
plt.show()
#方法3—使用集成学习算法的特征重要性输出进行类比
from sklearn import ensemble
params={"n_estimators":100,"max_depth":4,"min_samples_split":2,"learning_rate":0.01,"loss":"ls"}
clf=ensemble.GradientBoostingRegressor(**params)
clf.fit(x,y)
feature_importance=clf.feature_importances_
feature_importance=100.0*(feature_importance/feature_importance.max())
plt.bar(range(len(iris.feature_names)),feature_importance)
plt.xticks(range(len(iris.feature_names)),iris.feature_names)
plt.show()
原文:https://www.cnblogs.com/Yanjy-OnlyOne/p/12975199.html