机器学习精简教程之七——用scikit-learn做特征提取

12 篇文章 0 订阅
12 篇文章 0 订阅

本文转自:http://www.shareditor.com/blogshow/?blogId=58


现实世界中多数特征都不是连续变量,比如分类、文字、图像等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,因此就用到了特征提取 (特征数字化)

分类变量的特征提取

比如城市作为一个特征,那么就是一系列散列的城市标记,这类特征我们用二进制编码来表示,是这个城市为1,不是这个城市为0

比如有三个城市:北京、天津、上海,我们用scikit-learn的DictVector做特征提取,如下:

#sklearn 只能处理数字化的特征
from sklearn.feature_extraction import DictVectorizer

onehot_encoder = DictVectorizer()
instances = [{'city':'背景'},{'city':'天津'},{'city':'上海'}]#这个可以使用相同的key值city是因为它们属于不同的字典中
print(onehot_encoder.fit_transform(instances).toarray())

输出结果为:
[[ 0.  0.  1.]
 [ 0.  1.  0.]
 [ 1.  0.  0.]]

不同编码表示不同城市。

文字特征提取


文字特征无非这几种:有这个词还是没有、这个词的TF-IDF(TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆向文件频率(Inverse Document Frequency)。
第一种情况用词库表示法,如下:
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
    'UNC played Duke in basketball',
    'Duke lost the basketball game'
]
vectorizer = CountVectorizer()
print(vectorizer.fit_transform(corpus).todense())
print(vectorizer.vocabulary_)
执行后:
[[1 1 0 1 0 1 0 1]
 [1 1 1 0 1 0 1 0]]
{'unc': 7, 'played': 5, 'duke': 1, 'in': 3, 'basketball': 0, 'lost': 4, 'the': 6, 'game': 2}

数值为1表示词表中的这个词出现,为0表示未出现

词表中的数值表示单词的坐标位置

什么意思呢? 通俗的将就是将上面两个句子 拆分,去重,从0到最后一个编号,打乱,执行完这个操作对应的{'unc': 7, 'played': 5, 'duke': 1, 'in': 3, 'basketball': 0, 'lost': 4, 'the': 6, 'game': 2},然后两个句子再和打乱后的进行对比,句子中有这个词就为1,没有就为0.数字化的向量长度应该是与拆分去重后的长度一致的。

第二种情况TF-IDF表示词的重要性,如下:
from sklearn.feature_extraction.text import TfidfVectorizer

corpus = [
    'The dog ate a sandwich and I ate a sandwich',
    'The wizard transfigured a sandwich'
]
vectorizer = TfidfVectorizer(stop_words='english')
print(vectorizer.fit_transform(corpus).todense())
print(vectorizer.vocabulary_)

输出结果为:
[[ 0.75458397  0.37729199  0.53689271  0.          0.        ]
 [ 0.          0.          0.44943642  0.6316672   0.6316672 ]]
{'dog': 1, 'ate': 0, 'sandwich': 2, 'wizard': 4, 'transfigured': 3}

值最高的是第一个句子中的ate,因为它在这一个句子里出现了两次

值最低的自然是本句子未出现的单词

(这里是有点疑问的:直接去除了I and a 这样的词?? 第一个句子中sandwich也出现了两次啊,为什么ate最高呢??)

数据标准化

数据标准化就是把数据转成均值为0,方差为1的。比如对如下矩阵做标准化:
from sklearn import preprocessing
import numpy as np
X = np.array([
    [0.,0.,5.,13.,9.,1.],
    [0.,0.,13.,15.,10.,15.],
    [0.,3.,15.,2.,0.,11.]
])
print(preprocessing.scale(X))

输出结果为:
[[ 0.         -0.70710678 -1.38873015  0.52489066  0.59299945 -1.35873244]
 [ 0.         -0.70710678  0.46291005  0.87481777  0.81537425  1.01904933]
 [ 0.          1.41421356  0.9258201  -1.39970842 -1.4083737   0.33968311]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值