1、数据集
mysql 性能瓶颈,读取速度
pandas 读取工具
numpy释放GIL
cpython 协程
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 逆文档频率
t
f
i
d
f
=
n
N
∗
l
g
(
D
d
)
tfidf = \frac{n}{N} * lg(\frac{D}{d})
tfidf=Nn∗lg(dD)
说明:
n 文档中某个词的个数
N 文档总次数
D 文档总数
d 包含某个词的文档数
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]
]
"""