sklearn学习笔记2 Feature_extraction库

1. 将字典格式的数据转换为特征

前提:数据是用字典格式存储的,通过调用DictVectorizer类可将其转换成特征,对于特征值为字符型的变量,自动转换为多个特征变量,类似前面提到的onehot编码。

In [226]: measurements = [
     ...:      {'city': 'Dubai', 'temperature': 33.},
     ...:      {'city': 'London', 'temperature': 12.},
     ...:      {'city': 'San Fransisco', 'temperature': 18.},
     ...: ]

In [227]: from sklearn.feature_extraction import DictVectorizer

In [228]: vec=DictVectorizer()

In [229]: vec.fit_transform(measurements).toarray()
Out[229]:
array([[  1.,   0.,   0.,  33.],
       [  0.,   1.,   0.,  12.],
       [  0.,   0.,   1.,  18.]])

In [230]: vec.get_feature_names()
Out[230]: ['city=Dubai', 'city=London', 'city=San Fransisco', 'temperature']


同时可以通过vec的restrict函数,直接对特征进行选择。

In [247]: from sklearn.feature_selection import SelectKBest,chi2
In [249]: z=vec.fit_transform(measurements)support = SelectKBest(chi2, k=2).fit(z, [0, 1,2])
In [250]: z.toarray()
Out[250]:array([[ 1., 0., 0., 33.], [ 0., 1., 0., 12.], [ 0., 0., 1., 18.]])
In [251]: vec.get_feature_names()
Out[251]: ['city=Dubai', 'city=London', 'city=San Fransisco', 'temperature']
In [252]: vec.restrict(support.get_support())
Out[252]:DictVectorizer(dtype=<type 'numpy.float64'>, separator='=', sort=True, sparse=True)
In [253]: vec.get_feature_names()
Out[253]: ['city=San Fransisco', 'temperature']


也可调用inverse_transform函数得到原来的值。

 

2.特征哈希

当特征取值列表很大,且有多个需onehot编码时,会导致特征矩阵很大,且有很多0,这时可用哈希函数将特征根据特征名和值映射到指定维数的矩阵。由于hash是单向函数,因此FeatureHash没有inverse_transform函数。

from sklearn.feature_extraction import FeatureHasher
h = FeatureHasher(n_features=10,input_type='dict')
D = [{'dog': 1, 'cat':2, 'elephant':4},{'dog': 2, 'run': 5}]
f = h.transform(D)
f.toarray()
array([[ 0.,  0., -4., -1.,  0.,  0.,  0.,  0.,  0.,  2.],
       [ 0.,  0.,  0., -2., -5.,  0.,  0.,  0.,  0.,  0.]])


3.文本处理

(1)count

语料库中的单词作为特征,文档中该单词出现的数目作为特征值。

In [1]: from sklearn.feature_extraction.text import CountVectorizer

In [2]: vec=CountVectorizer()

In [3]: vec
Out[3]:
CountVectorizer(analyzer=u'word', binary=False, decode_error=u'strict',
        dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content'
        lowercase=True, max_df=1.0, max_features=None, min_df=1,
        ngram_range=(1, 1), preprocessor=None, stop_words=None,
        strip_accents=None, token_pattern=u'(?u)\\b\\w\\w+\\b',
        tokenizer=None, vocabulary=None)

In [4]: corpus = [
   ...:     'This is the first document.',
   ...:     'This is the second second document.',
   ...:     'And the third one.',
   ...:     'Is this the first document?',
   ...: ]

In [5]: X=vec.fit_transform(corpus)

In [6]: X.toarray()
Out[6]:
array([[0, 1, 1, 1, 0, 0, 1, 0, 1],
       [0, 1, 0, 1, 0, 2, 1, 0, 1],
       [1, 0, 0, 0, 1, 0, 1, 1, 0],
       [0, 1, 1, 1, 0, 0, 1, 0, 1]], dtype=int64)


 

也可用ngram作为词袋,通过参数ngram_range指定。

In [21]: bigram_vec=CountVectorizer(ngram_range=(1,3),token_pattern=r'\b\w+\b'
    ...: min_df=1)

In [22]: bigram_vec.fit_transform(corpus).toarray()
Out[22]:
array([[0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0,
        0, 0, 0, 0, 1, 1, 1, 0, 0],
       [0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 2, 1, 1, 1, 1, 0, 0, 1, 1,
        0, 0, 0, 0, 1, 1, 1, 0, 0],
       [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
        1, 1, 1, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0,
        0, 0, 0, 0, 1, 0, 0, 1, 1]], dtype=int64)

In [23]: analyze=bigram_vec.build_analyzer()

In [24]: analyze('hello a b c')
Out[24]:
[u'hello',
 u'a',
 u'b',
 u'c',
 u'hello a',
 u'a b',
 u'b c',
 u'hello a b',
 u'a b c']


