1 利用地方差的方法减少特征数也及(PCA)
去除那些方差不满足基本设定的门限值得特征,特别是方差值为零的,因为方差值为零,那么数据集在该方向上比较密集,这数据无法通过学习来分类,因此该维度上的向量对特征的分类没有太多用处,因此可以去除该维度的特征,以减少计算复杂度。
例如,假设我们有一个具有布尔功能的数据集,我们想要删除在超过80%的样本中要么是一个或零(on或off)的所有特性。布尔特征是伯努利随机变量,并给出了这些变量的方差
我们可以选择门限是0.8*(1-0.8)
>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
>>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
>>> sel.fit_transform(X)
array([[0, 1],
[1, 0],
[0, 0],
[1, 1],
[1, 0],
[1, 1]])
SelectKBest和
SelectPercentile
- For regression: f_regression, mutual_info_regression
- For classification: chi2, f_classif, mutual_info_classif
基于f检验的方法估计了两个随机变量之间的线性依赖程度。另一方面,互信息方法可以捕获任何类型的统计依赖项,但作为非参数,
它们需要更多的样本来进行准确的估计。
注意不要使用带有分类问题的回归评分功能,您将会得到无用的结果。
单特征选择
print(__doc__)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets, svm
from sklearn.feature_selection import SelectPercentile, f_classif
# #############################################################################
# Import some data to play with
# The iris dataset
iris = datasets.load_iris()
# Some noisy data not correlated
E = np.random.uniform(0, 0.1, size=(len(iris.data), 20))
# Add the noisy data to the informative features
X = np.hstack((iris.data, E))
y = iris.target
plt.figure(1)
plt.clf()
X_indices = np.arange(X.shape[-1])
# #############################################################################
# Univariate feature selection with F-test for feature scoring
# We use the default selection function: the 10% most significant features
selector = SelectPercentile(f_classif, percentile=10)
selector.fit(X, y)
scores = -np.log10(selector.pvalues_)
scores /= scores.max()
plt.bar(X_indices - .45, scores, width=.2,
label=r'Univariate score ($-Log(p_{value})$)', color='darkorange',
edgecolor='black')
# #############################################################################
# Compare to the weights of an SVM
clf = svm.SVC(kernel='linear')
clf.fit(X, y)
svm_weights = (clf.coef_ ** 2).sum(axis=0)
svm_weights /= svm_weights.max()
plt.bar(X_indices - .25, svm_weights, width=.2, label='SVM weight',
color='navy', edgecolor='black')
clf_selected = svm.SVC(kernel='linear')
clf_selected.fit(selector.transform(X), y)
svm_weights_selected = (clf_selected.coef_ ** 2).sum(axis=0)
svm_weights_selected /= svm_weights_selected.max()
plt.bar(X_indices[selector.get_support()] - .05, svm_weights_selected,
width=.2, label='SVM weights after selection', color='c',
edgecolor='black')
plt.title("Comparing feature selection")
plt.xlabel('Feature number')
plt.yticks(())
plt.axis('tight')
plt.legend(loc='upper right')
plt.show()
3 基于L1的特征选择
用L1规范对线性模型进行了处理,得到了稀疏解:他们的许多估计系数都为零。当目标是降低数据的维度时使用另一个分类器,可以单独使用feature_selection.SelectFromModel,来选择非零系数。
在稀疏估计方面, linear_model.Lasso对于回归问题特别有效,
linear_model.LogisticRegression
和svm.LinearSVC对于分类的稀疏特别有用
>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
>>> model = SelectFromModel(lsvc, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 3)
在SVM和逻辑回归方面,参数C控制系数率,C越小,选择的特征就越少。对于Lasso来说,alpha参数越高,选择的特征就越少。
4基于树的特征选择
给于书的估计器可以被用来计算特征的重要性,与sklearn.feature_selection可以用于减去不相关的特征。
from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier()
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_
array([ 0.04..., 0.05..., 0.4..., 0.4...])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 2)
特征的提取经常被作为管道的一部分,特征提取经常被用在机器学习的数据预处理阶段,因此建议使用 sklearn.pipeline.Pipeline:
clf = Pipeline([
('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
('classification', RandomForestClassifier())
])
clf.fit(X, y)
在这段代码中,我们使用了sklearn . svm。LinearSVC加上sklearn.feature_selection。SelectFromModel以评估特性的重要性,并选择最相关的特性。这时,一个sklearn.ensemble。随机森林分类器被训练在转换的输出上,即只使用相关的特征。您可以使用其他特性选择方法和分类器来执行类似的操作,这些方法提供了一种评估特性输入的方法