目录
一、特征选择概念
二、特征选择的方法
2.1 过滤式特征选择
2.1.1 方差分析
2.1.2 相关系数
2.1.3 卡方检验
2.2 包裹式特征选择
2.2.1 递归特征消除
2.3 嵌入式特征选择
2.3.1 决策树特征重要性
一、特征选择概念
特征选择是机器学习非常重要的一个步骤,它指的是从原始数据中选择最相关的特征,以用于训练模型和预测。通过特征选择,可以提高模型的性能、减少过拟合、降低计算复杂度。
下面是使用随机森林进行特征选择的示例代码:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification# 创建一个样本数据集
X, y = make_classification(n_samples = 1000, n_features = 20, n_informative = 10, random_state = 0)# 使用随机森林进行特征选择
clf = RandomForestClassifier()
clf.fit(X, y)# 输出特征重要性
feature_importances = clf.feature_importances_
print("Feature importances:\n", feature_importances)# 选择重要性大于阈值的特征
selected_features = [i for i, importance in enumerate(feature_importances) if importance > 0.05]
print("Selected features:\n", selected_features)
二、特征选择的方法
特征选择的方法主要分为三类:过滤式特征选择、包裹式特征选择和嵌入式特征选择。
2.1 过滤式特征选择
过滤式特征选择是在特征选择和模型训练之前独立进行的,它基于特征之间的统计指标或特征和目标变量之间的相关性来评估特征的重要性。常用的过滤方法包括方差分析、相关系数、卡方检验等。这种方法的优势在于计算简单快速,适用于大规模数据集,但可能忽略了特征之间的相互关系。
2.1.1 方差分析
方差分析用于比较两个或多个组之间的平均值是否有显著差异。在特征选择中,可以利用方差分析来评估不同特征对目标变量的影响程度。
from scipy import stats# 示例数据
group1 = [10, 20, 30, 40, 50]
group2 = [15, 25, 35, 45, 55]
group3 = [5, 15, 25, 35, 45]# 进行方差分析
f_statistic, p_value = stats.f_oneway(group1, group2, group3)if p_value < 0.05:print("均值之间存在显著差异")
else:print("均值之间不存在显著差异")
2.1.2 相关系数
相关系数用于衡量两个变量之间的线性相关性。在特征选择中,可以通过计算特征与目标变量之间的相关系数来筛选与目标变量相关性高的特征。
import pandas as pd# 示例数据
data = {'feature1': [1, 2, 3, 4, 5],'feature2': [2, 4, 6, 8, 10],'target': [5, 10, 15, 20, 25]}df = pd.DataFrame(data)# 计算特征与目标变量之间的相关系数
correlation = df.corr()['target']
print(correlation)
2.1.3 卡方检验
卡方检验适用于分类变量之间的关联性检验,用于判断两个分类变量之间是否存在显著关联。
在scikit-learn中提供了SelectKBest类, 是对卡方验证的实现,通过SelectKBest 使用一系列的统计方法来选定数据特征。
卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。
下面是通过卡方检验的方式来选择四个对结果影响最大的数据特征:(印地安人糖尿病数据集)
from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2filename = 'Sklearn\pima_data.csv' # 导入数据
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names = names)array = data.values
X = array[:, 0:8] # 将数据分为输入数据和输出结果
Y = array[:, 8]test = SelectKBest(score_func = chi2, k = 4) # 特征选定
fit = test.fit(X, Y)
set_printoptions(precision = 3)
print(fit.scores_)
features = fit.transform(X)
print(features)
2.2 包裹式特征选择
包裹式特征选择是在模型训练的过程中进行的,它直接利用模型的性能来评估特征的重要性。常见的包裹式方法包括递归特征消除(RFE)、基于模型的特征选择等。这种方法的优势在于考虑了特征之间的相互影响,但计算开销较大,不适用于大规模数据集。
2.2.1 递归特征消除
递归特征消除(RFE),使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。通过每一次基模型的精度,来找到对最终的预测结果影响最大的数据特征。在scikit-learn文档中有更多的关于递归特征消除(RFE)的描述。
下面是通过递归特征消除来选定对预测结果影响最大的三个数据特征:(印地安人糖尿病数据集)
from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegressionfilename = 'Sklearn\pima_data.csv' # 注意数据集的路径
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names = names)array = data.values
X = array[:, 0:8]
Y = array[:, 8]model = LogisticRegression() # 特征选定
rfe = RFE(model, n_features_to_select = 3)
fit = rfe.fit(X, Y)print("特征个数:\n",fit.n_features_)
print("被选定的特征:\n",fit.support_)
print("特征排名:",fit.ranking_)
2.3 嵌入式特征选择
嵌入式特征选择是将特征选择嵌入到模型训练的过程中,常用的方法包括Lasso回归、决策树特征重要性等。这种方法可以同时考虑特征的重要性和模型的性能,得到的特征选择结果较为稳健。但是,嵌入式特征选择通常需要调节超参数,对模型的选择和调优有一定要求。
2.3.1 决策树特征重要性
决策树是一种常用的机器学习算法,除了用于预测和分类外,还可以用于特征选择。在决策树算法中,可以通过计算特征的重要性来衡量特征对模型预测的贡献程度,从而进行特征选择。
使用ExtraTreesClassifier类进行特征重要性计算,让算法给出每一个数据特征的得分:
from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifierfilename = 'Sklearn\pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names = names)array = data.values
X = array[:, 0:8]
Y = array[:, 8]model = ExtraTreesClassifier()
fit = model.fit(X, Y)
print(fit.feature_importances_)