机器学习--特征工程常用API

1. DictVectorizer - 字典特征提取

DictVectorizer 是一个用于将字典(如Python中的字典对象)转换为稀疏矩阵的工具,常用于处理类别型特征。

DictVectorizer(sparse=True, sort=True, dtype=<class 'numpy.float64'>)
  • 参数:
    • sparse:布尔值,默认值为 True。如果为 True,输出是稀疏矩阵;如果为 False,输出是密集的Numpy数组。
    • sort
      当 sort=True 时,特征名称按字母顺序排序。
      当 sort=False 时,特征名称的顺序是其在字典中首次出现的顺序。
    • dtype:输出数据类型,默认为 numpy.float64

2. CountVectorizer - 文本特征提取

CountVectorizer 是一种用于将文本数据转换为词频向量的工具。

  • 主要参数:
    • max_df:浮点数或整数,表示在文档中出现频率超过这个比例(浮点数)或超过这个绝对次数(整数)的词语将被忽略,默认值为 1.0
    • min_df:浮点数或整数,表示在文档中出现频率低于这个比例(浮点数)或低于这个绝对次数(整数)的词语将被忽略,默认值为 1
    • max_features:整数,选择出现频率最高的 max_features 个特征。
    • stop_words:字符串或列表,指定忽略的停用词,可以选择 'english' 或自定义停用词列表。
    • ngram_range:元组,表示词组的范围,如 (1, 2) 表示一元词和二元词。
    • binary:布尔值,是否只考虑词是否出现(即词频为1还是0),默认值为 False
from sklearn.feature_extraction.text import CountVectorizer

# 示例文本数据
corpus = [
    'This is the first document.',
    'This document is the second document.',
    'And this is the third one.',
    'Is this the first document?',
]

# 初始化CountVectorizer
vectorizer = CountVectorizer(stop_words=["you","this"])

# 转换为词频向量
X = vectorizer.fit_transform(corpus)#得到稀疏矩阵

# 输出特征名称和词频向量
print(vectorizer.get_feature_names_out())
print(X.toarray())#转换为矩阵
print(X)

结果:

['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third']
[[0 1 1 1 0 0 1 0]
 [0 2 0 1 0 1 1 0]
 [1 0 0 1 1 0 1 1]
 [0 1 1 1 0 0 1 0]]
  (0, 3)	1
  (0, 6)	1
  (0, 2)	1
  (0, 1)	1
  (1, 3)	1
  (1, 6)	1
  (1, 1)	2
  (1, 5)	1
  (2, 3)	1
  (2, 6)	1
  (2, 0)	1
  (2, 7)	1
  (2, 4)	1
  (3, 3)	1
  (3, 6)	1
  (3, 2)	1
  (3, 1)	1

2.1 中文文本提取

  • jieba 是一个广泛使用的中文分词库,适用于中文文本处理和特征提取。jieba 提供了高效的中文分词功能,可以帮助将中文文本转换为词语列表,从而用于机器学习模型和文本分析。

安装 jieba

你可以通过以下命令安装 jieba

pip install jieba

基本用法

以下是一些使用 jieba 进行中文文本提取的常见操作示例:

1. 基础分词
import jieba

# 示例文本
text = "我爱自然语言处理"

# 使用jieba进行分词
words = jieba.cut(text)

# 输出分词结果
print("/ ".join(words))
2. 精确模式和全模式
  • 精确模式:试图将句子最精确地切开,适合文本分析。
  • 全模式:将句子中所有可能的词语都找出来,适合用于词云展示等。
import jieba

# 示例文本
text = "我爱自然语言处理"

# 精确模式
words = jieba.cut(text, cut_all=False)
print("精确模式: " + "/ ".join(words))

# 全模式
words = jieba.cut(text, cut_all=True)
print("全模式: " + "/ ".join(words))

结果:

精确模式:// 自然语言/ 处理
全模式:// 自然/ 自然语言/ 语言/ 处理
3. 关键词提取

jieba 还提供了关键词提取功能,基于 TF-IDF 算法或者 TextRank 算法。需要额外安装 jiebajieba.analyse 模块。

import jieba.analyse

# 示例文本
text = "我爱自然语言处理。自然语言处理是计算机科学领域和人工智能领域中的一个重要方向。"

