高维度的数据集可能使模型变得更加复杂,从而增大过拟合的可能性。在处理高维数据集时,最好将特征的数量减少到只包含最有用的那些特征,并删除多余特征。这样会得到泛化能力更好、更简单的模型。删除噪声特征可以提高模型性能。
特征提取有三种基本策略:(1)单变量统计(univariate statistics);(2) 基于模型的选择(model-based selection);(3) 迭代选择(iterative selection)。这些方法都是监督方法,即它们需要目标值来拟合模型。换言之,需要将数据划分为训练集和测试集,并只在训练集上拟合特征选择。
(1) 单变量统计
在单变量统计中,我们计算每个特征和目标值之间的关系是否存在统计显著性,然后选择具有最高置信度的特征。对于分类问题,这也被称为方差分析(analysis of variance,ANOVA)。这些测试的一个关键性质就是它们是单变量的,即它们只单独考虑每个特征。因此,如果一个特征只有在与另一个特征合并时才具有信息量,那么这个特征将被舍弃。单变量测试的计算速度通常很快,并且不需要构建模型;另一方面,它们完全独立于你可能想要在特征选择之后应用的模型。
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectPercentile
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
X = cancer.data
Y = cancer.target
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, shuffle=True, random_state=0)
select = SelectPercentile(percentile=50)
select.fit(X_train, Y_train)
print("提取结果:",select.get_support())
X_train_selected = select.transform(X_train)
print('提取前的维度:', X_train.shape)
print('提取后的维度:', X_train_selected.shape)
(2) 基于模型的特征选择
基于模型的特征选择使用一个监督机器学习模型来判断每个特征的重要性,并且仅保留最重要的特征。用于特征选择的监督模型不需要与用于最终监督建模的模型相同。
特征选择模型需要为每个特征提供某种重要性度量,以便用这个度量对特征进行排序。决策树和基于决策树的模型提供了feature_importance_ 属性,可以直接编码每个特征的重要性。线性模型系数的绝对值也可以用于表示特征重要性。
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectFromModel
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
cancer = load_breast_cancer()
X = cancer.data
Y = cancer.target
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, shuffle=True, random_state=0)
select = SelectFromModel(estimator=RandomForestClassifier(n_estimators=100, random_state=42),
threshold='median'
)
select.fit(X_train, Y_train)
print("提取结果:",select.get_support())
X_train_selected = select.transform(X_train)
print('提取前的维度:', X_train.shape)
print('提取后的维度:', X_train_selected.shape)
(3) 迭代特征选择
在迭代特征选择中,将会构建一系列模型,每个模型都使用不同数量的特征。有两种基本方法:① 开始时没有特征,然后逐个添加特征,直到满足某个终止条件;② 从所有特征开始,然后逐个删除特征,直到满足某个终止条件。
由于构建了一系列模型,所以这些方法的计算成本要比前面讨论的方法更高。
其中一种特殊的方法是递归特征消除法(recursive feature elimination, RFE) ,它从所有特征开始构建模型,并根据模型舍弃最不重要的特征,然后使用除被舍弃的特征之外的所有特征来构建一个新模型,如此继续,直到仅剩下预设数量的特征。为了让这种方法能够运行,用于选择的模型需要提供某种确定特征重要性的方法,如随机森林。
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import RFE
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
cancer = load_breast_cancer()
X = cancer.data
Y = cancer.target
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, shuffle=True, random_state=0)
select = RFE(estimator=RandomForestClassifier(n_estimators=100, random_state=42),
n_features_to_select=15
)
select.fit(X_train, Y_train)
print("提取结果:",select.get_support())
X_train_selected = select.transform(X_train)
print('提取前的维度:', X_train.shape)
print('提取后的维度:', X_train_selected.shape)
|