特征工程介绍
特征工程就是处理数据的技巧,使得特征能在机器学习算法上发挥更好的作用的过程,会直接影响机器学习的效果。
pandas: 一个数据读取非常方便以及基本的处理格式的工具 (数据清洗,数据处理)
sklearn: 对于特征的处理提供了强大的接口 (特征工程)
特征提取 (特征抽取)
机器学习算法 – > 统计方法 --> 数学公式
但是特征通常是字符串,不能直接套用数学公式
比如,给一篇文章归类,是无法直接用机器学习算法进行处理,需要用不同的转换方法进行转化,再处理
文本类型 --> 数值
概念
将任意数据 (如文本或图像) 转换为可用于机器学习的数字特征
注意:特征值化是为了计算机更好的去理解数据
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取
特征提取
sklearn.feature_extraction
字典特征提取
作用:对字典数据进行特征值化
# Dict(字典) Vector(向量) ,即把字典转换为向量(数值)
sklearn.feature_extraction .DictVectorizer(sparse = True....)
DictVectorizer.inverse_transform(x) x:字典或包含字典的迭代器 返回值:返回sparse矩阵
DictVectorizer.fit_transform(x) x:array数组或sparse矩阵 返回值:转换之前的数据格式
DictVectorizer.get_featrue_names() 返回类别名称
向量 vector 一维数组
矩阵 matrix 二维数组
举例:
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
# 字典特征抽取
data = [{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}]
# 1、实例化一个转换器类
transfer = DictVectorizer(sparse=False)
# 2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("特征名字:\n",transfer.get_feature_names())
print("data_new:\n",data_new)
return None
if __name__ == "__main__":
dict_demo()
无sparse = False的形式 (sparse默认值为True) ,以列的形式去看
sparse=False 时输出的是 非 0 的坐标,如 第0行第1列是1.0 ,这样更直观
sparse = True 好处是:如果字典数据有N多个,这样就会导致有大量的 0 减慢读取速度,即节省内存 — 提高加载效率 ,同时将非零值可以按位置表示出来
注意:这种表格形式是 one-hot 编码 (一种处理数据的技巧)
把每个类别生成一个布尔列,
字典特征提取的应用场景
-
数据集当中类别特征比较多
将数据集的特征 —> 字典类型
DictVectorizer转换
-
本身拿到的数据就是字典类型
文本特征提取
作用:对文本数据进行特征值化
例如:单词、中文(因为中文除了“,”分隔外没有其他分隔,所以要用其他方法去分隔)
例如:单词作为特征
方法一:CountVectorizer
方法:CountVectorizer #统计特征词出现的次数
from sklearn.feature_extraction.text import CountVectorizer
sklearn.feature_extraction.text.CountVectorizer(stop_words = [])
# 返回词频矩阵
#stop_words = ["is"] 表示停用词,即忽略某些词,如忽略 “is”
CountVectorizer.fit_transform(x)
# x:文本或包含文本字符串的可迭代对象,返回值:返回sparse矩阵
CountVectorizer.inverse_transform(x)
# x:array数组或者sparse矩阵 , 返回值:转换之前数据格
CountVectorizer.get_feature_names()
# 返回值:单词列表
sklearn.feature_extraction.text.TfidVectorizer
应用
将以下数据进行特征提取
from sklearn.feature_extraction.text import CountVectorizer
def dict_demo():
data = ["life life is short,i like like python",
"life life life is too long long,i i i dislike dislike python python"]
transfer = CountVectorizer()
data_new = transfer.fit_transform(data)
print("特征名字:\n",transfer.get_feature_names())
print("data_new:\n",data_new.toarray())
# data_new.toarray() 使数据以矩阵的方式表示
#print("data_new:\n",data_new) 使数据以坐标的方式表示
if __name__ == "__main__":
dict_demo()
第一行第一个2,下面对应个3,说明在 第一句中有两个“ life ”,第二句中有三个“ life ”
中文分词拓展
中文文本特征抽取,需要分词,则引入自动分词
CSDN搜 “ jieba ”
https://www.bilibili.com/video/BV1nt411r7tj?p=10&spm_id_from=pageDriver&vd_source=a981bb8b0cc2eb944941fe91d26bf83c
方法二:TfidVectorizer
自动找出 重要的词,或者重要的词占比
Tf-idf 文本特征提取
Tf-idf的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为该词或者短语具有很好的类别区分能力,适合用来分类。
Tf-idf的作用:用以评估字词对于一个文件集或一个语料库中的一份文件的重要程度
Tf 指词频 (term frequency) 指的是某一个给定的词语在该文件中出现的频率
idf 指逆向文档频率 (inverse document frequency) 指的是一个词语普遍重要性的度量。 某一特定词语的 ifd,可以 由 文件数目除以包含该词语的文件数目,再将得到的商 取以10为底的对数得到
最终得出的结果可以理解为 重要程度
举例:加入一篇文件的总词数是100,而"经济"一词出现了N次,那么“经济”一词在该文中的重要程度为
语料库 – 1000篇文章
“经济” – 10篇文章
文章A(词数: 100) : 10次"经济" TF-IDF = TF * IDF = 0.2
TF : 10/100 = 0.1
IDF: lg 1000/10 = 2
API
sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None)
# 返回 词的权重矩阵
TfidfVectorizer.fit_transform(x)
# x: 文本或者包含文本字符串的可迭代对象
# 返回值: 返回sparse 矩阵
TfidfVectorizer.inverse_transform(x)
# x: array数组或者sparse矩阵
# 返回值: 转换之前的数据格式
TfidfVectorizer.get_feature_names()
# 返回值: 单词列表
特征预处理
概念
通过一些转换函数将特征数据转换成更加适合算法模型的特征数据的过程
内容
数值型数据的无量纲化:
方法1:归一化
方法2:标准化
为什么进行归一化 / 标准化
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响目标结果,使得一些算法无法学习到其他的特征
通过欧式距离公式(两点间距离公式) 进行计算,会发现【((72993-35948)2+(10.14-6.83)2+(1.03-1.21)^2 )sqrt】三个特征同等重要,但是由于里程数过于大,导致公升数和消耗时间比显得不重要。因此需要把数据进行无量纲化,使得不同规格的数据转换到同一规格
特征预处理API
sklearn.preprocessing
归一化
定义
通过对原始数据进行变换把数据映射到(默认为[ 0 , 1])之间
公式
举例
数据:
特征1 | 特征2 | 特征3 | 特征4 |
---|---|---|---|
90 | 2 | 10 | 40 |
60 | 4 | 15 | 45 |
75 | 3 | 13 | 46 |
特征1 的90
x’ = (90 - 60) / (90 - 60) = 1
x’’ = 1 * (1 - 0) + 0 = 1
特征2 的 3
x’ = (3 - 2) / (4 - 2) = 0.5
x’’ = 0.5 * (1-0) + 0 = 0.5
API
sklearn.preprocessing.MinMaxScaler(feature_range = (0,1))
MinMaxScalar.fit_transform(x)
# x: numpy array格式的数据[n_samples,n_features]
# 二维数组 n_samples 行,n_features 列
# 返回值: 转换后的形状相同的array
总结
因为最大值和最小值是变化的,且最大值和最小值非常容易受到异常点的影响,所以这种方法的鲁棒性较差,只适合传统精确小数据场景
标准化
定义
通过对原始数据进行变换,把数据变换到均值为0,标准差为1的范围内
公式
对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响不大,方差改变较小
API
sklearn.preprocessing.StandardScaler()
#处理之后,对于每列来说,所有数据都聚集在均值为0附近,标准差为1
StandardScaler.fit_transform(x)
# x: numpy array格式的数据[n_samples,n_features]
#二维数组 n_samples 行,n_features 列
# 返回值: 转换后的形状相同的array
总结
在已有样本足够多的情况下比较稳定,适合大数据场景