# 提取关键词
keywords = jieba.analyse.extract_tags(text, topK=5, withWeight=False)

print("关键词: " + "/ ".join(keywords))

结果:

关键词: 自然语言/ 领域/ 处理/ 计算机科学/ 人工智能
4. 自定义词典

如果你有一些专有名词或者行业术语,jieba 允许你使用自定义词典来提高分词的准确性。

import jieba

# 加载自定义词典
jieba.load_userdict('userdict.txt')

# 示例文本
text = "我在腾讯工作"

# 使用自定义词典进行分词
words = jieba.cut(text)
print("/ ".join(words))

自定义词典 userdict.txt 的格式如下:

腾讯 10 n

其中,每行包含一个词汇,词汇后面的数字表示词频(可选),词性(可选)。

3. TfidfVectorizer - TF-IDF文本特征提取

TfidfVectorizer 用于计算词语的TF-IDF(词频-逆文档频率)特征,衡量词语在文档中的重要性。
TfidfVectorizerscikit-learn 提供的一个工具,用于将文本数据转换为 TF-IDF 特征矩阵。TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本特征表示方法,用于衡量词语在文档中的重要性。下面是 TfidfVectorizer 的工作原理及其详细解释:

TF-IDF 原理

  1. Term Frequency (TF)

    • 定义:词频,衡量词语在某个文档中出现的频率。
      在这里插入图片描述

    • 解释:词频越高,说明该词在该文档中越重要。

  2. Inverse Document Frequency (IDF)

    • 定义:逆文档频率,衡量词语在所有文档中出现的稀有程度。
      在这里插入图片描述

    • 解释:出现频率较低的词语(即少数文档中出现的词语)会有较高的 IDF 值,从而提高其在文档中的权重。

  3. TF-IDF Score

    • 定义:词语在文档中的 TF-IDF 权重,结合了词频和逆文档频率。
      在这里插入图片描述

    • 解释:通过 TF-IDF 评分,重要的词语(即在该文档中频繁出现而在其他文档中不常见的词语)会得到较高的权重。

  • 主要参数:

    • max_df:同 CountVectorizer
    • min_df:同 CountVectorizer
    • max_features:同 CountVectorizer
    • stop_words:同 CountVectorizer
    • ngram_range:同 CountVectorizer
    • use_idf:布尔值,是否启用逆文档频率(IDF)加权,默认值为 True
    • smooth_idf:布尔值,是否加1平滑IDF,默认值为 True
    • norm:字符串,表示归一化方法,'l1''l2',默认值为 'l2'
  • 适用场景:适用于文本数据中特征词重要性分析,更适合文本分类任务。

代码示列:

from sklearn.feature_extraction.text import TfidfVectorizer

# 示例文本数据
corpus = [
    'This is the first document.',
    'This document is the second document.',
    'And this is the third one.',
    'Is this the first document?',
]

# 初始化TfidfVectorizer
vectorizer = TfidfVectorizer()

# 转换为TF-IDF特征向量
X = vectorizer.fit_transform(corpus)

# 输出特征名称和TF-IDF向量
print(vectorizer.get_feature_names_out())
print(X.toarray())

结果:

['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third' 'this']
[[0.         0.46979139 0.58028582 0.38408524 0.         0.
  0.38408524 0.         0.38408524]
 [0.         0.6876236  0.         0.28108867 0.         0.53864762
  0.28108867 0.         0.28108867]
 [0.51184851 0.         0.         0.26710379 0.51184851 0.
  0.26710379 0.51184851 0.26710379]
 [0.         0.46979139 0.58028582 0.38408524 0.         0.
  0.38408524 0.         0.38408524]]

4. MinMaxScaler - 归一化

MinMaxScaler 将特征缩放到给定的最小值和最大值之间,通常是缩放到 [0, 1]
MinMaxScaler 是一种常用的数据预处理方法,其主要目的是将数据的特征缩放到指定的范围(通常是 ([0, 1]))。这样做的目的是为了消除不同特征值之间量级上的差异,从而避免因不同特征值的范围差异对模型训练产生不良影响。

MinMaxScaler的数学原理

假设我们有一个一维的特征向量 (X = {x_1, x_2, \dots, x_n}),其中每个 (x_i) 表示第 (i) 个样本的特征值。

