百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

特征选择-指南(特征选择常用方法有哪些)

toyiye 2024-07-06 00:17 18 浏览 0 评论

特征选择是从一个较大的特征集中选择最佳数量的特征的过程。在本篇文章中,我们将探讨各种特征选择技术。在介绍之前我们先列出特征选择的方法和技巧归纳。


选择正确的特征选择方法

Numerical Input, Numerical Output

对于回归预测建模问题中的数值输入变量,以下是一些常用的相关性分析方法:

  1. 皮尔逊相关系数(Pearson's correlation coefficient):它衡量了两个变量之间的线性关系强度和方向。取值范围在-1到1之间,接近1表示正相关,接近-1表示负相关,接近0表示无线性相关。
  2. 斯皮尔曼等级相关系数(Spearman's rank correlation coefficient):它衡量了两个变量之间的单调关系强度和方向。它通过将变量的数值转换为排序等级来计算相关性,因此对于非线性关系也有效。

这两种方法都可以用来评估变量之间的关系,但对于不同类型的关系,可能会选择其中一种来进行分析。例如,对于线性关系较强的数据,可以使用皮尔逊相关系数进行分析;而对于非线性关系或者数据存在异常值的情况,斯皮尔曼等级相关系数可能更加适用。

需要注意的是,相关性分析仅仅衡量了变量之间的关联程度,并不代表因果关系。因此,在解释结果时应该谨慎,并结合问题的背景和领域知识来进行综合分析。


Numerical Input, Categorical Output

对于分类预测建模问题中的数值输入变量,以下是一些常用的相关性分析方法:

  1. 方差分析相关系数(ANOVA correlation coefficient):它衡量了数值输入变量和分类目标变量之间的线性关系强度。该方法基于方差分析原理,通过比较不同组之间的方差来确定变量与分类目标的相关性。
  2. Kendall等级相关系数(Kendall's rank coefficient):它衡量了数值输入变量和分类目标变量之间的非线性关系强度。该方法使用变量的等级而不是具体数值,因此在处理有序分类变量时特别有用。

这两种方法都可以用来评估数值输入变量与分类目标变量之间的关联程度,但需要注意的是,它们都假设分类目标变量是离散或有序的。对于非有序分类目标变量,可以考虑使用其他适用的方法,如卡方检验等。

在进行相关性分析时,还可以结合可视化手段,如散点图、箱线图等,来更直观地理解变量之间的关系。

需要注意的是,对于分类预测建模问题,除了相关性分析,还可以使用其他特征选择方法,如信息增益、基尼系数等,来选择最具预测能力的变量。

总之,在解决分类预测建模问题时,相关性分析是一种常用的方法之一,但最终选择的方法应该基于问题特点和数据情况进行综合考虑。


Categorical Input, Numerical Output

对于具有分类输入变量的回归预测建模问题,可以使用与之前相反的方法,即“数值型输入,分类型输出”方法。

具体地说,我们可以将分类输入变量转换为虚拟变量(独热编码),然后使用基于数值输入和虚拟变量的回归分析方法。以下是一些常见的方法:

  1. 线性回归(Linear Regression):可以使用线性回归来建立一个模型,其中包括数值型输入变量和虚拟变量作为自变量,以预测分类型输出变量。线性回归模型可以帮助我们理解不同的输入变量如何与输出变量之间存在关联,以及它们对输出的影响程度。
  2. 逻辑斯蒂回归(Logistic Regression):如果输出变量是二分类的(例如0和1),可以使用逻辑斯蒂回归来建立一个模型。逻辑斯蒂回归模型通过将数值型输入和虚拟变量作为自变量,估计输出变量的概率(或对数几率),从而进行分类预测。
  3. 决策树回归(Decision Tree Regression):决策树回归是一种非参数的回归方法,可以处理分类输入变量和分类输出变量。决策树根据输入变量的不同值和虚拟变量的存在与否,将数据分成不同的子集,并对每个子集进行预测。

这些方法适用于具有分类输入变量的回归预测建模问题。通过将分类输入变量转换为虚拟变量,并结合数值型输入变量进行回归分析,我们可以建立预测模型,并了解分类输入变量与输出变量之间的关联性和影响程度。



Categorical Input, Categorical Output

对于具有分类输入变量的分类预测建模问题,最常用的相关性度量方法是卡方检验和互信息。

  1. 卡方检验(Chi-Squared test):卡方检验用于评估分类输入变量与输出变量之间的关联性。它通过比较观察频数和期望频数之间的差异来判断两个变量之间是否存在显著的关系。在这种情况下,可以使用卡方检验来计算基于列联表的卡方统计量和p值。卡方检验可以告诉我们分类输入变量的不同类别是否与输出变量的不同类别之间存在显著的关联。
  2. 互信息(Mutual Information):互信息是一种衡量两个随机变量之间依赖关系的度量方法,它可以用于评估分类输入变量和输出变量之间的相关性。互信息基于信息论的概念,通过计算输入变量和输出变量的联合概率分布和边缘概率分布之间的信息增益来衡量它们之间的关联程度。互信息可以告诉我们分类输入变量中的某个类别与输出变量的不同类别之间的相关性强度。

这些测试方法可以应用于具有分类输入变量的分类预测建模问题中。通过使用卡方检验和互信息,我们可以评估分类输入变量与输出变量之间的关联性,并了解它们对于预测模型的重要性。这些方法提供了一种量化和统计分析相关性的方式,可帮助我们理解分类输入变量如何影响分类预测结果。


特征选择小技巧

  • 相关性统计

当使用scikit-learn和SciPy库进行统计分析时,可以使用以下具体函数来计算不同的统计量:

  1. Pearson相关系数(Pearson's Correlation Coefficient):在scikit-learn中,可以使用f_regression()函数来计算变量之间的Pearson相关系数。该函数适用于连续型特征和连续型目标变量之间的关系分析。它返回每个特征与目标变量之间的相关系数和p-value。相关系数范围从-1到1,表示变量之间的线性关系强度和方向。
  2. 方差分析(ANOVA):在scikit-learn中,可以使用f_classif()函数来执行方差分析。该函数适用于类别型特征和连续型目标变量之间的关系分析。它计算每个特征与目标变量之间的方差分析F值和p-value。F值表示组间差异与组内差异之比的显著性程度。
  3. 卡方检验(Chi-Squared):在scikit-learn中,可以使用chi2()函数来执行卡方检验。该函数适用于类别型特征和类别型目标变量之间的关系分析。它计算每个特征与目标变量之间的卡方统计量和p-value。卡方统计量衡量了观察值与期望值之间的差异。
  4. 互信息(Mutual Information):在scikit-learn中,可以使用mutual_info_classif()函数(用于分类问题)或mutual_info_regression()函数(用于回归问题)来计算特征与目标变量之间的互信息。互信息表示了两个变量之间的共享信息量。这些函数返回每个特征与目标变量之间的互信息得分。

除了以上提到的函数,SciPy库还提供了其他统计量的计算函数,例如kendalltau()用于计算Kendall's tau相关系数,spearmanr()用于计算Spearman's秩相关系数。这些函数可以用于衡量变量之间的非线性关系或有序关系。

综上所述,这些函数提供了在特征选择和统计分析中常用的统计量计算方法,可以帮助我们评估特征与目标变量之间的关系以及它们的显著性水平。根据这些统计量的结果,我们可以选择最相关的特征进行进一步的分析和建模。



  • 选择方法

当使用scikit-learn库进行特征选择时,可以使用不同的过滤方法来筛选变量。下面是对两种常用方法的详细介绍:

  1. SelectKBest(选择前k个最佳特征):
  2. SelectKBest是一种基于统计检验的特征选择方法。
  3. 首先,对每个输入变量与目标变量之间的关联进行统计计算(如卡方检验、F检验等)。
  4. 然后,选择与目标变量具有最高相关性的前k个特征作为最终的选择结果。
  5. SelectPercentile(选择前百分位数的特征):
  6. SelectPercentile也是一种基于统计检验的特征选择方法,与SelectKBest类似。
  7. 它根据每个输入变量与目标变量的相关性计算得分,并选择与目标变量具有最高得分的一部分特征作为最终的选择结果。
  8. 选择的百分位数由用户预先指定,比如选择与目标变量相关性得分排在前20%的特征。

这些过滤方法都需要进行统计计算,以确定每个特征与目标变量之间的关联程度。在使用这些方法时,我们需要选择适当的统计指标和参数,以及合适的阈值或百分位数,来确定哪些特征应该被选择。

特征选择方法的选择取决于具体的问题和数据集。SelectKBest适用于希望选择固定数量特征的情况,而SelectPercentile则适用于希望选择一定百分比特征的情况。

这些方法在机器学习和统计分析中被广泛使用,可以提高模型的性能、减少过拟合,并提供更好的解释能力。



  • 变量转换

当我们进行特征选择和统计分析时,有时可以考虑对变量进行转换以获得更好的结果。下面是一些具体的转换方法和情况介绍:

  1. 转换分类变量为有序变量:有时候,本身是分类变量的特征可能存在一种内在的顺序关系,但并没有被明确表示出来。我们可以将这些分类变量转换为有序变量,赋予它们适当的顺序标签,以便能够利用有序关系进行统计测量。例如,可以将衣服尺码(S、M、L)转换为(1、2、3)。
  2. 数值变量离散化(分组):有时候,连续数值变量能够通过离散化(分组)的方式更好地进行统计分析。离散化可以将数值范围划分为若干个等宽或不等宽的区间,然后将原始数值映射到相应的区间中。这种转换可以使我们能够利用基于分类的统计测量方法来分析数据。
  3. 数据变换以满足测试的期望:某些统计方法对变量的分布和关系假设了特定的条件。如果数据不符合这些假设,可以尝试对数据进行变换,使其满足测试的期望。例如,如果Pearson相关系数需要变量服从高斯分布且存在线性关系,但实际数据不满足这些假设,可以尝试对数据进行对数变换、指数变换或其他非线性变换,以满足测试的条件。

需要注意的是,在进行变量转换时,我们应该谨慎考虑其合理性和可解释性。变量转换应该基于领域知识和实际情况,并且对于模型和结果的解释具有合理性。此外,在使用转换后的数据进行统计测量时,我们也应该小心解释结果,并考虑到转换可能引入的额外影响或偏差。


  • 特征选择的4种常用方法
  1. SelectKBest(选择K个最佳特征):这是一种基于统计检验的特征选择方法,根据每个特征与目标变量之间的关联程度进行评估。它通过选择与目标变量具有最高相关性的K个特征来进行特征选择。
  2. Recursive Feature Elimination(递归特征消除):这是一种迭代的特征选择方法,它通过递归地构建模型并剔除对结果影响较小的特征来进行特征选择。在每次迭代中,它将剔除当前最不重要的特征,直到达到所需的特征数量。
  3. Correlation-matrix with heatmap(热力图相关矩阵):该方法通过计算特征之间的相关性,并使用热力图可视化相关系数矩阵。通过观察热力图,我们可以识别出与目标变量高度相关的特征或者发现特征之间存在较强的相关性,从而进行特征选择。
  4. Random-Forest Importance(随机森林重要性):基于随机森林的特征选择方法。随机森林通过构建多个决策树来评估特征的重要性。通过计算特征在随机森林中的平均准确率下降情况,可以确定每个特征的重要性,并进行特征选择。

这些方法都是常用的特征选择技术,可以根据具体的数据和问题选择适合的方法来进行特征选择。特征选择有助于减少数据维度、提高模型性能和解释能力,从而改善机器学习和统计分析的结果。



下面我们将详细介绍每种特征选择方法。

  1. Filter methods

Filter methods 主要包括了以下几种方法:

  1. Basic methods
  2. Univariate methods
  3. Information gain
  4. Fischer score
  5. ANOVA F-Value for Feature Selection
  6. Correlation Matrix with Heatmap


Filter methods 通常作为预处理步骤使用。特征的选择与任何机器学习算法无关。相反,特征是根据它们在各种统计检验中与结果变量的相关性得分来选择的。这些方法的特点如下:

  • 这些方法依赖于数据的特征(特征的特性)
  • 它们不使用机器学习算法。
  • 它们是模型无关的。
  • 它们的计算成本较低。
  • 它们通常给出的预测性能比wrapper methods差。 (这是因为过滤方法仅依赖于特征与结果变量之间的统计相关性,而不考虑特征之间的相互作用或组合。封装方法则使用机器学习算法进行特征选择,能够更精确地捕捉特征之间的关系和重要性,因此通常具有更好的预测性能。)
  • 它们非常适用于快速筛选和移除不相关的特征。

Filter methods的方法可以用下面的图表来解释:


Basic methods

  • Remove constant features

constant features(常量特征)是指在整个数据集中所有样本上具有相同取值的特征。这些特征并不包含任何有助于机器学习模型进行区分和预测的信息。因此,在特征选择的过程中,常量特征通常被认为是无用的,可以被移除或忽略。

常量特征可能产生以下问题:

  1. 方差为零:由于常量特征在所有样本上具有相同值,其方差为零。方差为零的特征无法提供任何区分样本的能力,对于模型训练来说是没有意义的。
  2. 无信息增益:常量特征对目标变量的取值没有任何影响,无法为模型提供有关目标变量的信息。它们不会对模型的性能产生任何积极影响,甚至可能干扰模型的学习过程。

在特征选择的过程中,移除常量特征是一种常见的预处理步骤。这可以通过以下方法来实现:

  1. 方差阈值筛选:计算每个特征的方差,并设置一个阈值。如果特征的方差低于阈值,则将其视为常量特征并进行移除。
  2. 相关性分析:通过计算特征与目标变量之间的相关系数或其他相关性指标,识别与目标变量无关的特征。如果某个特征与目标变量的相关系数接近于零,则可以将其视为常量特征并进行移除。
  3. 手动检查:手动检查数据集中的特征,并观察它们在不同取值上的分布。如果特征的取值在整个数据集中都是相同的,则可以将其视为常量特征并进行移除。

要注意的是,在移除常量特征之前,需要仔细考虑其可能对模型的影响。有时候,某些看似常量的特征实际上是有用的,因此需要基于领域知识或实际问题来进行判断。

Source :

https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.VarianceThreshold.html

https://scikit-learn.org/stable/modules/feature_selection.html

# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in 

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt
import seaborn as sns

# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

# Any results you write to the current directory are saved as output.

# ignore warnings

import warnings
warnings.filterwarnings('ignore')

# import the Santander customer satisfaction dataset from Kaggle
X_train = pd.read_csv('/kaggle/input/santander-customer-satisfaction/train.csv', nrows=35000)
X_test = pd.read_csv('/kaggle/input/santander-customer-satisfaction/test.csv', nrows=15000)


# drop TARGET label from X_train
X_train.drop(labels=['TARGET'], axis=1, inplace = True)


# check shape of training and test sets
X_train.shape, X_test.shape

在所有的特征选择过程中,最好的做法是只检查训练集来选择特征。这样做是为了避免过拟合


  • 使用sklearn中的variance threshold

sklearn中的方差阈值(Variance Threshold)是一种简单的基准方法用于特征选择。它移除所有方差不满足某个阈值的特征。默认情况下,它会移除所有方差为零的特征,即在所有样本中具有相同值的特征。

# 统计方差不为0的特征
# using sklearn variancethreshold to find constant features

from sklearn.feature_selection import VarianceThreshold
sel = VarianceThreshold(threshold=0)
sel.fit(X_train)  # fit finds the features with zero variance


# get_support is a boolean vector that indicates which features are retained
# if we sum over get_support, we get the number of features that are not constant
sum(sel.get_support())


# alternate way of finding non-constant features
len(X_train.columns[sel.get_support()])

展示方差为0的特征,即没有变化的特征。

# print the constant features
print(
    len([
        x for x in X_train.columns
        if x not in X_train.columns[sel.get_support()]
    ]))

[x for x in X_train.columns if x not in X_train.columns[sel.get_support()]]

我们可以看到有51列/变量是常量。这意味着对于训练集的所有观测值,51个变量显示相同的值,只有一个值。


  • 使用transformer 对train、test数据集进行剔除
# we can then drop these columns from the train and test sets
X_train = sel.transform(X_train)
X_test = sel.transform(X_test)


# check the shape of training and test set
X_train.shape, X_test.shape

我们可以看到,通过移除常量特征,我们成功地减少了特征空间。


  • Remove quasi-constant features

Quasi-constant features(准常量特征)是指在数据集中几乎所有观测样本中都具有相同取值或者极少数样本具有不同取值的特征。这类特征在机器学习任务中往往提供的信息非常有限,无法为模型提供有效的区分能力或预测能力。

识别和移除准常量特征是特征选择过程中的一项重要任务。它有助于简化数据集,减少维度,提高模型训练的效率,以及构建更易解释的机器学习模型。以下是准常量特征的一些特点和介绍:

  1. 取值分布:准常量特征的主要特点是其取值在整个数据集中缺乏变化。大多数观测样本都具有相同的取值,或者只有极少数样本具有不同的取值。
  2. 信息缺失:由于准常量特征的取值变化有限,它们通常无法提供关于样本之间差异的任何信息。因此,在机器学习模型的训练过程中,这些特征对于预测目标变量几乎没有任何贡献。
  3. 噪音引入:保留准常量特征可能会引入噪音和冗余信息。由于这些特征的取值变化有限,它们在模型中的权重常常很小,可能对最终预测结果产生不良影响。
  4. 特征选择:移除准常量特征是特征选择的一种简单而有用的方法。通过筛选出那些变化较大的特征,可以提高模型的性能,并且简化模型中的特征空间,使其更易于解释和理解。

在识别和移除准常量特征时,我们可以采用不同的方法。一种常见的方法是计算特征的方差并设置一个阈值。如果特征的方差低于阈值,即被认为是准常量特征,可以将其从数据集中删除。此外,我们还可以根据领域知识或手动检查来判断特征是否准常量。

需要注意的是,有时候准常量特征在某些特定上下文中可能具有重要意义。因此,在移除这类特征之前,我们应该仔细考虑其对模型的潜在影响,并结合具体问题和领域知识做出决策。

# import the Santander customer satisfaction dataset from Kaggle

X_train = pd.read_csv('/kaggle/input/santander-customer-satisfaction/train.csv', nrows=35000)
X_test = pd.read_csv('/kaggle/input/santander-customer-satisfaction/test.csv', nrows=15000)


# drop TARGET label from X_train
X_train.drop(labels=['TARGET'], axis=1, inplace = True)


# 更改默认阈值以删除几乎/准常数的特征。
sel = VarianceThreshold(threshold=0.01)  # 0.1 indicates 99% of observations approximately
sel.fit(X_train)  # fit finds the features with low variance


# get_support is a boolean vector that indicates which features 
# are retained. If we sum over get_support, we get the number
# of features that are not quasi-constant
sum(sel.get_support())


# alternative way of doing the above operation:
len(X_train.columns[sel.get_support()])


# finally we can print the quasi-constant features
print(
    len([
        x for x in X_train.columns
        if x not in X_train.columns[sel.get_support()]
    ]))

[x for x in X_train.columns if x not in X_train.columns[sel.get_support()]]

我们可以看到107列/变量几乎是不变的。这意味着107个变量在训练集的99%的观测值中主要显示一个值。

# 选取某个特征值展示
# percentage of observations showing each of the different values
X_train['ind_var31'].value_counts() / np.float(len(X_train))
# 对train和test进行剔除
# we can then remove the features from training and test set
X_train = sel.transform(X_train)
X_test = sel.transform(X_test)


# check the shape of training and test set
X_train.shape, X_test.shape

通过去除常数和准常数特征,我们将特征空间从370个减少到263个。我们可以看到,从当前数据集中删除了100多个特征。


Univariate selection methods

Univariate(单变量),单变量特征选择是一种常用的特征选择方法,它基于单变量统计检验的结果来选择最佳特征。这个方法将每个特征与预测目标之间的关系视为独立的,并假设特征之间相互独立。

在单变量特征选择中,对每个特征进行统计检验(如ANOVA、卡方检验、t检验等),计算每个特征与目标变量之间的相关性或显著性。通过设置一个阈值,我们可以选择与目标变量具有最高相关性或最显著差异的特征。

例如,在分类问题中,我们可以使用ANOVA检验来计算每个特征的F统计量和p-value。F统计量反映了特征对目标变量的影响程度,而p-value则表示其显著性。根据设定的阈值,我们可以选择具有最高F统计量或显著性的特征作为最佳特征。

Scikit-learn库提供了一些实现了transform方法的特征选择类,如SelectKBest和SelectPercentile。这些类可以与其他机器学习算法(估计器)配合使用,作为数据预处理的一部分。通过选择最相关或最显著的特征,这些类能够减少输入特征的维度,提高模型的训练效率和预测准确性。

需要注意的是,单变量特征选择方法只考虑每个特征与目标变量之间的关系,而忽略了特征之间的相互作用。因此,在某些情况下,它可能无法捕捉到特征之间的复杂关系。在实际应用中,通常需要结合其他特征选择方法或领域知识来获取更全面和准确的特征子集。


下面四种方法,均属于此类:

  1. SelectKBest
  2. SelectPercentile
  3. SelectFpr, SelectFdr, or family wise error SelectFwe
  4. GenericUnivariateSelection

Source : https://scikit-learn.org/stable/modules/feature_selection.html


  • SelectKBest

SelectKBest是scikit-learn库中的一个特征选择方法,它通过基于统计测试选择k个最佳特征。具体而言,该方法将每个特征与预测目标之间的关系视为独立的,并评估每个特征的重要性。

SelectKBest的工作原理如下:

  1. 针对每个特征,使用指定的统计测试(如ANOVA、卡方检验、t检验等)计算与目标变量之间的相关性或显著性。
  2. 根据所选的统计测试得分,对特征进行排序。
  3. 选择得分最高的k个特征作为最佳特征。


可以通过以下步骤使用SelectKBest进行特征选择:

  1. 实例化SelectKBest对象并指定要使用的统计测试方法以及要选择的特征数量k。
  2. 使用fit()方法将SelectKBest应用于训练数据,计算每个特征的得分。
  3. 使用transform()方法将原始数据集转换为只包含选定的k个特征的新数据集。


SelectKBest类提供了一些常用的统计测试方法,例如f_classif(用于分类问题的ANOVA测试)、chi2(卡方检验)和f_regression(用于回归问题的ANOVA测试)。此外,还可以根据需要自定义统计测试方法。

通过使用SelectKBest,我们可以降低数据集的维度,去除对目标变量预测影响较小的特征,提高模型训练的效率和预测的准确性。但需要注意的是,SelectKBest独立地考虑每个特征与目标变量之间的关系,可能无法捕捉到特征之间的相互作用。因此,在实际应用中,可能需要结合其他特征选择方法或领域知识来获取更全面和准确的特征子集。


SelectKBest在特征选择过程中主要考虑两个因素:特征的相关性和预测能力。通过选择那些与目标变量高度相关且具有较强预测能力的特征,可以提高建模的准确性和效率,并减少特征维度对建模的影响。

使用SelectKBest算法可以帮助我们降低数据维度、减少特征冗余和噪音,同时保留对目标变量有重要影响的特征,从而提高机器学习模型的性能和解释能力。需要注意的是,选择适当的K值对应用SelectKBest算法至关重要,不同的K值可能会对特征选择的效果产生影响。通常,我们可以使用交叉验证等方法来评估不同K值下的模型性能,并选择最佳的K值。

Source : https://scikit-learn.org/stable/modules/feature_selection.html

https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html#sklearn.feature_selection.SelectKBest

# 选择top两个特征
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest, chi2
X, y = load_iris(return_X_y=True)
X.shape


# select the two best features
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
X_new.shape


  • SelectPercentile

SelectPercentile是scikit-learn库中的另一个特征选择方法,它也是基于统计测试的方法,不同的是它选择的是按百分比选择最佳特征而不是固定数量的特征。

SelectPercentile的工作原理如下:

  1. 针对每个特征,使用指定的统计测试(如ANOVA、卡方检验、t检验等)计算与目标变量之间的相关性或显著性。
  2. 根据所选的统计测试得分,对特征进行排序。
  3. 选择得分排名在前百分比范围内的特征作为最佳特征。


使用SelectPercentile进行特征选择的步骤如下:

  1. 实例化SelectPercentile对象并指定要使用的统计测试方法以及要选择的特征的百分比。
  2. 使用fit()方法将SelectPercentile应用于训练数据,计算每个特征的得分。
  3. 使用transform()方法将原始数据集转换为只包含选择的特征的新数据集。


SelectPercentile类提供了与SelectKBest类相似的统计测试方法,例如f_classif、chi2和f_regression。这些方法用于评估特征与目标变量之间的相关性或显著性。

通过使用SelectPercentile,我们可以根据特征得分的排名选择最佳特征的百分比,而不需要固定的特征数量。这使得特征选择更加灵活,并且可以根据特定问题和数据集的需求来选择最佳特征。

同样地,需要注意的是,SelectPercentile独立地考虑每个特征与目标变量之间的关系,可能无法捕捉到特征之间的相互作用。因此,在实际应用中,可能需要结合其他特征选择方法或领域知识来获取更全面和准确的特征子集。


SelectPercentile 的优点是可以自动选择最具有预测能力的特征,简化了特征选择的过程,并且减少了特征的维度。这有助于提高机器学习模型的准确性、泛化能力和解释能力。需要注意的是,选择合适的百分位数对应用 SelectPercentile 算法至关重要。过高的百分位数可能会保留太多特征,导致维度过高,而过低的百分位数可能会丢失重要特征。因此,我们可以通过交叉验证等方法来评估不同百分位数下的模型性能,并选择最佳的百分位数来进行特征选择

Source : https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectPercentile.html#sklearn.feature_selection.SelectPercentile

# 选择top 10% 的特征
from sklearn.datasets import load_digits
from sklearn.feature_selection import SelectPercentile, chi2
X, y = load_digits(return_X_y=True)
X.shape


# now select features based on top 10 percentile
X_new = SelectPercentile(chi2, percentile=10).fit_transform(X, y)
X_new.shape 


提示:

  • 这些对象接受一个评分函数作为输入,该函数返回单变量得分和p值(或仅对于SelectKBest和SelectPercentile而言,仅返回得分):
  • 对于回归任务:f_regression,mutual_info_regression
  • 对于分类任务:chi2,f_classif,mutual_info_classif


基于F检验的方法用于估计两个随机变量之间的线性依赖程度。而互信息方法可以捕捉任何类型的统计依赖关系,但由于是非参数方法,因此需要更多的样本才能进行准确的估计。


稀疏特征选择:

如果使用稀疏数据(即表示为稀疏矩阵的数据),chi2、mutual_info_regression和mutual_info_classif可以在处理数据时不将其转换为密集格式。

稀疏数据是指其中大部分元素为零的数据结构。对于稀疏数据,通常采用稀疏矩阵的形式进行存储和处理,以节省内存和计算资源。传统的特征选择和统计方法可能需要将稀疏数据转换为密集格式进行处理,但chi2、mutual_info_regression和mutual_info_classif方法可以直接处理稀疏数据,而无需进行转换。

因此,如果你的数据是稀疏矩阵表示的,可以使用chi2、mutual_info_regression和mutual_info_classif方法来处理,而无需将数据转换为密集格式。这样可以更高效地处理稀疏数据,并减少内存和计算资源的消耗。

Source : https://scikit-learn.org/stable/modules/feature_selection.html


warning:

注意不要在分类问题中使用回归评分函数,你会得到无用的结果。


什么是F检验?

F检验是一种用于比较两个或多个样本方差的统计检验方法。它通过计算F值来评估样本之间的方差差异是否显著。

在特征选择中,F检验通常用于评估单个特征与目标变量之间的线性关系的显著性。具体步骤如下:

  1. 假设我们有一个包含特征和目标变量的数据集。
  2. 对于每个特征,将数据集分成几个不同类别或组,例如基于目标变量的不同取值。
  3. 计算每个组内样本的方差以及组间样本的方差。
  4. 根据这些方差计算F值,其计算公式为组间方差除以组内方差的比值,经过适当的调整。
  5. 将计算得到的F值与临界值(基于显著性水平和自由度)进行比较。
  6. 如果F值大于临界值,则可以认为该特征与目标变量之间存在显著线性关系。

需要注意的是,F检验假设数据服从正态分布,并且特征与目标变量之间具有线性关系才能有效使用。如果数据不满足这些假设,F检验的结果可能不可靠。因此,在应用F检验时,需要对数据进行合适的预处理和验证假设的合理性。

基础概念科普:

显著性水平(Significance Level)是统计学中用于确定拒绝或接受原假设的阈值。通常用α表示,典型的显著性水平包括0.05和0.01。在假设检验中,如果计算出来的统计量的概率小于或等于显著性水平α,则我们可以拒绝原假设。

自由度(Degrees of Freedom)是指用于估计总体参数的独立信息的个数。在F检验中,有两个自由度:分子自由度和分母自由度。分子自由度表示组间变异的自由度,通常是组数减1;分母自由度表示组内变异的自由度,通常是样本个数之和减去组数。

临界值(Critical Value)是对应于给定显著性水平和自由度的特定统计分布的值。在假设检验中,它代表了一个边界值,用于判断统计量的观察值是否足够极端,从而导致对原假设的拒绝。如果计算出来的统计量超过临界值,则我们可以拒绝原假设。

临界值是根据特定的统计分布表格或计算公式得到的。对于F检验,临界值可以在F分布表格中查找,也可以使用统计软件计算得到。不同的显著性水平和自由度对应不同的临界值。在假设检验中,我们将计算得到的F值与临界值进行比较来判断是否拒绝原假设。


举例:

当我们进行特征选择时,假设我们有一个数据集包含身高和体重两个特征,并且我们想要确定哪个特征对于预测一个人的健康状况更为重要。

首先,我们将数据集按照健康状况分为两组:健康组和不健康组。然后,我们分别计算每个组内身高和体重的方差,以及整个数据集身高和体重的方差。

假设计算结果如下:

健康组身高方差:50 不健康组身高方差:40 整个数据集身高方差:45

健康组体重方差:100 不健康组体重方差:120 整个数据集体重方差:110

接下来,我们计算F值。对于身高特征,我们计算组间方差(45 - (50+40)/2 = 15)除以组内方差的比值;对于体重特征,我们计算组间方差(110 - (100+120)/2 = 10)除以组内方差的比值。

假设F值计算结果如下:

身高特征的F值:15 / ((50+40)/2) = 0.3 体重特征的F值:10 / ((100+120)/2) = 0.1

最后,我们将计算得到的F值与临界值进行比较。如果我们选择显著性水平为0.05,自由度为1,则对应的临界值为3.84。由于身高特征的F值(0.3)小于临界值(3.84),我们可以认为身高与健康状况之间的线性关系不显著。而体重特征的F值(0.1)也小于临界值,因此我们也可以认为体重与健康状况之间的线性关系不显著。

基于这个F检验的结果,我们可以得出结论:在这个数据集中,身高和体重两个特征对于预测健康状况没有显著影响。

在上面的示例中,我们有两个特征(身高和体重),并将数据集分为健康组和不健康组。假设我们有5个样本数据(每个组各有5个样本),那么自由度的计算如下:

分子自由度(组间变异的自由度)= 组数 - 1 = 2 - 1 = 1

分母自由度(组内变异的自由度)= 样本个数 - 组数 = 10 - 2 = 8

在这个示例中,假设我们有2个组,每个组有5个样本。因此,分子自由度为1,分母自由度为8。这些自由度用于计算F值并与临界值进行比较,以确定特征的显著性。请注意,具体的自由度计算方式可能因具体情况而有所不同。


什么是互信息?

互信息是一种用于衡量两个随机变量之间关联性的方法。它可以捕捉到变量之间的任何类型的统计依赖关系,而不仅限于线性关系。互信息用于度量一个随机变量中的信息量与另一个随机变量中的信息量之间的相互依赖程度。

互信息的计算基于信息熵的概念,信息熵是用来描述一个随机变量的不确定性或信息量的度量。在计算互信息时,我们比较两个随机变量的联合概率分布和各自的边缘概率分布。互信息值表示了通过观察一个随机变量来减少对另一个随机变量的不确定性的程度。

互信息可以在特征选择、维度约简、数据压缩等任务中发挥重要作用。通过计算特征与目标变量之间的互信息,我们可以了解哪些特征对于预测目标变量是最有信息量的,从而进行特征选择。此外,在聚类、分类和回归等任务中,互信息也可以作为评估模型性能的指标。

需要注意的是,使用互信息方法进行统计分析时,由于其非参数性质,通常需要更多的样本才能获得准确的估计结果。



Information Gain

信息增益和互信息是用来度量特征与目标变量之间关系的方法。它们可以衡量一个特征的存在或缺失对于正确预测目标变量所提供的信息量。

信息增益是在特征选择中常用的一个指标,它通过比较使用某一特征进行划分前后数据集的熵差异来衡量特征对于目标变量的贡献。具体而言,信息增益衡量了使用某个特征划分数据集后,目标变量的不确定性减少了多少。


互信息衡量了两个变量之间的相关性和相互依赖程度。当我们知道一个变量的取值时,互信息告诉我们关于另一个变量的不确定性被减少了多少。

如果两个变量是独立的,也就是说它们之间没有任何关系,那么知道一个变量的取值并不会给我们提供任何关于另一个变量的信息。在这种情况下,互信息为零。

另一方面,如果一个变量的取值完全取决于另一个变量,而且反之亦然,那么知道一个变量的取值就可以确定另一个变量的取值。在这种情况下,互信息等于其中一个变量本身的不确定性,也就是它的熵。

互信息的计算基于两个变量的联合分布和各自边缘分布的信息熵。通过比较这些熵值,我们可以得到两个变量之间的互信息量。

简而言之,互信息度量了两个变量之间的相关性和相互依赖程度。更高的互信息意味着两个变量之间的共享信息更多,而较低的互信息表示它们之间的独立性更强。互信息在许多领域中都被广泛应用,如机器学习、数据挖掘和信息理论等。


因此,信息增益和互信息都可以用来衡量特征对于正确预测目标变量所提供的信息量,从而帮助我们进行特征选择和模型建立。

  • mutual_info_classif Source :
  • 该函数用于估计离散目标变量的互信息。
  • 两个随机变量之间的互信息(MI)是一个非负值,它衡量了这两个变量之间的依赖关系。当且仅当两个随机变量独立时,互信息为零,而较高的值表示较强的依赖性。
  • 该函数依赖于基于k最近邻距离的非参数方法,通过熵估计来计算互信息。
  • 它可以用于单变量特征选择。

https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.mutual_info_classif.html#sklearn.feature_selection.mutual_info_classif


  • mutual_info_regression Source :
  • 估计连续目标变量的互信息。
  • 两个随机变量之间的互信息(MI)是一个非负值,它衡量了这两个变量之间的依赖关系。当且仅当两个随机变量独立时,互信息为零,而较高的值表示较强的依赖性。
  • 该函数依赖于基于k最近邻距离的非参数方法,通过熵估计来计算互信息。
  • 它可用于单变量特征选择。

https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.mutual_info_regression.html#sklearn.feature_selection.mutual_info_regression


Fisher Score (chi-square implementation)

在scikit-learn中,chi-square(卡方检验)是一种用于特征选择的方法。它用于计算每个非负特征与类别之间的卡方统计量。

卡方统计量用于评估分类任务中的分类变量。它比较了特征的不同类别中目标变量Y的观察分布与目标变量类别的期望分布之间的差异,而不考虑特征的类别。

具体而言,卡方统计量的计算步骤如下:

  1. 对于每个特征的每个类别,计算目标变量Y的观察频数(即实际发生的样本数量)。
  2. 根据目标变量Y的整体分布和特征的类别分布,计算每个特征类别对应的期望频数(即在独立情况下预期发生的样本数量)。
  3. 根据观察频数和期望频数计算卡方统计量,衡量观察值与期望值之间的偏离程度。


卡方统计量的计算结果可以用于评估特征与目标变量之间的关联性。较大的卡方统计量表示特征的类别分布与目标变量的分布之间存在较大的差异,这表明该特征对于分类任务是有信息量的。

需要注意的是,卡方统计量适用于分类变量和分类任务,对于连续变量和回归任务不适用。此外,卡方统计量仅考虑特征与目标变量之间的关联性,而不考虑特征类别之间的关系。

在特征选择中,可以使用卡方统计量对分类变量进行评估,并选取具有较大卡方统计量的特征作为重要特征。这种方法认为那些与目标变量在分类上具有较大差异的特征更有可能对分类任务有贡献。


综上所述,卡方统计量是一种常用的特征选择指标,适用于分类变量和分类任务。在scikit-learn中,通过chi2函数可以使用卡方统计量进行特征选择。

# load libraries
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest, chi2


# Load Data
# load iris data
iris = load_iris()

# create features and target
X = iris.data
y = iris.target

# convert to categorical data by converting data to integers
X = X.astype(int)


# Compare Chi-Squared Statistics
# select two features with highest chi-squared statistics
chi2_selector = SelectKBest(chi2, k=2)
X_kbest = chi2_selector.fit_transform(X, y)


# View results
print('Original number of features:', X.shape[1])
print('Reduced number of features:', X_kbest.shape[1])


ANOVA F-value For Feature Selection

在统计学中,方差分析(ANOVA)是一种用于比较多个组之间均值是否存在显著差异的方法。它适用于特征为定量变量(即数值型)且目标变量为分类变量的情况。

方差分析的核心思想是将数据集按照目标变量的不同类别(组别)进行分组,然后比较每个组别中定量变量的均值是否显著不同。通过计算ANOVA F值,我们可以评估组别间均值的差异程度。

具体而言,在计算ANOVA F值时,我们首先计算各组别内部的平方和(SSR),衡量各组别内部的方差;然后计算各组别间的平方和(SST),衡量各组别之间的方差;最后,通过比较SSR和SST的大小,计算F值。

F值反映了组别间均值差异与各组别内部方差的比值。如果F值较大,则说明组别间的差异较大,意味着特征与目标变量存在显著关联。


需要注意的是,ANOVA方法要求数据满足一些假设条件,例如正态性、方差齐性和独立性。若数据不满足这些假设条件,则可能导致结果的不准确性。

总结来说,ANOVA是一种用于比较多个组别间均值差异的统计方法。通过计算F值,我们可以评估定量变量与分类目标变量之间的关联性。它在许多领域中被广泛应用,特别是在实验设计和数据分析中。

# Load libraries
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif


# Load iris data
iris = load_iris()

# Create features and target
X = iris.data
y = iris.target


# Select Features With Best ANOVA F-Values

# Create an SelectKBest object to select features with two best ANOVA F-Values
fvalue_selector = SelectKBest(f_classif, k=2)

# Apply the SelectKBest object to the features and target
X_kbest = fvalue_selector.fit_transform(X, y)


print('Original number of features:', X.shape[1])
print('Reduced number of features:', X_kbest.shape[1])



Correlation-Matrix with Heatmap

相关性是统计学中用于衡量两个或多个变量之间线性关系的指标。当两个变量存在相关性时,它们的值会以某种方式随着彼此的变化而变化。通过计算相关系数,我们可以度量这种关系的强度和方向。

在特征选择中,我们通常希望选取那些与目标变量高度相关的特征,因为它们可能对预测目标变量具有重要的贡献。如果一个特征与目标变量之间存在强正相关关系,那么当这个特征的值增加时,目标变量的值也很可能会增加;反之,如果存在强负相关关系,那么当这个特征的值增加时,目标变量的值则可能会减小。

然而,如果选择的特征之间存在高度相关性,那么它们可能提供了冗余的信息。这意味着其中一个特征的信息已经包含在其他相关特征中,因此在建模和分析过程中可能并不需要全部保留。相反,我们倾向于选择特征间相关性较低的子集,以避免信息冗余,并提高模型的解释能力和效果。

因此,在相关性特征选择中,我们评估各个特征与目标变量之间的相关性,同时考虑特征之间的相关性。我们寻求那些与目标变量高度相关,但与其他特征较低相关的特征子集。这样的特征子集更有可能提供独立的、有用的信息,可以更好地解释目标变量的变化。

综上所述,通过相关性特征选择方法,我们可以选择与目标变量高度相关且互相之间较低相关的特征子集。这样的特征子集在建模和预测过程中具有重要的作用,并可以提高模型的准确性和解释性。

一句话:“好的特征子集包含与目标高度相关,但彼此不相关的特征”


常用的相关系数包括皮尔逊相关系数(Pearson correlation coefficient)和斯皮尔曼等级相关系数(Spearman rank correlation coefficient)。皮尔逊相关系数用于衡量两个连续变量之间的线性关系,取值范围为-1到1,其中1表示完全正相关,-1表示完全负相关,0表示无相关性。斯皮尔曼等级相关系数则用于衡量两个变量之间的单调关系,不要求变量是连续的。


  • 使用pearson相关系数,我们得到的系数值将在-1和1之间变动。
  • 如果两个特征之间的相关性为0,这意味着改变这两个特征中的任何一个都不会影响另一个。
  • 如果两个特征之间的相关性大于0,这意味着增加一个特征的值也会增加另一个特征的值(相关系数越接近1,两个不同特征之间的联系就越强)。
  • 如果两个特征之间的相关性小于0,这意味着增加一个特征的值将减少另一个特征的值(相关系数越接近-1,两个不同特征之间的关系就越强)。
  • 在这个分析中,我们将检查所选择的变量是否彼此高度相关。如果是,那么我们只需要保留其中一个相关的,并删除其他的。
# Load iris data
from sklearn.datasets import load_iris
iris = load_iris()

# Create features and target
X = iris.data
y = iris.target


# Convert feature matrix into DataFrame
df = pd.DataFrame(X)

# View the data frame
print(df)


# Create correlation matrix
corr_matrix = df.corr()
print(corr_matrix)


# Create correlation heatmap
plt.figure(figsize=(8,6))
plt.title('Correlation Heatmap of Iris Dataset')
a = sns.heatmap(corr_matrix, square=True, annot=True, fmt='.2f', linecolor='black')
a.set_xticklabels(a.get_xticklabels(), rotation=30)
a.set_yticklabels(a.get_yticklabels(), rotation=30)           
plt.show() 


 # Select upper triangle of correlation matrix
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool))
upper    


# Find index of feature columns with correlation greater than 0.9
to_drop = [column for column in upper.columns if any(upper[column] > 0.9)]
print(to_drop)


# Drop Marked Features
df1 = df.drop(df.columns[to_drop], axis=1)
print(df1)

通过上述方法,我们完成了特征的选择。


  1. Wrapper methods

包装方法(Wrapper methods)是一种特征选择的方法,它尝试使用特征的子集并在其上训练模型。根据前一个模型的推断结果,我们决定是否添加或删除子集中的特征。这个问题本质上可以看作是一个搜索问题。与过滤方法相比,包装方法通常计算成本较高。

具体而言,包装方法的工作流程如下:

  1. 初始化:从原始特征集合中选择一个初始子集,该子集可以是由领域知识、统计信息或随机选择得到的。
  2. 特征子集评估:使用选定的特征子集训练一个机器学习模型,并使用一种性能指标(如准确率、误差等)来评估模型的性能。
  3. 特征子集搜索:应用某种搜索策略(如逐步向前选择、逐步向后选择、逐步向前/向后选择等)来修改当前的特征子集。这可以包括添加一个新特征、移除一个现有特征或交换特征的位置。
  4. 更新特征子集:使用修改后的特征子集重新训练模型,并评估其性能。
  5. 终止条件:基于预定的终止条件(如特征子集大小、性能提升的阈值等),决定是否终止搜索过程。
  6. 最佳特征子集选择:选择性能最好的特征子集作为最终的选择,并使用该子集来训练最终的模型。

包装方法的优点在于它们能够考虑特征之间的相互作用和非线性关系,因为它们使用了实际的机器学习模型进行评估。然而,由于需要在每个特征子集上训练模型并进行性能评估,这使得计算成本较高,尤其当特征维度很大时。

尽管包装方法的计算开销较高,但它们在特征选择任务中通常能够提供更准确的结果。因此,在实践中,我们需要权衡计算成本和性能提升的利弊,根据具体问题和资源限制选择合适的特征选择方法,以获得最佳的模型性能。


Wrapper methods 主要包括了以下几种方法:

  1. Forward Selection
  2. Backward Elimination
  3. Exhaustive Feature Selection
  4. Recursive Feature Elimination
  5. Recursive Feature Elimination with Cross-Validation


Wrapper methods 方法可以用下面的图表来解释:


Forward Selection

前向选择(Forward Selection)是一种迭代方法,用于特征选择和模型构建。该方法从一个空的特征集合开始,然后逐步添加对模型性能改进最大的特征,直到无法通过添加新的变量来提高模型性能为止。

具体步骤如下:

  1. 开始时,创建一个空特征集合(简化集合)。
  2. 评估所有原始特征的单个性能,并选择表现最佳的特征。
  3. 将选定的特征添加到简化集合中。
  4. 在每个迭代中,从剩余的原始特征中选择一个表现最佳的特征,与已选的特征进行组合评估(预先设定的评估标准可以是分类任务中的 ROC-AUC,回归任务中的 R 平方等),并选择生成最佳算法的特征组合。
  5. 将选定的特征组合添加到简化集合中。
  6. 重复步骤4和步骤5,直到添加新的特征不再提高模型性能或达到预设的特征数量。

前向选择的优点是能够快速确定数据集中对模型性能有重要贡献的特征。然而,这种方法需要遍历所有可能的特征组合,因此在特征空间较大时计算成本较高。

在Python中,可以使用mlxtend等专门的包来实现前向选择方法。在mlxtend中,可以设置停止准则来控制选择的特征数量。

总之,前向选择是一种用于特征选择和模型构建的迭代方法,通过逐步添加性能改进最大的特征来构建模型。它是一种贪婪算法,可帮助我们快速确定对模型性能有重要影响的特征。


  • 在mlextend特征选择的扩展实现中,停止标准是任意设置的特征数量。因此,当我们达到所选特征的期望数量时,搜索将结束。
# step forward feature selection

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score
from mlxtend.feature_selection import SequentialFeatureSelector as SFS

#load dataset
data = pd.read_csv('/kaggle/input/house-prices-advanced-regression-techniques/train.csv')
data.shape



# In practice, feature selection should be done after data pre-processing,
# so ideally, all the categorical variables are encoded into numbers,
# and then you can assess how deterministic they are of the target

# here for simplicity I will use only numerical variables
# select numerical columns:

numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
numerical_vars = list(data.select_dtypes(include=numerics).columns)
data = data[numerical_vars]
data.shape



# separate train and test sets
X_train, X_test, y_train, y_test = train_test_split(
    data.drop(labels=['SalePrice'], axis=1),
    data['SalePrice'],
    test_size=0.3,
    random_state=0)

X_train.shape, X_test.shape


# find and remove correlated features
def correlation(dataset, threshold):
    col_corr = set()  # Set of all the names of correlated columns
    corr_matrix = dataset.corr()
    for i in range(len(corr_matrix.columns)):
        for j in range(i):
            if abs(corr_matrix.iloc[i, j]) > threshold: # we are interested in absolute coeff value
                colname = corr_matrix.columns[i]  # getting the name of column
                col_corr.add(colname)
    return col_corr

corr_features = correlation(X_train, 0.8)
print('correlated features: ', len(set(corr_features)) )



# removed correlated  features
X_train.drop(labels=corr_features, axis=1, inplace=True)
X_test.drop(labels=corr_features, axis=1, inplace=True)

X_train.shape, X_test.shape


X_train.fillna(0, inplace=True)


# step forward feature selection
from mlxtend.feature_selection import SequentialFeatureSelector as SFS

sfs1 = SFS(RandomForestRegressor(), 
           k_features=10, 
           forward=True, 
           floating=False, 
           verbose=2,
           scoring='r2',
           cv=3)

sfs1 = sfs1.fit(np.array(X_train), y_train)
sfs1.k_feature_idx_
# 输出
(4, 7, 12, 14, 16, 17, 18, 23, 24, 27)


X_train.columns[list(sfs1.k_feature_idx_)]
# 输出
Index(['OverallQual', 'YearRemodAdd', 'TotalBsmtSF', '2ndFlrSF', 'GrLivArea',
       'BsmtFullBath', 'BsmtHalfBath', 'Fireplaces', 'GarageCars',
       'EnclosedPorch'],
      dtype='object')


Backward Elimination

后向消除(Backward Elimination)是一种特征选择方法,用于在建立模型时从全集特征中逐步剔除对模型性能影响较小的特征。该方法的目标是找到最精简的特征子集,以提高模型的性能、减少过拟合,并提高模型的解释能力。

具体步骤如下:

  1. 初始化:将所有特征包含在模型中,形成一个完整的特征集合。
  2. 建立基准模型:使用全集特征训练模型,并评估模型性能。
  3. 特征剔除迭代:在每个迭代中,计算每个特征的重要性或显著性指标,如p-value、系数大小等,然后选择对模型性能影响最小的特征进行剔除。
  4. 更新特征集合:移除被选择的最不显著特征,并更新特征集合。
  5. 重新建模:使用更新后的特征集合重新训练模型并评估性能。
  6. 终止条件:重复步骤3至步骤5,直到模型的性能不再提升,或者达到预设的特征数量或其他终止条件为止。

在每次迭代中,通过剔除对模型性能影响较小的特征,后向消除可以减少特征空间,从而降低模型的复杂性,并提高模型的泛化能力和解释性。通过迭代过程,我们可以找到对模型性能最为关键的特征,并建立一个最精简而有效的模型。

需要注意的是,特征的选择和剔除依赖于所使用的评估指标和阈值,以及特征之间的相关性。在使用后向消除时,应综合考虑特征的重要性、统计显著性和实际意义,避免过度拟合或信息丢失。

总之,后向消除是一种通过逐步剔除不显著特征来提高模型性能和解释能力的特征选择方法。它能够帮助我们构建更精简、高效且解释性强的模型,从而满足不同领域的建模需求。

# step backward feature elimination
sfs1 = SFS(RandomForestRegressor(), 
           k_features=10, 
           forward=False, 
           floating=False, 
           verbose=2,scoring='r2',cv=3)
 sfs1 = sfs1.fit(np.array(X_train), y_train)
sfs1.k_feature_idx_
# 输出
(1, 4, 5, 8, 9, 12, 16, 17, 24, 30)


X_train.columns[list(sfs1.k_feature_idx_)]
# 输出
Index(['MSSubClass', 'OverallQual', 'OverallCond', 'MasVnrArea', 'BsmtFinSF1',
       'TotalBsmtSF', 'GrLivArea', 'BsmtFullBath', 'GarageCars', 'PoolArea'],
      dtype='object')


Exhaustive Feature Selection

在exhaustive feature selection(穷举特征)选择中,通过优化特定机器学习算法的指定性能指标,从所有可能的特征子集中选择最佳的特征子集。

例如,如果分类器是逻辑回归,并且数据集由4个特征组成,算法会按照以下方式评估所有15个特征组合:

  • all possible combinations of 1 feature
  • all possible combinations of 2 features
  • all possible combinations of 3 features
  • all the 4 features

在穷举特征选择中,对于给定的4个特征A、B、C和D,算法将评估以下所有可能的特征子集的性能:

  1. 特征子集:A
  2. 特征子集:B
  3. 特征子集:C
  4. 特征子集:D
  5. 特征子集:A + B
  6. 特征子集:A + C
  7. 特征子集:A + D
  8. 特征子集:B + C
  9. 特征子集:B + D
  10. 特征子集:C + D
  11. 特征子集:A + B + C
  12. 特征子集:A + B + D
  13. 特征子集:A + C + D
  14. 特征子集:B + C + D
  15. 特征子集:A + B + C + D


穷举特征选择(Exhaustive Feature Selection)是一种特征选择方法,通过优化特定的性能度量指标,对所有可能的特征子集进行评估,以选择最佳的特征子集。这种方法适用于任何机器学习算法,例如逻辑回归。

具体步骤如下:

  1. 初始化:给定一个包含n个特征的数据集,创建一个空的特征子集列表,并初始化最佳特征子集为空。
  2. 特征组合生成:根据特征数n,使用组合数学原理生成所有可能的特征组合。在上述例子中,对于4个特征,会有15种不同的特征组合。
  3. 特征子集评估:对于每个特征组合,使用指定的机器学习算法(如逻辑回归)对训练数据进行建模和评估。这包括拟合模型、计算性能度量指标(如准确率、精确率、召回率等)等。
  4. 最佳特征子集选择:根据性能度量指标的优化目标,选择具有最佳性能的特征子集。通常情况下,我们会选择最大化性能度量指标(如准确率)或最小化误差度量指标(如均方误差)的特征子集。
  5. 结果输出:返回选择的最佳特征子集,以供后续建模和预测使用。

穷举特征选择方法基于对所有可能的特征组合进行评估,确保了找到最佳特征子集。然而,随着特征数量增加,组合数会呈指数级增长,导致计算成本非常高。因此,在实际应用中,通常需要结合领域知识和启发式策略来减少特征组合的搜索空间,以提高算法的效率。

总之,穷举特征选择是一种基于评估所有可能的特征组合的方法,以选择最佳特征子集的特征选择方法。它可以帮助我们找到最适合给定机器学习算法的特征组合,从而提高模型性能和泛化能力。然而,需要注意计算成本的问题,并根据实际情况采取相应的优化措施。


Recursive Feature elimination

递归特征消除(Recursive Feature Elimination, RFE)是一种贪心优化算法,旨在找到性能最佳的特征子集。它通过反复创建模型,并在每次迭代中保留最佳或最差表现的特征。它在每次迭代中根据剩余的特征构建下一个模型,直到所有特征都被用完。然后,它根据特征被消除的顺序对它们进行排名。

具体步骤如下:

  1. 初始化:给定一个包含n个特征的数据集,创建一个空的特征子集列表,并初始化最佳特征子集为空。
  2. 特征选择:使用指定的机器学习算法(如逻辑回归)对整个特征集进行建模和评估。这个初始模型可以使用所有特征。
  3. 特征重要性评估:根据这个初始模型,计算每个特征的重要性得分或相关度等指标。这些指标可以是基于模型系数、信息增益、影响力分数等。
  4. 特征消除:选择相对于特征重要性得分最高或最低的特征作为当前迭代中要消除的特征。将这个特征从特征集中移除。
  5. 模型更新:使用剩余的特征集构建新的模型,并进行性能评估。这个过程可以是递归的,持续迭代直到满足某个停止条件(如达到指定的特征数量或达到期望的性能度量)。
  6. 重复步骤4和步骤5直到所有特征都被消除。
  7. 特征排序:根据特征被消除的顺序,对特征进行排名。这可以帮助我们了解哪些特征对模型性能的贡献最大。

递归特征消除方法通过贪心搜索来找到性能最佳的特征子集。它通过反复创建模型并消除特征来减少特征空间的搜索范围,从而找到最佳的特征组合。它可以帮助我们理解哪些特征对于给定机器学习算法最重要,进而提高模型的预测性能和解释能力。

需要注意的是,在处理大型数据集时,递归特征消除的计算成本可能很高。因此,我们可以结合其他优化技术,如特征选择算法、正则化方法等,来加速特征选择的过程。

总之,递归特征消除是一种贪心优化算法,通过逐步消除特征,找到最佳的特征子集。它可以帮助我们理解特征对模型性能的贡献,并提供一种自动化的特征选择方法。

Source : https://scikit-learn.org/stable/auto_examples/feature_selection/plot_rfe_digits.html#sphx-glr-auto-examples-feature-selection-plot-rfe-digits-py


Recursive Feature Elimination with Cross-Validation

递归特征消除与交叉验证(Recursive Feature Elimination with Cross-Validation,RFECV)是一种特征选择技术,通过逐步进行特征消除来选择最佳的特征子集。它结合了递归特征消除(RFE)和交叉验证的思想,能够更准确地评估每个特征的重要性。

RFECV的具体步骤如下:

  1. 初始化:给定一个包含n个特征的数据集和一个基础机器学习算法模型,初始化一个空的特征子集列表,并初始化最佳特征子集为空。
  2. 特征选择和模型训练:使用基础模型对整个特征集进行建模和评估,得到模型的性能度量指标(如准确率、交叉验证分数、ROC-AUC等)。
  3. 特征重要性评估:根据基础模型,计算每个特征的重要性得分或相关度等指标。
  4. 特征消除:选择相对于特征重要性得分最低的特征作为当前迭代中要消除的特征。将这个特征从特征集中移除。
  5. 模型更新和性能评估:使用剩余的特征集构建新的模型,并计算模型的性能度量指标。
  6. 重复步骤4和步骤5,直到满足某个停止条件(如达到指定的特征数量或达到期望的性能度量)。
  7. 特征子集选择:根据模型的性能度量指标,选择最佳的特征子集作为最终的特征选择结果。

RFECV通过反复训练模型并逐步消除特征,结合交叉验证的评估方法,能够更准确地选择最佳的特征子集。它考虑了特征之间的相互影响,并且可以帮助我们避免过拟合问题。

使用RFECV进行特征选择的优点包括:

  1. 全面性:RFECV可以评估每个特征对模型性能的贡献,并选择出最佳的特征子集。
  2. 自动化:RFECV是一种自动化的特征选择方法,可以减轻特征选择的人工负担。
  3. 鲁棒性:RFECV可以考虑特征之间的相互作用,并降低过拟合的风险。

需要注意的是,在处理大型数据集时,RFECV的计算成本可能较高。此外,RFECV的结果可能受到初始特征子集和基础模型的选择影响,因此需要进行适当的调参和验证。

总之,RFECV是一种结合了递归特征消除和交叉验证的特征选择技术。它通过反复训练模型和特征消除,可以选择最佳的特征子集,并提供全面性和自动化的特征选择方法。


Source : https://scikit-learn.org/stable/auto_examples/feature_selection/plot_rfe_with_cross_validation.html#sphx-glr-auto-examples-feature-selection-plot-rfe-with-cross-validation-py



  1. Embedded methods

嵌入式方法是一种特征选择技术,它在模型训练的每个迭代过程中都进行精心的处理,仔细提取对该迭代最具训练贡献的特征。正则化方法是最常用的嵌入式方法,它们根据给定的系数阈值对特征进行惩罚。

正则化方法也被称为惩罚方法,因为它们在预测算法(如回归算法)的优化过程中引入了额外的约束,使模型倾向于更低的复杂性(较少的系数)。


正则化方法具有以下优点:

  1. 减少过拟合:通过引入惩罚项,正则化方法可以减少模型对训练数据的过度拟合,提高泛化能力。
  2. 特征选择:正则化方法可以自动选择对模型预测性能最有贡献的特征,降低了不相关或冗余特征的影响。
  3. 控制模型复杂度:正则化方法通过调整系数大小,可以控制模型的复杂度,并防止模型出现过多的参数。

总结起来,嵌入式方法是一种在模型训练过程中进行特征选择的技术,而正则化方法是最常用的嵌入式方法之一。LASSO和岭回归是其中的典型示例,它们通过引入惩罚函数来减少过拟合现象。这些方法在实际应用中具有广泛的应用和良好的效果。


以下是几种常见的嵌入方法:

  1. 基于正则化的嵌入方法(Regularization-Based Methods):这些方法通过在损失函数中添加正则化项来对特征进行惩罚。最常用的正则化方法包括L1正则化(Lasso)和L2正则化(Ridge)。在训练过程中,正则化项会对特征的系数进行调整,使得对预测结果影响较小的特征的系数逐渐趋向于零。通过调节正则化参数,可以控制特征选择的程度。
  2. 决策树嵌入方法(Decision Tree-Based Methods):决策树可用于特征选择,因为它们能够根据特征的重要性对其进行排序。一种常见的方法是使用基于决策树的特征重要性度量(如基尼系数或信息增益)来评估特征的贡献,并选择最重要的特征。随后,可以根据这些特征构建一个新的模型。
  3. 基于稀疏学习的嵌入方法(Sparse Learning-Based Methods):这些方法旨在通过稀疏性约束来选择最相关的特征。例如,L1范数正则化可以促使模型的系数变得稀疏,从而选择出对预测结果影响较大的特征。
  4. 基于模型迭代的嵌入方法(Model Iteration-Based Methods):这些方法通过在模型训练的迭代过程中逐步选择特征。在每次迭代中,选择对模型性能贡献较小的特征,并将其移除或设置为零。通过反复迭代,逐渐减少特征数量并提高模型的泛化能力。
  5. 弹性网络(Elastic Net):弹性网络是LASSO回归和岭回归的组合,它综合了二者的优点。弹性网络在目标函数中同时引入了L1和L2范数的惩罚项,既能实现特征选择又能处理共线性数据。
  6. 特征选择树(Feature Selection Trees):特征选择树是一种基于决策树的特征选择方法。它通过计算每个特征的重要性得分,来选择对目标变量有最大预测能力的特征。常见的特征选择树算法包括随机森林(Random Forests)和梯度提升树(Gradient Boosting Trees)。
  7. 主成分分析(Principal Component Analysis,PCA):PCA是一种经典的降维方法,它通过线性变换将原始特征映射到新的低维特征空间。PCA能够保留原始数据中最大的方差,在保持数据最重要信息的同时减少特征的维度。
  8. 稀疏主成分分析(Sparse Principal Component Analysis,Sparse PCA):稀疏PCA是对传统PCA的改进,它不仅能实现降维,还能够获得更加稀疏的特征表示。稀疏PCA在特征选择和维度约简方面具有较强的能力。

这些嵌入方法在模型训练过程中利用特征的信息进行特征选择,从而帮助提高模型的性能、降低过拟合风险,并提取最相关的特征用于建模。选择适合问题的嵌入方法有助于优化特征选择过程和模型的表现。



LASSO

Lasso回归是一种线性回归的正则化方法,它引入了L1正则化惩罚来降低模型的复杂度。下面是关于Lasso回归的全面、专业和详细介绍:

Lasso回归背景: 在线性回归中,我们试图通过拟合一个线性模型来预测因变量(目标变量)与自变量(特征变量)之间的关系。然而,当特征变量的数量很大时,线性回归模型可能过于复杂,容易出现过拟合的问题。为了解决这个问题,引入了正则化技术,其中Lasso回归是一种常用的方法。

Lasso回归的原理: Lasso回归通过在成本函数中引入L1正则化惩罚,将模型的复杂度考虑进来。具体来说,Lasso回归的成本函数由两部分组成:平方误差损失和L1正则化项。

成本函数 = 平方误差损失 + λ * ∑|β|

其中,平方误差损失用于衡量观测值与模型预测值之间的差距,λ是正则化参数,用于控制惩罚的强度。∑|β|表示模型系数的绝对值之和,即L1正则化惩罚项。

Lasso回归的特点: Lasso回归具有以下重要特点:

  1. 特征选择:由于Lasso回归的L1正则化惩罚项的特性,它可以将某些特征的系数缩减为零,从而实现特征选择。这意味着Lasso回归可以自动选择最重要的特征,并将无关的特征剔除出模型,从而简化模型和提高泛化能力。
  2. 稀疏性:由于Lasso回归可以将某些系数缩减为零,因此可以得到稀疏解。稀疏解意味着只有少数非零系数,可以使模型更易解释和理解。
  3. 提供可解释性:Lasso回归得到的系数可以用于解释特征与目标之间的关系。系数的符号表示特征的正负影响,而系数的大小表示特征对目标的重要性。

Lasso回归的应用: Lasso回归在许多领域都有广泛的应用,包括:

  1. 特征选择:Lasso回归可以用于选择最重要的特征,帮助减少特征空间的维度。
  2. 噪声过滤:Lasso回归可以通过将噪声特征的系数缩减为零,减少噪声对模型的影响。
  3. 经济学:Lasso回归可以用于经济学领域的变量选择和解释。
  4. 生物信息学:Lasso回归可以用于基因表达数据分析和选择相关的生物标记物。
  5. 图像处理:Lasso回归可以用于图像压缩和稀疏表示。

总结: Lasso回归是一种通过引入L1正则化惩罚来控制模型复杂度的方法。它能够实现特征选择、提供稀疏性和可解释性,并在多个领域有广泛应用。使用Lasso回归需要适当选择正则化参数λ,以平衡模型的拟合能力和泛化能力。

#load libraries
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.feature_selection import SelectFromModel
from sklearn.preprocessing import StandardScaler


# load dataset
data = pd.read_csv('/kaggle/input/house-prices-advanced-regression-techniques/train.csv')
data.shape


# In practice, feature selection should be done after data pre-processing,
# so ideally, all the categorical variables are encoded into numbers,
# and then you can assess how deterministic they are of the target

# here for simplicity I will use only numerical variables
# select numerical columns:

numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
numerical_vars = list(data.select_dtypes(include=numerics).columns)
data = data[numerical_vars]
data.shape


# separate train and test sets
X_train, X_test, y_train, y_test = train_test_split(
    data.drop(labels=['SalePrice'], axis=1),
    data['SalePrice'],
    test_size=0.3,
    random_state=0)

X_train.shape, X_test.shape



# the features in the house dataset are in very
# different scales, so it helps the regression to scale them

scaler = StandardScaler()
scaler.fit(X_train.fillna(0))


# here, again I will train a Lasso Linear regression and select
# the non zero features in one line.
# bear in mind that the linear regression object from sklearn does
# not allow for regularisation. So If you want to make a regularised
# linear regression you need to import specifically "Lasso"
# that is the l1 version of the linear regression
# alpha is the penalisation here, so I set it high in order
# to force the algorithm to shrink some coefficients

sel_ = SelectFromModel(Lasso(alpha=100))
sel_.fit(scaler.transform(X_train.fillna(0)), y_train)
sel_.get_support()
# 输出
array([False,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True, False,  True, False,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True, False,  True,
        True])
        
        
 # make a list with the selected features and print the outputs
selected_feat = X_train.columns[(sel_.get_support())]

print('total features: {}'.format((X_train.shape[1])))
print('selected features: {}'.format(len(selected_feat)))
print('features with coefficients shrank to zero: {}'.format(
    np.sum(sel_.estimator_.coef_ == 0)))

# 输出
total features: 37
selected features: 33
features with coefficients shrank to zero: 4

我们可以看到,Lasso正则化可以帮助从数据集中移除不重要的特征。因此,增加惩罚项将导致移除更多的特征。因此,我们需要注意和监控,确保不将惩罚设置得太高以至于移除了重要特征,也不将惩罚设置得太低以至于没有移除不重要的特征。

如果惩罚太高并且重要的特征被删除,我们会注意到算法性能的下降,然后意识到我们需要减少正则化。


Random Forest Importance

随机森林是最流行的机器学习算法之一。它之所以成功,是因为它提供了良好的预测性能、低过拟合和易于解释性。这种解释性是通过简单地计算每个变量对决策的贡献来实现的。

随机森林由4-1200棵决策树组成,每棵决策树都是在数据集的随机抽取的观测值和特征上构建的。并非每棵树都能看到所有特征或所有观测值,这样可以确保树之间没有相关性,从而减少过拟合的风险。每棵树都是一系列基于单个或多个特征的是非问题。在每个节点(即每个问题)处,树将数据集分成两个桶,每个桶中的观测值彼此之间更相似,与另一个桶中的观测值不同。因此,每个特征的重要性由每个桶的"纯度"来衡量。

在分类问题中,衡量纯度的方法可以是基尼不纯度或信息增益/熵。在回归问题中,衡量纯度的方法是方差。因此,在训练一棵树时,可以计算每个特征降低的纯度。特征降低纯度越多,特征就越重要。在随机森林中,可以将每个特征的纯度减少平均值作为最终的变量重要性度量。

为了更好地理解,通常在树的顶部选择的特征比在末节点选择的特征更重要,因为通常顶部的分割导致更大的信息增益。

总结: 随机森林是由多棵决策树组成的集成算法,它们通过随机抽取观测值和特征来构建。随机森林具有良好的预测性能、低过拟合和易于解释性。每个特征的重要性可以通过计算它对纯度的降低程度来确定。在随机森林中,可以通过对所有树的平均值来确定最终的变量重要性。顶部分割所选择的特征通常比末节点选择的特征更重要,因为顶部分割通常导致更大的信息增益。


关于随机森林可以简单理解如下:

随机森林是一种集成学习算法,由多个决策树组成。下面我将对随机森林的原理和操作进行更详细的介绍。

  1. 数据集抽样:
  2. 从原始数据集中随机选择一定数量的样本,可以使用重采样方法(例如自助法)或者不重复采样方法。
  3. 对于每棵决策树,还需要从特征集中随机选择一部分特征作为输入。
  4. 决策树构建:
  5. 对于每棵决策树,从抽样后的数据集中进行训练。
  6. 从根节点开始,根据选定的特征计算每个分割点的信息增益或基尼不纯度。
  7. 根据选定的分割点将数据集分成两个子集,这些子集中的数据在某种程度上类别更加纯净。
  8. 在每个子集上递归地重复以上步骤,直到达到停止条件(例如节点数据量小于阈值或树深度达到预定义值)。
  9. 最终形成一个决策树。
  10. 预测过程:
  11. 对于分类问题,通过投票的方式确定最终预测结果。每棵决策树投出的类别占比越多,最终的预测结果就越倾向于该类别。
  12. 对于回归问题,通过取决策树输出的平均值作为最终预测结果。
  13. 变量重要性:
  14. 在随机森林中,可以通过计算每个特征在决策树的分割中所带来的纯度减少量来评估其重要性。
  15. 通过对所有决策树上每个特征的重要性进行平均,得到最终的变量重要性度量。
  16. 值得注意的是,由于每棵决策树使用不同的数据子集和特征子集进行训练,因此随机森林具有很好的泛化能力和抗过拟合能力。

总结: 随机森林是一种基于决策树的集成学习算法,通过随机抽样和特征选择构建多棵决策树,并通过投票或取平均值的方式进行预测。它具有良好的预测性能、低过拟合风险和易于解释性。同时,可以通过计算特征对决策树纯度的降低量来评估变量重要性。在随机森林中,顶部分割所选择的特征通常比末节点选择的特征更重要,因为顶部分割通常导致更大的信息增益。


# Import libraries
from sklearn import preprocessing
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier


# Load dataset
df = pd.read_csv('/kaggle/input/mushroom-classification/mushrooms.csv')


# Declare feature vector and target variable
X = df.drop(['class'], axis = 1)
y = df['class']


# Encode categorical variables
X = pd.get_dummies(X, prefix_sep='_')
y = LabelEncoder().fit_transform(y)


# Normalize feature vector
X2 = StandardScaler().fit_transform(X)



# Split the dataset
X_train, X_test, y_train, y_test = train_test_split(X2, y, test_size = 0.30, random_state = 0)


# instantiate the classifier with n_estimators = 100
clf = RandomForestClassifier(n_estimators=100, random_state=0)


# fit the classifier to the training set
clf.fit(X_train, y_train)



# predict on the test set
y_pred = clf.predict(X_test)


# visualize feature importance

plt.figure(num=None, figsize=(10,8), dpi=80, facecolor='w', edgecolor='k')

feat_importances = pd.Series(clf.feature_importances_, index= X.columns)

feat_importances.nlargest(7).plot(kind='barh')

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码