1、特征工程是什么
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性
2、特征工程的意义
直接影响模型的预测结果
3、scikit-learn库介绍
安装scikit-learn库:pip install Scikit-learn
4、数据的特征抽取
1、sklearn特征抽取API:sklearn.feature_extraction
2、字典特征抽取:把字典中的一些类别数据分别转换成特征
作用:对字典数据进行特征化
类:sklearn.feature-extraction.DictVictorizer
DictVectorizer语法:
- DictVectorizer(sparse=True,…) #实例化,sparse=True:代表特征抽取后返回结果是sparse矩阵(稀疏矩阵)【优点:节约内存,方便读取处理】,sparse=False:代表特征抽取后返回的结果数组
- sparse=True,返回sparse矩阵实示例:
(0,1) 1.0 --->代表0行1列的值是1.0
(0,3) 100.0 --->代表0行3列的值是100.0
(1,0) 1.0 --->代表1行0列的值是1.0
(1,3) 60.0 --->代表1行3列的值是60.0
sparse=False,返回示例:
[[0,1.0,0,100.0],[1.0,0,0,60.0]]
语法:
- DictVectorizer.fit_transform(X)
- X:字典或者包含字典的迭代器
- 返回值:返回sparse矩阵
- DictVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
- 返回值:转换之前数据格式
- DictVectorizer.get_feature_names()
- 返回类别名称
- DictVectorizer.transform(X)
- 按照原先的标准转换
3、文本特征抽取
作用:对文本数据进行特征值化
方式:
1、count(词频统计,统计每个词在文本中出现的次数)
场景:文本分类、情感分析
类:sklearn.feature_extraction.text.CountVectorizer
语法:
- CountVectorizer(max_df=1.0,min_df=1,…)
返回词频矩阵
- CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
- CountVectorizer.get_feature_names()
返回值:单词列表
- 注意返回格式,利用toarray()进行sparse矩阵转换array数组
max_df,min_df整数:指每个词的所有文档词频数不小于最小值,每个文档中每个词的词频不超过此文档的最大值
max_df,min_df小数:每个词的次数/所有文档数量
2、TF-IDF
场景:分类机器学习算法的的重要依据
TF:term frequency:词的频率
Idf:inverse document frequency:逆文档频率==>
逆文档频率公式: log(总文章数/该词出现的文章数)
所以:一个词在一个文章里面的重要性=tf*idf
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,
并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分
能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
类:sklearn.feature_extraction.text.TfidfVectorizer
语法:
- TfidfVectorizer(stop_words=None,…) ===> stop_words:忽略哪些词
- 返回词的权重矩阵
- TfidfVectorizer.fit_transform(X,y)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
- TfidfVectorizer.inverse_transform(X)
- X:array数组或者sparse矩阵
返回值:转换之前数据格式
- TfidfVectorizer.get_feature_names()
- 返回值:单词列表
中文分词:
Pip install jieba
jieba.cut("人生苦短,我爱Python") -->返回值是一个分词后的迭代器
5、数据的特征处理
通过特定的统计方法(数学方法)将数据转换成算法要求的数据
1、特征处理的方法
数值型数据:
标准缩放:
1、归一化(使用较少,因为存在异常点的时候可能对结果影响较大)
特点:通过对原始数据进行转换,把数据映射到指定区间(默认为[0,1])之间
公式:?′= ?−??????−??? ?′′= ?′∗mx−mi+mi
注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0
适用场景:所有特征同等重要,单一特征不会对结果造成影响。
总结:注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
2、标准化
特点:通过对原始数据进行变换把特征数据变换到均值为0,标准差为1范围内
公式:?′= ?−mean?
注:作用于每一列,mean为平均值,?为标准差(考量数据的稳定性,标准差越小代表数据越稳定越集中,标准差越大代表数据越离散)
std成为方差std成为方差,?= std
总结:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
3、缺失值
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
类别型数据:one-hot编码
时间类型:时间的切分
2、sklearn特征处理API
- sklearn. preprocessing
归一化API:
sklearn.preprocessing.MinMaxScaler
语法:
- MinMaxScalar(feature_range=(0,1)…)
- 每个特征缩放到给定范围(默认[0,1])
- MinMaxScalar.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
标准化API:
scikit-learn.preprocessing.StandardScaler
语法:
- StandardScaler(…)
- 处理之后每列来说所有数据都聚集在均值0附近标准差为1
- StandardScaler.fit_transform(X,y)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
- StandardScaler.mean_
- 原始数据中每列特征的平均值
- StandardScaler.std_
- 原始数据每列特征的方差
6、数据的特征选择
概述:特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,
特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯
定比选择前小,毕竟我们只选择了其中的一部分特征。
特征选择的原因:
- 冗余:部分特征的相关度高,容易消耗计算性能
- 噪声:部分特征对预测结果有负影响
主要方法(三大武器):
Filter(过滤式):VarianceThreshold==>通过方差来过滤(比如过滤掉方差为0[即所有样本的该特 征都一样]的特征)
sklearn特征选择API:
sklearn.feature_selection.VarianceThreshold
语法:
- VarianceThreshold(threshold = 0.0) ==>删除方差为0的特征
- 删除所有低方差特征
- Variance.fit_transform(X,y)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:训练集差异低于threshold的特征将被删除。
- 默认值是保留所有非零方差特征,即删除所有样本
- 中具有相同值的特征。
Embedded(嵌入式):正则化、决策树
Wrapper(包裹式)
7、降维(减少特征数)
API:sklearn. decomposition
方法:
PCA(主成分分析):
使用场景:当特征数量达到上百个之后
本质:PCA是一种分析、简化数据集的技术
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
作用:可以削减回归分析或者聚类分析中特征的数量
API:sklearn. decomposition.PCA
语法:
- PCA(n_components=None)
- 将数据分解为较低维数空间
- n_components:当为小数的时候,范围为0~1,是指保留的信息量(一般保留90%-95%,数值太小会对结果又影响,最优需要根据实际情况调参)
当为整数的时候,是指减少到的特征数量(一般不设置为整数)
- PCA.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
返回值:转换后指定维度的array