1. 计算原始数据的最小值和最大值

首先,找到特征向量 (X) 中的最小值 (X_{\text{min}}) 和最大值 (X_{\text{max}}),即:
X min = min ⁡ ( X ) X max = max ⁡ ( X ) X_{\text{min}} = \min(X) X_{\text{max}} = \max(X) Xmin=min(X)Xmax=max(X)

2. 应用缩放公式

接下来,使用以下公式将每个数据点 (x_i) 映射到目标范围 ([a, b]) 中(默认为 ([0, 1])):
x i ′ = x i − X min X max − X min × ( b − a ) + a x_i' = \frac{x_i - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}} \times (b - a) + a xi=XmaxXminxiXmin×(ba)+a

  • (x_i’) 是缩放后的值。
  • (a) 和 (b) 是目标范围的下限和上限,默认是 (a = 0) 和 (b = 1)。
  • (X_{\text{min}}) 和 (X_{\text{max}}) 分别是原始数据的最小值和最大值。
3. 线性变换过程

公式中的变换可以分为两个步骤:

  • 标准化:先减去最小值,然后除以原始数据的范围(最大值减去最小值),即:
    x i ∗ = x i − X min X max − X min x_i^* = \frac{x_i - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}} xi=XmaxXminxiXmin
    这一步骤将 (x_i) 变换到 ([0, 1]) 的范围内。

  • 线性扩展:将标准化后的值 (x_i^
    $$
    扩展到目标范围 (a, b):

    x_i’ = x_i^* \times (b - a) + a
    $$
    这一步将数据映射到我们希望的范围内。

示例详解

假设有一个简单的数据集: X = [2, 4, 6, 8, 10] ,目标范围是 ([0, 1])。

  1. 计算 ( X_{\text{min}} = 2 ) 和 ( X_{\text{max}} = 10 )。

  2. 使用公式计算每个 ( x_i ) 的缩放值 ( x_i’ ):

    • 对于 ( x = 2 ):
      x ′ = 2 − 2 10 − 2 × ( 1 − 0 ) + 0 = 0 x' = \frac{2 - 2}{10 - 2} \times (1 - 0) + 0 = 0 x=10222×(10)+0=0

    • 对于 ( x = 4 ):
      x ′ = 4 − 2 10 − 2 × ( 1 − 0 ) + 0 = 0.25 x' = \frac{4 - 2}{10 - 2} \times (1 - 0) + 0 = 0.25 x=10242×(10)+0=0.25

    • 对于 ( x = 6 ):
      x ′ = 6 − 2 10 − 2 × ( 1 − 0 ) + 0 = 0.5 x' = \frac{6 - 2}{10 - 2} \times (1 - 0) + 0 = 0.5 x=10262×(10)+0=0.5

    • 对于 ( x = 8 ):
      x ′ = 8 − 2 10 − 2 × ( 1 − 0 ) + 0 = 0.75 x' = \frac{8 - 2}{10 - 2} \times (1 - 0) + 0 = 0.75 x=10282×(10)+0=0.75

    • 对于 ( x = 10 ):
      x ′ = 10 − 2 10 − 2 × ( 1 − 0 ) + 0 = 1 x' = \frac{10 - 2}{10 - 2} \times (1 - 0) + 0 = 1 x=102102×(10)+0=1

转换后的数据集为 ([0, 0.25, 0.5, 0.75, 1])。

  • 主要参数:

    • feature_range:元组,表示缩放后的特征范围,默认值为 (0, 1)
    • clip:布尔值,是否将数据截断到指定范围内,默认值为 False
  • 适用场景:适用于需要将特征值缩放到相同范围的情况,特别是当模型对特征的范围敏感时,如在神经网络中。

代码示列:

from sklearn.preprocessing import MinMaxScaler

# 示例数据
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]

# 初始化MinMaxScaler
scaler = MinMaxScaler()

# 转换数据
scaled_data = scaler.fit_transform(data)

# 输出归一化后的数据
print(scaled_data)

结果:

[[0.   0.  ]
 [0.25 0.25]
 [0.5  0.5 ]
 [1.   1.  ]]

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. StandardScaler - 标准化

