机器学习--特征工程常用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}}),即:

机器学习中,特别是在文本处理和特征提取阶段,`MAX_FEATURES`是一个常见的参数,特别是在使用像scikit-learn库中的`CountVectorizer`或`TfidfVectorizer`这样的向量化工具时。这个参数控制了转换后的文档向量所包含的最多不同特征(单词或术语)的数量。 **如何设置`MAX_FEATURES`:** 1. **理解上下文**: 首先,你需要明确你的目标任务是什么。如果目标是减少计算资源消耗并提高模型速度,你可以选择较小的值;如果追求更好的信息保留,则可能需要较大的值。 2. **经验值**: 对于新手,通常可以从一个相对较大的值开始,比如几千到几万,看模型性能如何。然后逐渐减小,直到找到最优值。 3. **使用自动特征选择**: 可以使用`TfidfVectorizer`的`max_df`和`min_df`参数,它们可以帮助筛选出最常见的和不常见的词。同时,还可以用`SelectKBest`或`chi2`等方法进行特征重要性分析。 4. **交叉验证**: 使用交叉验证来评估不同`MAX_FEATURES`下的模型性能。这能帮助你找到在泛化能力上表现最好的特征数量。 5. **调整范围**: 根据数据集大小、词汇表规模以及内存限制,设置一个合理的`MAX_FEATURES`范围,例如(100, 10000) 或 (None, 自动计算)。 6. **注意稀疏性**: 当`MAX_FEATURES`接近于词汇表大小时,向量会变得非常稀疏,这可能会影响某些算法(如朴素贝叶斯)的效率。在这种情况下,考虑降低`MAX_FEATURES`以保持向量的稠密度。 **相关问题--:** 1. `MAX_FEATURES`对模型效果有何影响? 2. 如何根据数据集特点选择合适的`MAX_FEATURES`? 3. 是否总是应该尽可能大?还是有最小值建议?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值