01-特征抽取
2019-10-01 本文已影响0人
jxvl假装
机器学习的数据
机器学习的文件一般都不存储在数据库中,常以文件形式存储,eg:csv
数据库的缺陷:eg:mysql:性能瓶颈,读取速度受到限制;格式不太符合机器学习要求的数据格式
pandas:读取数据,处理数据,基于numpy,速度快(numpy为什么快:释放了GIL锁(注意:只有cpython中有GIL锁))
可用数据集:
- kaggle:真实,数据量大...
- UCI:覆盖广,数据量大...
- scikit-learn:数据量小,方便学习
Kaggle网址:https://www.kaggle.com/datasets
UCI数据集网址: http://archive.ics.uci.edu/ml/
scikit-learn网址:http://scikit-learn.org/stable/datasets/index.html#datasets
常用数据集数据的结构组成:特征值(可视为数据的列)+目标值(想要干的事情)
每行就是一个样本;注意:有些数据可以没有目标值
对特征数据的处理:
- pandas:eg:缺失值处理,数据转换
- scikit-learn:对于特征的处理提供了强大的接口
机器学习:重复值不需要去重
特征工程:对特征数据进行处理的过程称为特征工程,目的:提高预测效果
sklearn:包含分类、降维、回归等一系列的算法
特征抽取
特征抽取:将文本(字符串等数据类型)转换为数值类型。亦即:对文本等数据进行特征值化
from sklearn.feature_extraction.text import CountVectorizer
#实例化CountVectorizer
vector = CountVectorizer()
#调用fit_transform并转换数据
res = vector.fit_transform(["Life is short, I like python", "Life is too long, I dislike python"])
print(vector.get_feature_names()) #打印vector中的原数据
print(res.toarray()) #以列表方式打印转换后的数据
"""
[[0 1 1 1 0 1 1 0]
[1 1 1 0 1 1 0 1]]
"""
print(res)
"""部分数据
(0, 2) 1
...
(1, 4) 1
(1, 0) 1
"""
字典特征抽取
from sklearn.feature_extraction import DictVectorizer
def dictver():
"""
字典数据抽取
:return: None
"""
print("-" * 50 + "这里是分隔符" + "-" * 50)
dict_data = [{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}] #注意:字典数据是放在列表里面的
#实例化
mydict = DictVectorizer(sparse=False) #sparse默认为True
data = mydict.fit_transform(dict_data)
print(data)
"""如果sparse是True。矩阵格式,是通过sklearn里面提供的scipy处理的
#标记了在矩阵中非0元素的位置(下标从0开始)
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0
"""
"""sparse为False。则提取的数据为矩阵
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
"""#One-hot编码:对于所属的类别,在矩阵中将其对应位置置为1,不属于则为0
print(mydict.get_feature_names())
"""即各列特征值所代表的意义
['city=上海', 'city=北京', 'city=深圳', 'temperature']
"""
#可见:字典特征抽取,把字典中一些类别的数据,分别进行转换成特征,如果是一些数值型的数据,不进行转换
#如果拿到的是数组形式,有类别的这些特征,要先转换成字典数据
print(mydict.inverse_transform(data))
# [{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
文本特征抽取
from sklearn.feature_extraction.text import CountVectorizer
def countvec():
"""
对文本进行特征值化
:return: None
"""
print("-" * 50 + "这里是分隔符" + "-" * 50)
cv = CountVectorizer() #注意:text的CountVector没有parse参数
data = cv.fit_transform(["Life is is short, I like python", "Life is too long, I dislike python"])
# data = cv.fit_transform(["人生苦短,我用python","人生漫长,我不用python"]) #如果有中文,默认不支持特征抽取。单个汉字也不进行统计,如果要对中文进行抽取,需要先进行分词
print(data)
"""
(0, 2) 1
(0, 1) 2
...
(1, 0) 1
"""
print(cv.get_feature_names())
#['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']。是一个一个的单词,统计所有文章当中的词,重复的只当作一次(注意:单个的字母并没有进行统计)
print(data.toarray())
"""把上面对应的8个词进行标记,对每篇文章,在词的列表里面进行统计每个词出现的次数
[[0 2 1 1 0 1 1 0]
[1 1 1 0 1 1 0 1]]
"""
"""
文本特征抽取:
用途:文本分类,情感分析
CountVector:进行次数统计,单个的英文字母没有进行统计,因为单个的字母不能反映文章的主题和内容,没有分类的依据
"""
import jieba
def cutword():
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
#转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
#把列表转换成字符串,并以空格隔开
c1 = " ".join(content1)
c2 = " ".join(content2)
c3 = " ".join(content3)
return c1, c2, c3
def hanziverc():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
cv = CountVectorizer()
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names())
print(data.toarray())
return None
if __name__ == "__main__":
# dictver()
# countvec()
hanziverc()