python机器学习库sklearn——特征提取

全栈工程师开发手册 (作者:栾鹏)
python数据挖掘系列教程

注意:特征特征提取与 特征选择 有很大的不同:前者包括将任意数据(如文本或图像)转换为可用于机器学习的数值特征。后者是将这些特征应用到机器学习中。

从字典类型加载特征

类 DictVectorizer 可用于将标准的Python字典(dict)对象列表的要素数组转换为 scikit-learn 估计器使用的 NumPy/SciPy 表示形式。

# ===========从字典类型加载特征。形成系数矩阵结构==========
from sklearn.feature_extraction import DictVectorizer
measurements = [
    {'name': 'student1', 'age': 12},
    {'boy':True, 'parents': 'baba'},
    {'size':16},
]

vec = DictVectorizer().fit(measurements)  # 定义一个加载器,后对一个字典对象提取特征。(值为数值型、布尔型的属性为单独的属性。值为字符串型的属性,形成"属性=值"的新属性)
print('提取的特征:',vec.get_feature_names())  # 查看提取的新属性
print('稀疏矩阵形式:\n',vec.transform(measurements))
print('二维矩阵形式:\n',vec.transform(measurements).toarray())

输出结果为

提取的特征: ['age', 'boy', 'name=student1', 'parents=baba', 'size']
稀疏矩阵形式:
   (0, 0)	12.0
  (0, 2)	1.0
  (1, 1)	1.0
  (1, 3)	1.0
  (2, 4)	16.0
二维矩阵形式:
 [[ 12.   0.   1.   0.   0.]
 [  0.   1.   0.   1.   0.]
 [  0.   0.   0.   0.  16.]]

类 DictVectorizer 也是对自然语言处理模型中训练序列分类器的有用的表示变换,通常通过提取围绕感兴趣的特定的词的特征窗口来工作。

如果一个文本语料库的每一个单词都提取了这样一个上下文,那么所得的矩阵将会非常宽(许多 one-hot-features),其中大部分通常将会是0。 为了使结果数据结构能够适应内存,该类DictVectorizer 的 scipy.sparse 默认使用一个矩阵而不是一个 numpy.ndarray。

文本特征提取

文本分词有个比较好的库,结巴分词,可以参考:https://blog.csdn.net/luanpeng825485697/article/details/78757563

类 CountVectorizer 在单个类中实现了 tokenization (词语切分)和 occurrence counting (出现频数统计):

# =================文本特征提取==============
from sklearn.feature_extraction.text import CountVectorizer
corpus = ['This is the first document.',
          'This is the second second document.',
          'And the third one.',
          'Is this the first document?',]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)  # 默认提取至少 包含2个字母的单词
print('所有特征:',vectorizer.get_feature_names())
print('样本特征向量:\n',X.toarray())  # X本身为稀疏矩阵存储形式,toarray转换为二维矩阵形式

print('document属性的列索引:',vectorizer.vocabulary_.get('document'))  # 从 特征 名称到矩阵的(列索引)

# 提取一个单词或两个单词形成的词组。这样就能识别“is this”和“this is”这两种词汇了
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2),token_pattern=r'\b\w+\b', min_df=1)
analyze = bigram_vectorizer.build_analyzer()
print('所有分词:',analyze('Bi-grams are cool!'))

Tf–idf 项加权

在一个大的文本语料库中,一些单词将出现很多次(例如 “the”, “a”, “is” 是英文),因此对文档的实际内容没有什么有意义的信息。 如果我们将直接计数数据直接提供给分类器,那么这些频繁词组会掩盖住那些我们关注但很少出现的词。

为了为了重新计算特征权重,并将其转化为适合分类器使用的浮点值,因此使用 tf-idf 变换是非常常见的。

Tf表示术语频率,而 tf-idf 表示术语频率乘以转制文档频率: tf-idf(t,d) = tf(t,d) × idf(t) . \text{tf-idf(t,d)}=\text{tf(t,d)} \times \text{idf(t)}. tf-idf(t,d)=tf(t,d)×idf(t).

使用 TfidfTransformer 的默认设置,TfidfTransformer(norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False) 术语频率,一个术语在给定文档中出现的次数乘以 idf 组件, 计算为

idf ( t ) = l o g 1 + n d 1 + df ( d , t ) + 1 , \text{idf}(t) = log{\frac{1 + n_d}{1+\text{df}(d,t)}} + 1, idf(t)=log1+df(d,t)1+nd+1,

其中 n_d 是文档的总数, df ( d , t ) \text{df}(d,t) df(d,t) 是包含术语 t 的文档数。 然后,所得到的 tf-idf 向量通过欧几里得范数归一化:

v n o r m = v ∣ ∣ v ∣ ∣ 2 = v v 1 2 + v 2 2 + ⋯ + v n 2 . v_{norm} = \frac{v}{||v||_2} = \frac{v}{\sqrt{v{_1}^2 + v{_2}^2 + \dots + v{_n}^2}}. vnorm=v2v=v12+v22++vn2 v.

它源于一个词权重的信息检索方式(作为搜索引擎结果的评级函数),同时也在文档分类和聚类中表现良好。

