机器学习-特征工程和文本特征提取

机器学习-特征工程和文本特征提取

数据集

  1. scikit-learn :数据量小,方便学习
  2. kaggle: 大数据竞赛平台,真实数据,数据量巨大
  3. UCI:收录了360个数据集,覆盖科学、生活、经济等领域,数据量几十万

常用数据集数据的结构组成:特征值+目标值

特征工程

特征工程是什么

​ 将原始数据转换为更好的代表预测模型的潜在问题的特征的过程,从而提高了对未知数据预测的准确性

特征工程的意义

​ 直接影响预测结果

scikit-learn工具

  • python语言机器学习工具
  • 包含很多机器学习算法的实现
  • 文档完善,容易上手
  • 稳定版本0.19

数据的特征抽取

sklearn特征抽取API:sklearn.feature_extraction
  • 对字典进行特征抽取
  • 把字典中的一些类别数据,分别转化为特征
  • 类: sklearn.feature_extraction.DictVectorizer
  • 处理完了之后默认返回sparse矩阵格式,为了节约内存,方便读取处理
  • 数组形式,有类别的特征,先要转换为字典数据
one-hot编码:

​ 把类别抽取成one-hot编码防止错乱

英文文本特征抽取

作用:对文本数据进行特征值化

类: sklearn.feature_extraction.text.CountVectorizer

CountVectorizer()

返回词频矩阵

​ CountVectorizer.fit_transform(X)
​ X:文本或者包含文本字符串的可迭代对象

​ 返回值:返回sparse矩阵

​ CountVectorizer.inverse_transform(X)
​ X:array数组或者sparse矩阵

​ 返回值:转换之前数据形式

​ CountVectorizer.get_feature_names()

	返回值:单词列表

代码实例如下:

#特征抽取

#导入包
from sklearn.feature_extraction.text import CountVectorizer

#实例化CountVectorizer
vector=CountVectorizer()

#调用fit_transform进行并转换数据
res=vector.fit_transform(["Life is short,i like python","life is too long,i dislike python"])

#打印结果
print(vector.get_feature_names()) #打印特征值 统计文章中出现的词

print(res.toarray()) #对每篇文章进行统计每个词出现的次数
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

注意: 单个字母不统计,因为单个字母的词没有分类标准,这也可以反映出,文本分析的一个应用就是分析文章的感情倾向。

字典特征抽取

作用:对字典数据进行特征值化

类:sklearn.feature_extraction.CountVectorizer

DictVectorizer(sparse=True,…)

​ DictVectorizer.fit_transform(X)
​ X:字典或者包含字典的迭代器
​ 返回值:返回sparse矩阵

​ DictVectorizer.inverse_transform(X)
​ X:array数组或者sparse矩阵
返回值:转换之前数据格式

​ DictVectorizer.get_feature_names()
​ 返回类别的名称

​ DictVectorize.transform(X)
​ 按照原先的标准转换

实例说明:

from sklearn.feature_extraction import DictVectorizer
 
 
def dictverc():
    """
    字典数据抽取
    """
    
    # 实例化
    dict = DictVectorizer()
    
    # 调用fit_transform 返回sparse距阵
    data = dict.fit_transform(
        [{'city': u'beijing', 'temperature': 100}, {'city': u'shanghai', 'temperature': 90}, {'city':u 'qingdao', 'temperature': 80}]);
    
    # 输出
    print(data)
    print(dict.get_feature_names()) #返回类别的名称
    print(dict.inverse_transform(data)) #转换之前的数据格式
    
    
if __name__=="__main":
    dictverc()
  (0, 0)        1.0
  (0, 3)        100.0
  (1, 2)        1.0
  (1, 3)        90.0
  (2, 1)        1.0
  (2, 3)        80.0
['city=beijing', 'city=qingdao', 'city=shanghai', 'temperature']
[{'city=beijing': 1.0, 'temperature': 100.0}, {'city=shanghai': 1.0, 'temperature': 90.0}, {'city=qingdao': 1.0, 'temperature': 80.0}]

中文的文本特征抽取

jieba分词

import jieba

返回值:词语生成器

代码实例说明

from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cutword():
    """
     分词后的字符串结果
    :return: c1,c2,c3
    """
    
    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)
 
    return c1,c2,c3