StandardScaler 将特征进行标准化,使其均值为0,方差为1。

  • 主要参数:

    • with_mean:布尔值,是否将特征均值设为0,默认值为 True
    • with_std:布尔值,是否将特征方差设为1,默认值为 True
  • 适用场景:适用于需要将特征缩放到标准正态分布的场景,常用于线性模型和基于距离的模型。
    代码示列:

from sklearn.preprocessing import StandardScaler

# 示例数据
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]

# 初始化StandardScaler
scaler = StandardScaler()

# 转换数据
scaled_data = scaler.fit_transform(data)

# 输出标准化后的数据
print(scaled_data)

结果:

[[-1.18321596 -1.18321596]
 [-0.50709255 -0.50709255]
 [ 0.16903085  0.16903085]
 [ 1.52127766  1.52127766]]

StandardScaler 是一种常用的数据预处理方法,其主要目的是对数据进行标准化处理,使得数据的均值为0,标准差为1。通过标准化,StandardScaler 可以消除不同特征之间的量纲差异,并且使数据更适合于一些基于距离度量的机器学习算法,如SVM、KNN等。

StandardScaler的数学原理

StandardScaler 的标准化过程涉及两个步骤:

  1. 中心化:将数据的均值调整为0。
  2. 缩放:将数据的标准差调整为1。

对于一个给定的数据集
X = { x 1 , x 2 , … , x n } X = \{x_1, x_2, \dots, x_n\} X={x1,x2,,xn}
(假设这里的数据是单个特征的值),StandardScaler 的标准化公式如下:

x i ′ = x i − μ σ x_i' = \frac{x_i - \mu}{\sigma} xi=σxiμ
其中:

  • $$
    • x_i 是原始数据中的某个数据点。
    • \mu 是原始数据的均值。
    • \sigma 是原始数据的标准差。
    • x_i’ 是标准化后的数据。
      $$

步骤 1:计算均值和标准差

1. 计算均值

μ \mu μ

均值 μ 是所有数据点的平均值,可以通过以下公式计算: μ = 1 n ∑ i = 1 n x i 均值 \mu 是所有数据点的平均值,可以通过以下公式计算: \mu = \frac{1}{n} \sum_{i=1}^{n} x_i 均值μ是所有数据点的平均值,可以通过以下公式计算:μ=n1i=1nxi

2.

计算标准差 σ 计算标准差 \sigma 计算标准差σ

标准差 σ 是数据点到均值的平均偏离程度的平方根,可以通过以下公式计算: σ = 1 n ∑ i = 1 n ( x i − μ ) 2 标准差 \sigma 是数据点到均值的平均偏离程度的平方根,可以通过以下公式计算: \sigma = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (x_i - \mu)^2} 标准差σ是数据点到均值的平均偏离程度的平方根,可以通过以下公式计算:σ=n1i=1n(xiμ)2

步骤 2:应用标准化公式

计算出均值 μ 和标准差 σ 之后,对每个数据点 x i 使用以下公式进行标准化处理: x i ′ = x i − μ σ 计算出均值 \mu 和标准差 \sigma 之后,对每个数据点 x_i 使用以下公式进行标准化处理: x_i' = \frac{x_i - \mu}{\sigma} 计算出均值μ和标准差σ之后,对每个数据点xi使用以下公式进行标准化处理:xi=σxiμ

6. VarianceThreshold - 底方差过滤降维

VarianceThreshold 是一种简单的特征选择方法,通过移除方差低于某个阈值的特征来进行降维。

4.底方差过滤(Variance Thresholding)的数学原理可以通过以下几个步骤详细解释:

1. 方差定义

方差是用来衡量数据分布的离散程度的统计量。对于给定的特征 X (假设是一个向量),其方差 σ 2 可以通过以下公式计算: 方差是用来衡量数据分布的离散程度的统计量。对于给定的特征 X (假设是一个向量),其方差 \sigma^2 可以通过以下公式计算: 方差是用来衡量数据分布的离散程度的统计量。对于给定的特征X(假设是一个向量),其方差σ2可以通过以下公式计算:

σ X 2 = 1 N ∑ i = 1 N ( x i − x ˉ ) 2 \sigma^2_X = \frac{1}{N} \sum_{i=1}^{N} (x_i - \bar{x})^2 σX2=N1i=1N(xixˉ)2

其中:

  • $$
    • N 是样本的总数,
    • x_i 是特征 X 的第 i 个样本,
    • \bar{x} 是特征 X 的均值。
      $$