对字符编码的识别问题,可看下chardet模块

(2)稀疏矩阵转换

HashTransformerHashVectorizer=CountVectorizer+HashTransfomer

 

参考:

http://scikit-learn.org/stable/modules/feature_extraction.html#feature-extraction

### 回答1: 我可以教你关于sklearn.feature_extraction.text的一些基本知识。它是一种用于从文本数据中提取特征的工具,可以帮助你更好地理解文本。sklearn.feature_extraction.text 是 scikit-learn 中用于提取文本特征的模块。该模块提供了用于从文本数据中提取特征的工具,以便可以将文本数据用于机器学习模型中。 该模块中的主要类是 CountVectorizer 和 TfidfVectorizer。CountVectorizer 可以将文本数据转换为词频矩阵,其中每个行表示一个文档,每个列表示一个词汇,每个元素表示该词汇在该文档中出现的次数。而 TfidfVectorizer 可以将文本数据转换为 tf-idf 矩阵,其中每个行表示一个文档,每个列表示一个词汇,每个元素表示该词汇在该文档中的 tf-idf 值。 这些特征提取器可以使用 fit_transform 方法将训练数据转换为特征矩阵,并使用 transform 方法将测试数据转换为相同的特征矩阵。此外,它们还提供了一些参数来控制特征提取的行为,例如停用词过滤、词汇大小写转换等。 ### 回答2: sklearn.feature_extraction.text是Python机器学习scikit-learn中的一个模块,主要用于文本特征提取。在自然语言处理领域,文本数据的预处理常常包括分词、去除停用词、词干提取等步骤,这些操作都是为了获得对文本语义内容有意义的特征。 sklearn.feature_extraction.text提供了基于Bag-of-Words的特征提取,即将一段文本转化为一组离散的特征,每个特征都表示文本中的一个单词或短语。具体来说,sklearn.feature_extraction.text提供了CountVectorizer和TfidfVectorizer两个类,分别用于计算文本的词频和词频-逆文档频(TF-IDF)。 CountVectorizer是一个简单的计数器,它根据每个文本数据中单词出现的频率将其表示为数值向量。并且在文本的数值化前,可以对文本进行词干提取和去除停用词的操作。为了避免出现由于文本长度限制而导致数值向量之间不可比的问题,可以通过归一化或者是用因子权重作为数值向量的表示。 TfidfVectorizer考虑到了每个单词在文集中的出现频率,将每个单词的权重值计算出来,其计算公式是:单词出现次数/单词整个文本集出现的次数与单词在文档中出现的词数/文档的总词数的积。该类可以设定tf-idf计算中对文本进行处理的选项,例如去除停用词和词根还原等功能。 这些特征提取器可以与许多不同类型的学习算法一起使用,例如基于神经网络的深度学习算法、基于树的决策算法(例如随机森林),以及许多其他标准学习算法(例如逻辑回归,支持向量机)等。在文本分类,情感分析,主题建模等任务中,sklearn.feature_extraction.text是一个强大的特征提取工具,在NLP领域,其应用广泛,为文本数据预处理提供了高性能和方便的解决方案。 ### 回答3: Scikit-learn是Python中最受欢迎的机器学习之一。sklearn.feature_extraction.text是scikit-learn中一个文本特征提取的模块,该模块提供了各种表示文本特征的方法,以便于机器学习算法能够使用这些文本数据。 在文本分类等应用中,将文本转化为数值特征是很重要的,因为很多机器学习算法不能直接对文本数据进行操作。sklearn.feature_extraction.text模块提供了以下几个重要的功能: 1. CountVectorizer:将文本转化为词频矩阵。通过CountVectorizer我们可以将文本中词语的出现次数作为特征值,这些特征可以用于之后的文本分类、聚类等任务中。 2. TfidfVectorizer:将文本转化为TF-IDF特征矩阵。TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于资讯检索与文本挖掘的常用加权技术。TF IDF体现了词语在文本集合中的重要程度,就是该词语的重要程度与其在文本中出现的频率成反比。 3. HashingVectorizer:该函数实现了一个基于哈希的文本特征提取器,它依赖于单哈希技巧而非字符串hashing技巧。 4. strip_accents:这个函数用来去除掉一些英文文本中的重音符号。在某些处理文本的任务中,若是忽略重音符号,则可能会把两个本意不同的单词算作同一个单词,所以会影响算法分类结果。 以上功能之间可以相互配合,在引入文本数据的过程中根据具体的要求选择其中的一种或几种来提取文本数据特征。sklearn.feature_extraction.text将帮助我们在自然语言处理和文本挖掘等领域中更好地实现特征提取,提高机器学习模型的准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值