likes
comments
collection
share

机器学习基础-监督学习-训练数据-特征选择之Filter方法

作者站长头像
站长
· 阅读数 38

Filter 方法是一种特征选择技术,通过对特征进行评估和排名,选择排名靠前的特征用于训练模型。Filter 方法的主要优点是计算速度快,不需要训练模型即可完成特征选择。

下面是一些常用的 Filter 方法:

  1. 方差选择法(VarianceThreshold):删除方差较小的特征。
  2. 相关系数法:计算每个特征与目标变量之间的相关系数,选择相关系数较高的特征。
  3. 卡方检验法:计算每个特征与目标变量之间的卡方值,选择卡方值较高的特征。
  4. 互信息法:计算每个特征与目标变量之间的互信息,选择互信息较高的特征。

方差选择法(VarianceThreshold)

方差选择法是一种特征选择方法,可以通过删除方差较小的特征来减少数据的维度。具体来说,我们可以计算每个特征的方差,然后选择方差大于阈值的特征作为选择的特征。阈值可以通过手动指定,也可以通过 Grid Search 等方法选择。

方差选择法的数学原理比较简单,它假设特征的方差越大,特征对目标变量的影响越大。因此,如果一个特征的方差较小,那么它很可能不重要,可以被删除。具体来说,方差选择法的公式如下:

Var(X)=∑i=1n(Xi−Xˉ)2n−1Var(X) = \frac{\sum_{i=1}^{n} (X_i-\bar{X})^2}{n-1}Var(X)=n1i=1n(XiXˉ)2

其中,XiX_iXi 表示第 iii 个样本的特征值,Xˉ\bar{X}Xˉ 表示所有样本的特征均值,nnn 表示样本数量。

在 sklearn 中,方差选择法可以使用 VarianceThreshold 类来实现。下面是一个使用方差选择法进行特征选择的 Python 示例代码:

from sklearn.datasets import load_iris
from sklearn.feature_selection import VarianceThreshold

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 使用方差选择法进行特征选择
selector = VarianceThreshold(threshold=0.2)
selector.fit_transform(X)

# 输出结果
print("原始数据特征数:", X.shape[1])
print("特征选择后数据特征数:", selector.transform(X).shape[1])

在这个示例中,我们使用 VarianceThreshold 方法选择了方差大于 0.2 的特征,输出了特征选择前后的特征数。需要注意的是,我们需要根据数据集的特点和需求来选择合适的特征选择方法和参数,以达到最好的性能。

相关系数法

相关系数法是一种基于特征和目标变量之间的线性关系进行特征选择的方法。具体来说,它通过计算每个特征与目标变量之间的相关系数,选择相关系数较高的特征作为选择的特征。常见的相关系数有 Pearson 相关系数、Spearman 相关系数和 Kendall Tau 相关系数。

下面以 Pearson 相关系数为例,讲解相关系数法的具体实现和使用。

Pearson 相关系数是一种衡量两个变量之间线性相关性的度量方法,其值介于 -1 和 1 之间。具体来说,如果 Pearson 相关系数为 1,则表示两个变量完全正相关;如果 Pearson 相关系数为 -1,则表示两个变量完全负相关;如果 Pearson 相关系数为 0,则表示两个变量没有线性相关性。

下面是一个使用 Pearson 相关系数进行特征选择的 Python 示例代码:

from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr

# 加载数据集
boston = load_boston()
X, y = boston.data, boston.target

# 使用 Pearson 相关系数进行特征选择
def pearson_selector(X, y, k):
    scores = []
    for i in range(X.shape[1]):
        score, _ = pearsonr(X[:, i], y)
        scores.append(score)
    scores = abs(scores)
    top_k_idx = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)[:k]
    return top_k_idx

selector = SelectKBest(pearson_selector, k=5)
selector.fit_transform(X, y)

# 输出结果
print("原始数据特征数:", X.shape[1])
print("特征选择后数据特征数:", selector.transform(X).shape[1])
print("特征选择后的特征索引:", selector.get_support(indices=True))

在这个示例中,我们使用 SelectKBest 方法选择了与目标变量的 Pearson 相关系数绝对值最大的 5 个特征,输出了特征选择前后的特征数和选择的特征索引。需要注意的是,我们可以根据需求和数据集的特点选择合适的相关系数和特征选择方法,以达到最好的性能。

总之,相关系数法是一种简单有效的特征选择技术,可以通过计算特征和目标变量之间的相关性选择重要的特征,有助于提高模型的准确性和泛化能力。

卡方检验法

