Python 机器学习1:sklearn 特征抽取、分析

sklearn (scikit-learn) 是基于 Python 语言的机器学习工具,建立在 NumPy、SciPy 和 matplotlib 上,可在各种环境中重复使用。

import sklearn

特征抽取:对文本等数据进行特征值化,让计算机(在后续的机器学习中)更好地理解数据。

import sklearn.feature_extraction

1. 特征抽取

1.1 字典特征数据抽取

from sklearn.feature_extraction import DictVectorizer

DictVectorizer(sparse=False, ...) sparse=False返回为array数组形式,True则返回稀疏矩阵坐标和值对应的形式

DictVectorizer.fit_transform(dict) 将字典转换为特征值

DictVectorizer.inverse_transform(sparse) 给定矩阵,返回原先字典

DictVectorizer.get_feature_names() 获取特征类别名称

 流程:

1. 实例化类DictVectorizer

2. 调用fit_transform方法输入数据并转换

其中,字符串会转化为one-hot编码形式,矩阵中对应的字符串属性项为1,其他为0。

给定字典列表:

[{'city': '北京', 'aqi': 100}, {'city': '上海', 'aqi': 60}, {'city': '深圳', 'aqi': 30}]
from sklearn.feature_extraction import DictVectorizer

dict_ = DictVectorizer(sparse=False)
data = dict_.fit_transform(
    [{'city': '北京', 'aqi': 100}, {'city': '上海', 'aqi': 60}, {'city': '深圳', 'aqi': 30}])
print(dict_.get_feature_names())
print(dict_.inverse_transform(data))
print(data)

输出:

['aqi', 'city=上海', 'city=北京', 'city=深圳']
[{'aqi': 100.0, 'city=北京': 1.0}, {'aqi': 60.0, 'city=上海': 1.0}, {'aqi': 30.0, 'city=深圳': 1.0}]
[[100.   0.   1.   0.]
 [ 60.   1.   0.   0.]
 [ 30.   0.   0.   1.]]

 1.2 文本特征数据抽取

from sklearn.feature_extraction.text import CountVectorizer

CountVectorizer()

CountVectorizer.fit_transform(str_list) 将文本转换为特征值

CountVectorizer.inverse_transform(sparse) 给定矩阵,返回原先文本

CountVectorizer.get_feature_names() 获取特征类别名称

 流程:

1. 实例化类CountVectorizer

2. 调用fit_transform方法输入数据并转换

3. 利用.toarray()将返回的稀疏矩阵转换为array数组

给定文本:

["life is short, i like python python", "life is too long, i dislike python"]
from sklearn.feature_extraction.text import CountVectorizer

cv = CountVectorizer()
data = cv.fit_transform(["life is short, i like python python", "life is too long, i dislike python"])
print(cv.get_feature_names())
print(data.toarray())

输出:

['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 2 1 0]
 [1 1 1 0 1 1 0 1]]

该运算统计文章中所有的词,重复的算1次;对每篇文章,在词的列表里面进行统计每个词出现的次数;单个字母不统计。

对于中文的字符串,需要使用jieba分词

import jieba

jieba.cut("中文字符串")

返回值:词语生成器

给定中文:

"今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。"
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。"
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"
import jieba

con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 吧列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
print(c1, c2, c3)

 输出:

今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。 我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。 如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。

这样,我们就可以使用CountVectorizer进行特征值提取了。

2. TF-IDF分析问题

TF-IDF是一种针对关键词的统计分析方法,用于评估一个词对一个文件集或者一个语料库的重要程度。如果某个词在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

TF:Term Frequency 词的频率

IDF:Inverse Document Frequency逆文档频率

from sklearn.feature_extraction.text import TfidfVectorizer

TfidfVectorizer()

TfidfVectorizer.fit_transform(str_list) 将文本转换为权重矩阵

TfidfVectorizer.inverse_transform(sparse) 给定权重矩阵,返回原先文本

TfidfVectorizer.get_feature_names() 获取特征类别名称

以上个例子中的三个中文字符串为例输入:

tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())

输出:

['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']

[[0.         0.         0.21821789 0.         0.         0.
  0.43643578 0.         0.         0.         0.         0.
  0.21821789 0.         0.21821789 0.         0.         0.
  0.         0.21821789 0.21821789 0.         0.43643578 0.
  0.21821789 0.         0.43643578 0.21821789 0.         0.
  0.         0.21821789 0.21821789 0.         0.         0.        ]
 [0.         0.         0.         0.2410822  0.         0.
  0.         0.2410822  0.2410822  0.2410822  0.         0.
  0.         0.         0.         0.         0.         0.2410822
  0.55004769 0.         0.         0.         0.         0.2410822
  0.         0.         0.         0.         0.48216441 0.
  0.         0.         0.         0.         0.2410822  0.2410822 ]
 [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
  0.         0.         0.         0.         0.15698297 0.15698297
  0.         0.15698297 0.         0.15698297 0.15698297 0.
  0.1193896  0.         0.         0.15698297 0.         0.
  0.         0.15698297 0.         0.         0.         0.31396594
  0.15698297 0.         0.         0.15698297 0.         0.        ]]

数值较大的项代表这个词更重要,更具有代表性,可以对文本进行分类。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hinomoto Oniko

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

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

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

打赏作者

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

抵扣说明:

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

余额充值