天天看点

机器学习:特征工程字典特征和文本特征抽取1、数据集2、数据集结构3、机器学习4、特征工程定义5、词汇6、特征抽取举例

1、数据集

mysql 性能瓶颈,读取速度

pandas 读取工具

numpy释放GIL

c

python

协程

sklearn

2、数据集结构

特征值 + 目标值

3、机器学习

重复值 不需要进行去重

缺失值 特殊处理

4、特征工程定义

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

5、词汇

classification 分类

regression 回归

clustering 聚类

dimensionality reduction 降维

model selection 模型选择

preprocessing 特征工程

6、特征抽取

特征值化,让计算机更好的理解数据

文本 -> 数字

安装用到的库

pip install jieba scikit-learn numpy      

6.1、字典特征抽取

把文本转换为数值

sparse矩阵,节约内存

ndarray 数组

One-hot编码 布尔值标记特征

代码示例

import numpy as np
from sklearn.feature_extraction import DictVectorizer


# 字典特征抽取
data = [
    {"city": "北京", "price": 2000},
    {"city": "上海", "price": 1500},
    {"city": "深圳", "price": 1000},
]

dict_vectorizer = DictVectorizer(dtype=np.int32, sparse=False)
result = dict_vectorizer.fit_transform(data)

print(dict_vectorizer.get_feature_names())
print(dict_vectorizer.inverse_transform(result))
print(result)
"""
['city=上海', 'city=北京', 'city=深圳', 'price']

[
    {'city=北京': 1, 'price': 2000}, 
    {'city=上海': 1, 'price': 1500}, 
    {'city=深圳': 1, 'price': 1000}
]

sparse = True 
(0, 1)  1.0
(0, 3)  2000.0
(1, 0)  1.0
(1, 3)  1500.0
(2, 2)  1.0
(2, 3)  1000.0

sparse = False    
[
    [   0    1    0 2000]
    [   1    0    0 1500]
    [   0    0    1 1000]
]
"""
      

6.2、文本特征抽取

Count 单词列表+出现次数统计

文本分类,情感分析

对单个字母不统计

import logging
import jieba
from sklearn.feature_extraction.text import CountVectorizer

jieba.setLogLevel(logging.INFO)


def count_vector():
    """
    文本特征提取
    """
    words = [
        "今天的天气很好",
        "明天我要去逛街",
        "后天天气好我还去好天气逛街"
    ]
    data = []
    for word in words:
        word_cut = jieba.cut(word)
        data.append(" ".join(word_cut))

    print(data)

    cv = CountVectorizer()
    result = cv.fit_transform(data)
    print(cv.get_feature_names())
    print(result.toarray())
    """
    [
        '今天 的 天气 很 好', 
        '明天 我要 去 逛街', 
        '后天 天气 好 我 还 去 好 天气 逛街'
    ]
    
    ['今天', '后天', '天气', '我要', '明天', '逛街']
    
    [[1 0 1 0 0 0]
     [0 0 0 1 1 1]
     [0 1 2 0 0 1]]
    """
      

6.3、TF-IDF(词频-逆文档频率)

评估词的重要程度

思想:

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

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

idf: inverse document frequency 逆文档频率

机器学习:特征工程字典特征和文本特征抽取1、数据集2、数据集结构3、机器学习4、特征工程定义5、词汇6、特征抽取举例

说明:

n 文档中某个词的个数

N 文档总次数

D 文档总数

d 包含某个词的文档数

参考:

https://baike.baidu.com/item/tf-idf/8816134?fr=aladdin

log(总文档数量N/该词出现的文档数量n)

log输入的值越小,输出值也越小

朴素贝叶斯

N >= n > 0

=> N/n >= 1

=> log定义域[1, 无穷)

=> 映射log值域[0, 1)

=> N固定 n 越大 -> N/n越小 -> log(N/n)越小

=> 单个文档中词频越高 tf越大

=> 出现文档越多 idf越小

=> 单个文档出现次数越多,出现文档数越少,重要程度越大

举例

# -*- coding: utf-8 -*-

from sklearn.feature_extraction.text import TfidfVectorizer

data = [
    "今天 天气 逛街",
    "明天 天气 逛街",
    "后天 天气 吃饭"
]

tf = TfidfVectorizer()
result = tf.fit_transform(data)
print(tf.get_feature_names())
print(result.toarray())
"""
    ['今天', '吃饭', '后天', '天气', '明天', '逛街']
[
    [0.72033345 0.         0.         0.42544054 0.         0.54783215]
    [0.         0.         0.         0.42544054 0.72033345 0.54783215]
    [0.         0.65249088 0.65249088 0.38537163 0.         0.        ]
]
"""      

可以看到:

"今天 天气 逛街", 今天 tf-idf值最大 0.72033345
 "明天 天气 逛街", 明天 tf-idf值最大 0.72033345
 "后天 天气 吃饭"  后天 和 吃饭 tf-idf值最大 0.65249088      

import logging
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer

jieba.setLogLevel(logging.INFO)

def tfidf_vector():
    words = [
        "今天的天气很好",
        "明天我要去逛街",
        "后天天气好我还去好天气逛街"
    ]
    data = []
    for word in words:
        word_cut = jieba.cut(word)
        data.append(" ".join(word_cut))

    print(data)

    tf = TfidfVectorizer()
    result = tf.fit_transform(data)
    print(tf.get_feature_names())
    print(result.toarray())
    """
    去除单个字的词
    [
        '今天 天气', 
        '明天 我要 逛街', 
        '后天 天气 天气 逛街'
    ]
    
    ['今天', '后天', '天气', '我要', '明天', '逛街']
    [
        [0.79596054 0.         0.60534851 0.         0.         0.        ]
        [0.         0.         0.         0.62276601 0.62276601 0.4736296 ]
        [0.         0.50689001 0.77100584 0.         0.         0.38550292]
    ]
    """