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 逆文档频率
说明:
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] ] """