特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
意义:会直接影响机器学习的效果。
sklearn :特征工程
pandas:数据清洗、数据处理
特征工程包含的内容:特征抽取/提取、特征预处理、特征降维
vector 数学:向量 、物理:矢量
矩阵 matrix 二维数组
向量 vector 一维数组
父类: 转换器类
返回sparse矩阵
sparse稀疏
将非零值 按位置表示出来
节省内存 - 提高加载效率
应用场景:
1) 数据集当中类别特征比较多
1.将数据集的特征-->字典类型
2.DicVectorizer转换
2)本身拿到的数据就是字典类型
对字典数据进行特征化代码测试:
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
"""
字典特征抽取
:return:
"""
data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
# 1.实例化一个转换器类
transfer = DictVectorizer(sparse=False) #sparse默认为true(则是稀疏矩阵)
# 2.调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n",transfer.get_feature_names_out())
return None
测试结果:
每一行代表一个样本,共三行,分别对应的是data中的一个列表元素(字典形式)。每一列代表类别,共四列,分别代表上海、北京、深圳、temperature。
例如第一行的样本:第二个数为1,对应的是类别为北京,第四个数为100,对应的类别就是温度为100.所以可用这种“one-hot编码”的形式表示出第一个样本的信息为,城市:北京,温度:100。
总结: 对于特征当中存在类别信息的我们都会做one-hot编码处理。
单个字 作为特征
句子、短语、单字、字母
特征:特征词
方法1:CountVectorizer
统计每个样本特征词出现的个数
stop_words 参数用来停用一些无意义的词(列表形式)
关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少
from sklearn.feature_extraction.text import CountVectorizer
def count_demo():
"""
文本特征抽取 :CountVecotrizer
:return:
"""
data = ["life is short,I like like python", "life is too long,I dislike python"]
# 1.实例化一个转换器
transfer = CountVectorizer() #默认是稀疏矩阵
# 2.调用fit_transform(data)
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray()) #toarray可以把稀疏矩阵转化为二维数组(矩阵)
print("特征名字:\n", transfer.get_feature_names_out())
return None
测试结果:
例如第一行数据为第一个文本数据样本,其中第四个数据为特征词“like”,且数量为2
单个字母“i”,或者标点符号等,在分类或者情感分析的时候意义不大,所以没有
中文文本数据特征化代码测试:
由于中文文本不像英文文本那样,每写一个单词都打一个空格,所以中文文本直接提取特征词的话,会直接出现“短句”,而我们特征词提取的目标是单个的“词”,所以我们有两个方案:
方案一:每写一个词,我们就像写中文一样加一个空格,这种方法理论上可行,但实际上不符合我们写中文的习惯。
方案二:使用分词工具包,例如“jieba”来对我们的中文句子进行分词后再提取特征词,下面有代码的演示:
import jieba #y引用jieba库
def count_chinese_demo():
"""
中文文本特征抽取 :CountVecotrizer
:return:
"""
data = ["人生苦短,我喜欢蟒蛇", "人生太长,我不喜欢蟒蛇"]
# 1.实例化一个转换器
transfer = CountVectorizer(stop_words=["一种","所以"]) #默认是稀疏矩阵,stop_words参数用来停用一些没有太大意义的词(列表形式)
# 2.调用fit_transform(data)
# data_new = transfer.fit_transform(data)
data_new = transfer.fit_transform(count_chinese_demo2())
print("data_new:\n", data_new.toarray()) #toarray可以把稀疏矩阵转化为二维数组(矩阵)
print("特征词:\n", transfer.get_feature_names_out())
return None
def cut_word(text):
"""
将text进行中文分词
:param text:
:return:
"""
# result = jieba.cut(text)
# print(list(result)) #返回列表形式
result = " ".join(list(jieba.cut(text))) #转化成字符串
return result
def count_chinese_demo2():
"""
中文文本特征抽取,自动分词
:return:
"""
#1.将中文文本分词
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# print(cut_word("感谢你特别邀请,来见证你的爱情")) #测试字符串
data_new = [] #用来接收进行分词后的文本
for item in data:
data_new.append(cut_word(item))
# print(data_new)
# print("*"*50)
return data_new
方法2:TfidfVectorizer
TF-IDF - 重要程度
例如:
两个词 “经济”、“非常”
1000篇文章-语料库
100篇文章-“非常”
10篇文章 - “经济”
TF - 词频(term frequency,tf)
两篇文章
文章A (100词):10次“经济” “TF-IDF”:
tf:10/100=0.1
idf = log10(1000/10) = 2
文章B (100词):10次“非常” “TF-IDF”:
tf:10/100=0.1
idf:log10(1000/100) = 1
TF - 词频(term frequency,tf)
IDF
def tfidf_demo():
"""
用TF-IDF的方法进行文本特征抽取
:return:
"""
# 1.将中文文本分词
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = [] # 用来接收进行分词后的文本
for item in data:
data_new.append(cut_word(item))
# 1.实例化一个转换器类
transfer = TfidfVectorizer(stop_words=["一种", "所以"])
# 2.调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_new:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names_out())
return None