def hanzivec():
    """
    中文特征值化:
    :return: None
    """
    
    # 调用分词分割中文文章
    c1,c2,c3=cutword()
    
    print("分词结果:",c1,c2,c3)
    
    # 实例化
    cv = CountVectorizer()
    
    data = cv.fit_transform([c1,c2,c3])
    
    #打印结果
    print(data)
    print(cv.get_feature_names()) #打印特征值 统计文章中出现的词
    print(data.toarray()) #对每篇文章进行统计每个词出现的次数
    return None

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



  (0, 20)       1
  (0, 2)        1
  (0, 27)       1
  (0, 19)       1
  (0, 24)       1
  (0, 14)       1
  (0, 31)       1
  (0, 32)       1
  (0, 12)       1
  (0, 22)       2
  (0, 26)       2
  (0, 6)        2
  (1, 34)       1
  (1, 17)       1
  (1, 35)       1
  (1, 9)        1
  (1, 3)        1
  (1, 8)        1
  (1, 7)        1
  (1, 23)       1
  (1, 28)       2
  (1, 18)       3
  (2, 33)       1
  (2, 15)       1
  (2, 10)       1
  (2, 30)       1
  (2, 13)       1
  (2, 29)       2
  (2, 1)        1
  (2, 5)        3
  (2, 25)       1
  (2, 4)        4
  (2, 21)       1
  (2, 0)        1
  (2, 11)       1
  (2, 16)       1
  (2, 18)       1
  
  
  
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']



[[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
 [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
 [1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]

单个词不会被统计在内

tf-idf分析问题

TF:term frequency:词的频率 出现的次数

idf: inverse document frequency 逆文档频率 log(总文档数量/该词出现的文档数)

log(数值):输入的数值越小,结果越小

反应的是重要性的程度

TF-IDF的主要思想是: 如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其他一份文件的重要程度。

类: sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer(stop_words=None,…)
​ 返回词的权重矩阵

​ tfidfVectorizer.fit_transform(X)
​ X:文本或者包含文本字符串的可迭代对象

​ 返回值:返回sparse矩阵

​ tfidfVectorizer:inverse_transform(X)
​ X:array数组或者sparse矩阵

​ 返回值:转换之前数据形式

​ tfidfVectorizer.get_feature_names()

​ 返回值:单词列表

代码实例如下:

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba


def cutword():
    """
     分词后的字符串结果
    :return: c1,c2,c3
    """
    
    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)
 
    return c1,c2,c3


def tfidfvec():
    """
    中文特征值化
    :return: None
    """
    
    # 调用分词分割中文文章
    c1, c2, c3 = cutword()
    
    print(c1, c2, c3)
    
    # 实例化
    tf= TfidfVectorizer()
    
    data = tf.fit_transform([c1,c2,c3])
    
    #打印结果
    print(data)
    print(tf.get_feature_names()) #打印特征值 统计文章中出现的词
    print(data.toarray()) #对每篇文章进行统计每个词出现的次数
    
    return None


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



  (0, 6)        0.43643578047198467
  (0, 26)       0.43643578047198467
  (0, 22)       0.43643578047198467
  (0, 12)       0.21821789023599233
  (0, 32)       0.21821789023599233
  (0, 31)       0.21821789023599233
  (0, 14)       0.21821789023599233
  (0, 24)       0.21821789023599233
  (0, 19)       0.21821789023599233
  (0, 27)       0.21821789023599233
  (0, 2)        0.21821789023599233
  (0, 20)       0.21821789023599233
  (1, 18)       0.5500476874707073
  (1, 28)       0.482164405401355
  (1, 23)       0.2410822027006775
  (1, 7)        0.2410822027006775
  (1, 8)        0.2410822027006775
  (1, 3)        0.2410822027006775
  (1, 9)        0.2410822027006775
  (1, 35)       0.2410822027006775
  (1, 17)       0.2410822027006775
  (1, 34)       0.2410822027006775
  (2, 18)       0.11938959557761185
  (2, 16)       0.15698297076974738
  (2, 11)       0.15698297076974738
  (2, 0)        0.15698297076974738
  (2, 21)       0.15698297076974738
  (2, 4)        0.6279318830789895
  (2, 25)       0.15698297076974738
  (2, 5)        0.47094891230924213
  (2, 1)        0.15698297076974738
  (2, 29)       0.31396594153949475
  (2, 13)       0.15698297076974738
  (2, 30)       0.15698297076974738
  (2, 10)       0.15698297076974738
  (2, 15)       0.15698297076974738
  (2, 33)       0.15698297076974738
  
  
  
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']



[[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.        ]]
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值