以下部分包含进一步说明和示例,说明如何精确计算 tf-idfs 以及如何在 scikit-learn 中计算 tf-idfs, TfidfTransformer 并 TfidfVectorizer 与定义 idf 的标准教科书符号略有不同

idf ( t ) = l o g n d 1 + df ( d , t ) . \text{idf}(t) = log{\frac{n_d}{1+\text{df}(d,t)}}. idf(t)=log1+df(d,t)nd.

在 TfidfTransformer 和 TfidfVectorizer 中 smooth_idf=False,将 “1” 计数添加到 idf 而不是 idf 的分母:

idf ( t ) = l o g n d df ( d , t ) + 1 \text{idf}(t) = log{\frac{n_d}{\text{df}(d,t)}} + 1 idf(t)=logdf(d,t)nd+1

# ===================Tf–idf 项加权===================
from sklearn.feature_extraction.text import TfidfTransformer
transformer = TfidfTransformer(smooth_idf=False)  # smooth_idf=False,将 “1” 计数添加到 idf 而不是 idf 的分母
# transformer = TfidfTransformer()
# 第一个特征经常出现,所以作用不大,第二个特征和第三个特征不经常出现,所以比较重要
counts = [[3, 0, 1],
          [2, 0, 0],
          [3, 0, 0],
          [4, 0, 0],
          [3, 2, 0],
          [3, 0, 2]]
tfidf = transformer.fit_transform(counts)
print('稀疏矩阵存储:\n',tfidf)
print('二维矩阵存储:\n',tfidf.toarray())
print('特征权重:',transformer.idf_)


图像特征提取

参考python中opencv的使用:https://blog.csdn.net/luanpeng825485697/article/details/79509870

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: python机器学习sklearn是一个功能强大的机器学习工具包,提供了许多机器学习算法和工具,包括分类、回归、聚类、降维、模型选择、预处理等等。它的目的是使机器学习更加简单和可重复,以便更多的人可以轻松地使用它。 sklearn的代码风格简洁明了,易于理解和使用。它也提供了许多评估指标和工具,帮助用户评估模型的性能。此外,它还支持许多常见的数据集,方便用户进行试验和研究。 总的来说,sklearn是一个非常实用的机器学习工具包,适用于各种机器学习任务。如果你是一个初学者,或者是一个经验丰富的机器学习工程师,都可以从sklearn中受益。 ### 回答2: Python机器学习sklearn是一个功能强大的开源工具,可实现各种常见和先进的机器学习任务。它通过提供简洁易用的API,使得机器学习的各个方面更加容易上手。 sklearn包含了众多的工具,包括预处理、特征提取、监督和无监督学习算法等等。其中,监督学习算法包括分类、回归和聚类。预处理工具包括缺失数据处理、数据标准化等等。而特征提取方面,sklearn支持所有流行的提取技术,如HOG、LBP和Sift等。无论从哪个角度看,sklearn都是一款强大的工具。 sklearn的优点在于它广泛的支持性。它提供了许多内置的数据集,使得机器学习工作更加容易上手。此外,sklearn还提供了许多功能强大的可视化工具,辅助开发者理解机器学习结果。 sklearn做得不足之处在于其内置算法并没有涵盖所有机器学习任务。例如,它并未支持深度学习,限制了其使用范围。另外,由于sklearn提供的是封装的算法,一定程度上降低了自定义的空间。 总而言之,sklearn是一款非常实用的机器学习工具,它在广泛的支持性、API易用性、可视化工具和算法效果上均有表现。但是,虽然它不是完美的,但它仍然是大多数机器学习项目的首选之一。 ### 回答3: Python机器学习sklearn是一个强大的工具,它提供了多种机器学习算法和工具,包括分类、回归、聚类、降维、模型选择和预处理等功能。sklearn是对其他Python数据处理,如NumPy和Pandas的补充,使得用户可以快速轻松地对数据进行一些复杂的操作。在许多数据科学和机器学习项目中,sklearn成为了一个不可或缺的工具。 sklearn主要被开发用于数据挖掘和数据分析,并被广泛应用于分类、聚类、回归和推荐系统等领域。该提供了许多流行的机器学习算法实现,如支持向量机(SVM)、K近邻(KNN)、决策树、随机森林、朴素贝叶斯等。这些算法可以应用于不同类型的数据,如数值、分类、文本、图像和语音等数据。 sklearn的另一个重要特点是它提供了许多有用的数据预处理和数据转换方法,如标准化、归一化、降维、数据合并等方法,这些方法可以使数据更适合于机器学习算法的应用。sklearn还提供了模型选择和评估的工具,如交叉验证、网格搜索和性能度量等方法,这些方法可以帮助用户有效地选择合适的算法和调整其参数。 sklearn的优点不仅在于它的功能和性能,而且在于它在Python社区的支持和贡献。由于python机器学习的社区非常活跃,因此sklearn能够获得广泛的应用和支持。此外,sklearn详细的文档和示例使得学习和使用该变得更加轻松和容易。 总之,Python机器学习sklearn是一个功能强大、易于使用和广泛应用于数据科学和机器学习项目的工具,它的优点在于其提供了众多有用的机器学习算法和工具,清晰的文档和示例以及强大的Python社区的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾讯AI架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值