02 特征工程和文本特征提取
数据集的构成
数据存放形式
- CSV 文件
- mysql: 性能瓶颈,读取速度; 格式不符合机器学习的格式
- pandas:读取工具
- numpy为什么读取速度快:
- 动态语言
- 全局解释性锁 GIL : 释放了 (GIL数据安全),真正的多线程
可用的数据集
- Kaggle : 大数据竞赛平台、真实数据、数据量大
- UCI: 数据集覆盖科学、生活、经济等领域
- Scikit-learn: 数据量小,方便学习
数据集的结构组成
- 结构: 特征值 + 目标值
特征工程的定义
特征工程是什么?
特征工程:将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提供了对未知数据的预测准确性。
- 很大程度上影响最后模型的精度
数据中对特征的处理
- Pandas: 数据读取方便,基本的处理格式的工具
- DataFrame - 缺失值,数据处理
- 机器学习:重复值不需要进行处理
- Sklearn: 对特征进行处理提供强大的接口
- Python机器学习工具,包含许多知名算法的实现
- 丰富的API
数据的特征抽取
定义:
- 特征抽取是对文本等数据进行特征值化
- 特征值化:让计算机更好的了解数据
Sklearn 特征抽取API (Sklearn.feature_extraction)
字典特征抽取
- sklearn.feature_extraction.DictVectorizer
- 把字典中的一些类别数据,分别进行转换成特征;数值型(浮点型)不会进行转化。
- 数组形式,有类别的这些特征,先要转换字典数据
- fit_transform (直接接收字典)
from sklearn.feature_extraction import DictVectorizer
def dictver():
"""
字典数据抽取
:return:None
"""
# 实例化
dict = DictVectorizer(sparse=False)
# 调用fit_transform
data = dict.fit_transform(
[{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}])
print(dict.get_feature_names())
print(dict.inverse_transform(data))
print(data)
return None
if __name__ == '__main__':
dictver()
```
- sparse矩阵 - 方便节约内存
- (0,1)- 行列坐标 ; 1.0 - 值
- One-hot 编码
- 每个类别生成一个布尔列,这些列中只有一列可以为每个样本取值1,便于机器学习数值分析。
- 避免对每个类别生成编码是,1,2,3这种的会存在大小关系。
文本的特征抽取(数量)
- sklearn.feature_extraction.text.CountVectorizer
- 文本分类,情感分析
- 对于单个英文字母不统计:不反应主题,没有情感依据
- 英文文本特征抽取
def countvec():
"""
对文本进行特征值化
:return:None
"""
cv = CountVectorizer()
data = cv.fit_transform(['life is short, i like python','life is too long, i dislike python'])
print(cv.get_feature_names())
# print(cv.inverse_transform(data))
print(data.toarray())
return None
if __name__ == '__main__':
countvec()
- 统计所有文章当中所有的词,重复的只看做一次
- 对每篇文章,在词的列表里面进行统计每个词出现的次数
- 单个字母不统计
- 中文文本
- 需要对中文进行分词才能详细的进行特征值化
- 不支持单个中文字
- 使用 jieba这个模块 - jieba.cut('我是一个好程序员')
import jieba
from sklearn.feature_extraction.text import CountVectorizer
def cutword():
"""
中文字分割
:return: c1, c2, c3
"""
con1 = jieba.cut('今天很残酷,明天更残酷,后天很美好,'
'但绝对大多数是死在明天晚上,所以每个人不要放弃今天')
con2 = jieba.cut('我们看到的从很远星系来的光是在几百万年前发出的,'
'这样当我们看到宇宙时,我们是在看它的过去')
con3 = jieba.cut('如果只用一种方式了解某样事物,你就不会真正的了解它。'
'了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系')
# 转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 把列表转换成字符串
# join(iterable) 以指定字符串作为分隔符,将content1中所有元素合并成一个新的字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1, c2, c3
def hanzivec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
cv = CountVectorizer() # 实例化
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names())
print(data.toarray())
if __name__ == '__main__':
hanzivec()
文本特征抽取(语义)
- tf - idf (tf * idf) 重要性程度
- tf: term frequency (词的频率)
- idf: inverse document frequency (逆文档频率) log(总文档数量/该词出现的文档数量)
TF-IDF: 如果某个词或者短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或短语具有很好的类别区分能力,适合用来分类。
sklearn.feature_extraction.text.TfidfVectorizer
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
def cutword():
"""
中文字分割
:return: c1, c2, c3
"""
con1 = jieba.cut('今天很残酷,明天更残酷,后天很美好,'
'但绝对大多数是死在明天晚上,所以每个人不要放弃今天')
con2 = jieba.cut('我们看到的从很远星系来的光是在几百万年前发出的,'
'这样当我们看到宇宙时,我们是在看它的过去')
con3 = jieba.cut('如果只用一种方式了解某样事物,你就不会真正的了解它。'
'了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系')
# 转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 把列表转换成字符串
# join(iterable) 以指定字符串作为分隔符,将content1中所有元素合并成一个新的字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1, c2, c3
def hanzivec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
tf = TfidfVectorizer() # 实例化
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())
if __name__ == '__main__':
hanzivec()