工业界流传者这么一句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那么,到底什么是特征工程?我们知道,数据是信息的载体,但是原始的数据包含了大量的噪声,信息的表达也不够简练。因此,特征工程的目的,是通过一系列的工程活动,将这些信息使用更高效的编码方式(特征)表示。使用特征表示的信息,信息损失较少,原始数据中包含的规律依然保留。此外,新的编码方式还需要尽量减少原始数据中的不确定因素(白噪声、异常数据、数据缺失…等等)的影响。
特征提取:将任意数据(如:文本、图片)转换为可用于机器学习的数字特征,为了让计算机更好的去理解数据。特征提取分类:(1)字典特征提取(特征离散化)(2)文本特征提取(3)图像特征提取(深度学习应用比较多)
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
"""
字典特征提取
"""
# 1.获取数据
data = [{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}]
# 2.字典特征提取
# 2.1实例化
transfer = DictVectorizer(sparse=False)
# 2.2转换
new_data = transfer.fit_transform(data)
print(new_data)
# 2.3获取具体属性名
names = transfer.get_feature_names()
print(names)
if __name__ == '__main__':
dict_demo()
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
['city=上海', 'city=北京', 'city=深圳', 'temperature']
若将参数改为sparse=True,则输出:
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0
【英文文本】:
from sklearn.feature_extraction.text import CountVectorizer
def english_count_demo():
"""
文本特征提取---英文
"""
# 1.获取数据
data = ["Life is short,i like python",
"Life is too long,i dislike python"]
# 2.字典特征提取
# 2.1实例化
transfer = CountVectorizer() #可以通过参数stop_words=["dislike"]停止统计该单词
# 2.2转换
new_data = transfer.fit_transform(data)
print(new_data)
print(new_data.toarray())
# 2.3查看特征名字
names = transfer.get_feature_names()
print(names)
if __name__ == '__main__':
english_count_demo()
(0, 2) 1
(0, 1) 1
(0, 6) 1
(0, 3) 1
(0, 5) 1
(1, 2) 1
(1, 1) 1
(1, 5) 1
(1, 7) 1
(1, 4) 1
(1, 0) 1
[[0 1 1 1 0 1 1 0]
[1 1 1 0 1 1 0 1]]
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
【中文文本】:
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cut_word(text):
"""
中文分词
"""
return " ".join(list(jieba.cut(text)))
def chinese_count_demo():
"""
文本特征提取---中文
"""
# 1.获取数据
data = ["现代宇宙学中的主流观点认为宇宙的起源,是起源于一次大爆炸",
"金融是货币资金融通的总称。主要指与货币流通和银行信用相关的各种活动。",
"计算机发明者约翰·冯·诺依曼,计算机是20世纪最先进的科学技术发明之一。"]
# 2.文章分割
list = []
for temp in data:
list.append(cut_word(temp))
print(list)
# 3.文本特征转换
# 3.1实例化+转换
transfer = CountVectorizer(stop_words=["一次", "一个", "之一"])
new_data = transfer.fit_transform(list)
# 3.2查看特征名字
names = transfer.get_feature_names()
print(names)
print(new_data.toarray())
# print(new_data)
if __name__ == '__main__':
chinese_count_demo()
['现代 宇宙学 中 的 主流 观点 认为 宇宙 的 起源 , 是 起源于 一次 大 爆炸', '金融 是 货币资金 融通 的 总称 。 主要 指 与 货币流通 和 银行信用 相关 的 各种 活动 。', '计算机 发明者 约翰 · 冯 · 诺依曼 , 计算机 是 20 世纪 最 先进 的 科学技术 发明 之一 。']
['20', '世纪', '主流', '主要', '先进', '发明', '发明者', '各种', '宇宙', '宇宙学', '总称', '活动', '爆炸', '现代', '相关', '科学技术', '约翰', '融通', '观点', '计算机', '认为', '诺依曼', '货币流通', '货币资金', '起源', '起源于', '金融', '银行信用']
[[0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0]
[0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 1]
[1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 2 0 1 0 0 0 0 0 0]]
【主要思想】:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中出现的很少,则认为此词或短语具有很好的类别区分能力,适合用来分类。
【说明】:Tf是词频;idf是逆向文档频率,是一个词语普遍重要性的度量。
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def cut_word(text):
"""
中文分词
"""
return " ".join(list(jieba.cut(text)))
def chinese_tfidf_demo():
"""
文本特征提取---中文
"""
# 1.获取数据
data = ["现代宇宙学中的主流观点认为宇宙的起源,是起源于一次大爆炸",
"金融是货币资金融通的总称。主要指与货币流通和银行信用相关的各种活动。",
"计算机发明者约翰·冯·诺依曼,计算机是20世纪最先进的科学技术发明之一。"]
# 2.文章分割
list = []
for temp in data:
list.append(cut_word(temp))
print(list)
# 3.文本特征转换
# 3.1实例化+转换
transfer = TfidfVectorizer()
new_data = transfer.fit_transform(list)
# 3.2查看特征名字
names = transfer.get_feature_names()
print(names)
print(new_data.toarray())
# print(new_data)
if __name__ == '__main__':
chinese_tfidf_demo()
['现代 宇宙学 中 的 主流 观点 认为 宇宙 的 起源 , 是 起源于 一次 大 爆炸', '金融 是 货币资金 融通 的 总称 。 主要 指 与 货币流通 和 银行信用 相关 的 各种 活动 。', '计算机 发明者 约翰 · 冯 · 诺依曼 , 计算机 是 20 世纪 最 先进 的 科学技术 发明 之一 。']
['20', '一次', '世纪', '主流', '主要', '之一', '先进', '发明', '发明者', '各种', '宇宙', '宇宙学', '总称', '活动', '爆炸', '现代', '相关', '科学技术', '约翰', '融通', '观点', '计算机', '认为', '诺依曼', '货币流通', '货币资金', '起源', '起源于', '金融', '银行信用']
[[0. 0.31622777 0. 0.31622777 0. 0.
0. 0. 0. 0. 0.31622777 0.31622777
0. 0. 0.31622777 0.31622777 0. 0.
0. 0. 0.31622777 0. 0.31622777 0.
0. 0. 0.31622777 0.31622777 0. 0. ]
[0. 0. 0. 0. 0.31622777 0.
0. 0. 0. 0.31622777 0. 0.
0.31622777 0.31622777 0. 0. 0.31622777 0.
0. 0.31622777 0. 0. 0. 0.
0.31622777 0.31622777 0. 0. 0.31622777 0.31622777]
[0.2773501 0. 0.2773501 0. 0. 0.2773501
0.2773501 0.2773501 0.2773501 0. 0. 0.
0. 0. 0. 0. 0. 0.2773501
0.2773501 0. 0. 0.5547002 0. 0.2773501
0. 0. 0. 0. 0. 0. ]]
评论