2. 方差计算过程

假设我们有一个数据矩阵 X (大小为 m × n ,其中 m 是样本数, n 是特征数),我们可以对每一个特征列 X j 计算方差。对于特征 X j ,其方差可以表示为 假设我们有一个数据矩阵 X (大小为 m \times n ,其中m是样本数,n是特征数),我们可以对每一个特征列 X_j 计算方差。对于特征X_j,其方差可以表示为 假设我们有一个数据矩阵X(大小为m×n,其中m是样本数,n是特征数),我们可以对每一个特征列Xj计算方差。对于特征Xj,其方差可以表示为

σ X j 2 = 1 m ∑ i = 1 m ( X i j − X j ˉ ) 2 \sigma^2_{X_j} = \frac{1}{m} \sum_{i=1}^{m} (X_{ij} - \bar{X_j})^2 σXj2=m1i=1m(XijXjˉ)2
其中:

  • $$
    • X_{ij}是第i个样本的第j个特征值,
    • \bar{X_j}是第j个特征的均值。
      $$

3. 设置方差阈值

为了进行特征选择,我们需要设置一个方差阈值 ( \tau )。这个阈值可以是固定的,也可以根据数据集的统计特性(例如方差的均值或标准差)来设定。常见的选择方法包括:

  • 选择一个绝对阈值,例如
    τ = 0.01 \tau = 0.01 τ=0.01

  • 选择一个相对阈值,例如选取方差在所有特征方差中的某个百分位(如前 50%)。

  • 主要参数:

    • threshold:浮点数,表示方差阈值,默认值为 0.0(即移除所有方差为零的特征)。
  • 适用场景:适用于删除对模型贡献较小的低方差特征,通常是为了减少噪音和维度。
    代码示列:

import numpy as np
from sklearn.feature_selection import VarianceThreshold

# 创建一个示例数据集 (m样本, n特征)
X = np.array([
    [1, 2, 3, 4],
    [2, 2, 3, 4],
    [3, 2, 3, 4],
    [4, 2, 3, 4]
])

print("原始数据集:")
print(X)

# 设置方差阈值 (0.1)
threshold = 0.1

# 初始化 VarianceThreshold 对象
selector = VarianceThreshold(threshold=threshold)

# 拟合并转换数据
X_reduced = selector.fit_transform(X)

print("\n经过底方差过滤后的数据集:")
print(X_reduced)
结果:
原始数据集:
[[1 2 3 4]
 [2 2 3 4]
 [3 2 3 4]
 [4 2 3 4]]

经过底方差过滤后的数据集:
[[1]
 [2]
 [3]
 [4]]

7. PCA - 主成分分析降维

  • 主成分分析(Principal Component Analysis, PCA)是一种用于降维的线性变换方法,主要目的是通过构造一组新的变量(称为主成分),这些主成分是原始数据中方差最大的方向上的线性组合。PCA可以最大限度地保留数据的方差信息,同时减少数据的维度,通过线性变换将高维数据映射到低维空间,同时尽量保留数据的方差。。

  • 主要参数:

    • n_components:整数或浮点数,指定保留的主成分数。如果是浮点数,则表示保留的方差比例。如果未指定,则保留所有成分。
    • whiten:布尔值,是否将成分向量标准化为单位方差,默认值为 False
    • svd_solver:字符串,指定奇异值分解的算法,可以选择 'auto''full''arpack'、或 'randomized'
    • tol:浮点数,svd_solver=’arpack’时使用的容差,默认值为 0.0
    • random_state:整数或 None,指定随机数生成器的种子。
  • 适用场景:适用于数据降维、去噪和可视化,同时保留数据的主要信息。

import numpy as np
from sklearn.decomposition import PCA
data = np.array([
    [2.5, 2.4],
    [0.5, 0.7],
    [2.2, 2.9],
    [1.9, 2.2],
    [3.1, 3.0],
    [2.3, 2.7],
    [2, 1.6],
    [1, 1.1],
    [1.5, 1.6],
    [1.1, 0.9]
])

# 初始化PCA并指定主成分数
pca = PCA(n_components=2)

# 降维
reduced_data = pca.fit_transform(data)

print("降维后的数据:\n", reduced_data)
  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值