卡方检验法是一种常用的特征选择方法,它可以帮助我们选择与目标变量显著相关的特征。具体来说,卡方检验法会计算每个特征与目标变量之间的卡方值,选择卡方值较高的特征作为选择的特征。卡方检验法适用于分类问题,而且要求特征是离散的。

卡方检验法的主要思想是比较实际观察到的频数与期望频数之间的差异。期望频数是在特征和目标变量之间不存在关联的情况下,我们预计在每个特征值上观察到的频数。计算卡方值的公式如下:

χ2=∑(Oi−Ei)2Ei\chi^2 = \sum \frac{(O_i-E_i)^2}{E_i}χ2=Ei(OiEi)2

其中,OiO_iOi 表示实际观察到的频数,EiE_iEi 表示期望频数。我们可以通过卡方值来判断特征与目标变量之间的关联程度,卡方值越大表示特征与目标变量之间的关联程度越高。

下面是一个使用卡方检验法进行特征选择的 Python 示例代码:

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 使用卡方检验法进行特征选择
selector = SelectKBest(chi2, k=2)
selector.fit_transform(X, y)

# 输出结果
print("原始数据特征数:", X.shape[1])
print("特征选择后数据特征数:", selector.transform(X).shape[1])

在这个示例中,我们使用 SelectKBest 方法选择卡方值最高的两个特征,输出了特征选择前后的特征数。需要注意的是,我们需要根据数据集的特点和需求来选择合适的特征选择方法和参数,以达到最好的性能。

总之,卡方检验法是一种常用的特征选择方法,可以帮助我们选择与目标变量显著相关的特征,有助于提高模型的准确性和泛化能力。

互信息法

互信息法是一种常用的特征选择方法,可以通过计算特征与目标变量之间的互信息来评估特征的重要性,选择互信息较高的特征用于训练模型。本文将详细介绍互信息法的原理和实现方法,以及如何使用 Python 实现互信息法进行特征选择。

互信息(Mutual Information)是一种衡量两个变量之间相关性的方法,它可以用于衡量特征与目标变量之间的相关性。互信息的定义如下:

I(XiY)=∑x∈X∑y∈Yp(x,y)log⁡p(x,y)p(x)p(y)I(X_iY) = \sum_{x\in X} \sum_{y\in Y} p(x,y) \log\frac{p(x,y)}{p(x)p(y)}I(XiY)=xXyYp(x,y)logp(x)p(y)p(x,y)

其中 XXXYYY 分别表示两个随机变量,p(x,y)p(x, y)p(x,y)XXXYYY 的联合概率分布,p(x)p(x)p(x)p(y)p(y)p(y) 分别是 XXXYYY 的边缘概率分布。互信息的值越大,表示 XXXYYY 之间的相关性越强。

在特征选择中,我们可以计算每个特征与目标变量之间的互信息,然后选择互信息较高的特征。互信息法的实现方法可以使用 Scikit-Learn 中的 mutual_info_classif 或 mutual_info_regression 函数,分别适用于分类和回归问题。

下面是一个使用互信息法进行特征选择的 Python 示例代码:

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest, mutual_info_classif

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 使用互信息法进行特征选择
selector = SelectKBest(mutual_info_classif, k=2)
X_new = selector.fit_transform(X, y)

# 输出结果
print("原始数据特征数:", X.shape[1])
print("特征选择后数据特征数:", X_new.shape[1])
print("所选特征的索引:", selector.get_support(indices=True))

在这个示例中,我们使用了 Scikit-Learn 中的 SelectKBest 类来进行特征选择,指定了使用 mutual_info_classif 函数计算互信息,并选择了 k=2 个特征。最后输出了特征选择前后的特征数和所选特征的索引。

需要注意的是,互信息法需要对特征和目标变量进行离散化,否则计算的互信息可能不准确。可以使用 Scikit-Learn 中的 KBinsDiscretizer 类对数据进行离散化。

总之,互信息法是一种常用的特征选择方法,可以通过计算特征与目标变量之间的互信息来评估特征的重要性,有助于提高模型的准确性和泛化能力。在实际应用中,可以根据具体问题的需求来选择适当的特征选择方法。如果数据集中特征数量很多,可以考虑使用互信息法进行特征选择,如果特征数量较少,可以使用 Wrapper 方法或 Embedded 方法进行特征选择。同时,需要注意特征选择方法的选择和超参数的调整对最终模型性能的影响,需要进行合理的实验和验证。

转载自:https://juejin.cn/post/7228029867005329445
评论
请登录