原创

机器学习手册08---特征工程(特征提取篇)


工业界流传者这么一句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那么,到底什么是特征工程?我们知道,数据是信息的载体,但是原始的数据包含了大量的噪声,信息的表达也不够简练。因此,特征工程的目的,是通过一系列的工程活动,将这些信息使用更高效的编码方式(特征)表示。使用特征表示的信息,信息损失较少,原始数据中包含的规律依然保留。此外,新的编码方式还需要尽量减少原始数据中的不确定因素(白噪声、异常数据、数据缺失…等等)的影响。

1.什么是特征提取

特征提取:将任意数据(如:文本、图片)转换为可用于机器学习的数字特征,为了让计算机更好的去理解数据。特征提取分类:(1)字典特征提取(特征离散化)(2)文本特征提取(3)图像特征提取(深度学习应用比较多)

2.字典特征提取

from sklearn.feature_extraction import DictVectorizer

def dict_demo():
    """
    字典特征提取
    """
    # 1.获取数据
    data = [{'city': '北京', 'temperature': 100},
            {'city': '上海', 'temperature': 60},
            {'city': '深圳', 'temperature': 30}]

    # 2.字典特征提取
    # 2.1实例化
    transfer = DictVectorizer(sparse=False)
    # 2.2转换
    new_data = transfer.fit_transform(data)
    print(new_data)
    # 2.3获取具体属性名
    names = transfer.get_feature_names()
    print(names)

if __name__ == '__main__':
    dict_demo()
[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]
['city=上海', 'city=北京', 'city=深圳', 'temperature']

若将参数改为sparse=True,则输出:

  (0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0

3.文本特征提取

【英文文本】:

from sklearn.feature_extraction.text import CountVectorizer

def english_count_demo():
    """
    文本特征提取---英文
   """
    # 1.获取数据
    data = ["Life is short,i like python",
            "Life is too long,i dislike python"]

    # 2.字典特征提取
    # 2.1实例化
    transfer = CountVectorizer() #可以通过参数stop_words=["dislike"]停止统计该单词
    # 2.2转换
    new_data = transfer.fit_transform(data)
    print(new_data)
    print(new_data.toarray())
    # 2.3查看特征名字
    names = transfer.get_feature_names()
    print(names)

if __name__ == '__main__':
    english_count_demo()
  (0, 2)	1
  (0, 1)	1
  (0, 6)	1
  (0, 3)	1
  (0, 5)	1
  (1, 2)	1
  (1, 1)	1
  (1, 5)	1
  (1, 7)	1
  (1, 4)	1
  (1, 0)	1
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']

【中文文本】:

from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cut_word(text):
    """
    中文分词
    """
    return " ".join(list(jieba.cut(text)))

def chinese_count_demo():
    """
    文本特征提取---中文
    """
    # 1.获取数据
    data = ["现代宇宙学中的主流观点认为宇宙的起源,是起源于一次大爆炸",
            "金融是货币资金融通的总称。主要指与货币流通和银行信用相关的各种活动。",
            "计算机发明者约翰·冯·诺依曼,计算机是20世纪最先进的科学技术发明之一。"]


    # 2.文章分割
    list = []
    for temp in data:
        list.append(cut_word(temp))
    print(list)


    # 3.文本特征转换
    # 3.1实例化+转换
    transfer = CountVectorizer(stop_words=["一次", "一个", "之一"])
    new_data = transfer.fit_transform(list)

    # 3.2查看特征名字
    names = transfer.get_feature_names()
    print(names)
    print(new_data.toarray())
    # print(new_data)


if __name__ == '__main__':
    chinese_count_demo()
['现代 宇宙学 中 的 主流 观点 认为 宇宙 的 起源 , 是 起源于 一次 大 爆炸', '金融 是 货币资金 融通 的 总称 。 主要 指 与 货币流通 和 银行信用 相关 的 各种 活动 。', '计算机 发明者 约翰 · 冯 · 诺依曼 , 计算机 是 20 世纪 最 先进 的 科学技术 发明 之一 。']
['20', '世纪', '主流', '主要', '先进', '发明', '发明者', '各种', '宇宙', '宇宙学', '总称', '活动', '爆炸', '现代', '相关', '科学技术', '约翰', '融通', '观点', '计算机', '认为', '诺依曼', '货币流通', '货币资金', '起源', '起源于', '金融', '银行信用']
[[0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0]
 [0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 1]
 [1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 2 0 1 0 0 0 0 0 0]]

4.Tf-idf文本特征提取

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

【说明】:Tf是词频;idf是逆向文档频率,是一个词语普遍重要性的度量。

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

def cut_word(text):
    """
    中文分词
    """
    return " ".join(list(jieba.cut(text)))

def chinese_tfidf_demo():
    """
    文本特征提取---中文
    """
    # 1.获取数据
    data = ["现代宇宙学中的主流观点认为宇宙的起源,是起源于一次大爆炸",
            "金融是货币资金融通的总称。主要指与货币流通和银行信用相关的各种活动。",
            "计算机发明者约翰·冯·诺依曼,计算机是20世纪最先进的科学技术发明之一。"]

    # 2.文章分割
    list = []
    for temp in data:
        list.append(cut_word(temp))
    print(list)


    # 3.文本特征转换
    # 3.1实例化+转换
    transfer = TfidfVectorizer()
    new_data = transfer.fit_transform(list)

    # 3.2查看特征名字
    names = transfer.get_feature_names()

    print(names)
    print(new_data.toarray())
    # print(new_data)


if __name__ == '__main__':
    chinese_tfidf_demo()
['现代 宇宙学 中 的 主流 观点 认为 宇宙 的 起源 , 是 起源于 一次 大 爆炸', '金融 是 货币资金 融通 的 总称 。 主要 指 与 货币流通 和 银行信用 相关 的 各种 活动 。', '计算机 发明者 约翰 · 冯 · 诺依曼 , 计算机 是 20 世纪 最 先进 的 科学技术 发明 之一 。']
['20', '一次', '世纪', '主流', '主要', '之一', '先进', '发明', '发明者', '各种', '宇宙', '宇宙学', '总称', '活动', '爆炸', '现代', '相关', '科学技术', '约翰', '融通', '观点', '计算机', '认为', '诺依曼', '货币流通', '货币资金', '起源', '起源于', '金融', '银行信用']
[[0.         0.31622777 0.         0.31622777 0.         0.
  0.         0.         0.         0.         0.31622777 0.31622777
  0.         0.         0.31622777 0.31622777 0.         0.
  0.         0.         0.31622777 0.         0.31622777 0.
  0.         0.         0.31622777 0.31622777 0.         0.        ]
 [0.         0.         0.         0.         0.31622777 0.
  0.         0.         0.         0.31622777 0.         0.
  0.31622777 0.31622777 0.         0.         0.31622777 0.
  0.         0.31622777 0.         0.         0.         0.
  0.31622777 0.31622777 0.         0.         0.31622777 0.31622777]
 [0.2773501  0.         0.2773501  0.         0.         0.2773501
  0.2773501  0.2773501  0.2773501  0.         0.         0.
  0.         0.         0.         0.         0.         0.2773501
  0.2773501  0.         0.         0.5547002  0.         0.2773501
  0.         0.         0.         0.         0.         0.        ]]

Python
机器学习
  • 作者:李延松(联系作者)
  • 发表时间:2020-07-25 11:52
  • 版本声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码

评论

留言