目录
- sklearn数据集
- 简单了解特征工程
- 特征提取
- 特征预处理
- 特征降维
- 总结
1 sklearn数据集
import sklearn
from sklearn import datasets
sklearn.datasets # 加载获取流行数据集
datasets.load_*() # 获取小规模数据集,数据包含在datasets里
datasets.fetch_*(data_home = None) # 获取大规模数据集,data_home参数表示数据集下载的目录,默认是~/scikit_learn_data/
1.1 sklearn小数据集
import sklearn
from sklearn import datasets
(sklearn.datasets.load_iris()).head(5) # 加载并返回鸢尾花数据集
(sklearn.datasets.load_boston()).head(5) # 加载并返回波士顿房价数据集
1.2 sklearn大数据集
import sklearn
from sklearn import datasets
sklearn.datasets.fetch_20newsgroups(data_home=None, subset='train')
# subset:'train'或者'test','all',可选,选择要加载的数据集
# 训练集的“训练”,测试集的“测试”,两者的“全部”
1.4 sklearn数据集返回值介绍
load和fetch返回的数据类型datasets.base.Bunch(字典格式)
- data:特征数据数组,是[n_samples * n_features]的二维numpy.ndarray数组
- target:标签数组,是n_samples的一维numpy.ndarray数组
- DESCR:数据描述
- feature_names:特征名
- target_names:标签名
1.5 数据集的划分
机器学习一般的数据集会划分为两部分:
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
划分比例: - 训练集:70% 80% 75%
- 测试集:30% 20% 30%
2 简单了解特征工程
机器学习领域的Andrew Ng(吴恩达)老师说过:“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering.”
业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
2.1 什么是特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程,会直接影响机器学习的效果。
2.2 特征工程包含内容
- 特征抽取
- 特征预处理
- 特征降维
具体可参考学习:特征提取、特征选择、特征构建
3 特征提取
特征值化是为了计算机更好地去理解数据
3.1 字典特征提取
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X) # X表示字典或包含字典的迭代器,返回sparse矩阵
DictVectorizer.inverse_transform(X) # X表示array数组或sparse矩阵,返回转化之前的数据格式
DictVectorizer.get_feature_names() # 返回类别名称
from sklearn.feature_extraction import DictVectorizer
def function():
data = [{'city':'北京','temperature':100}, {'city':'上海','temperature':60}, {'city':'深圳','temperature':30}]
# 1、实例化一个转换器类
transfer = DictVectorizer(sparse=False)
# 2、调用fit_transform
data = transfer.fit_transform(data)
print("返回结果:\n", data)
print("特征名字:\n", transfer.get_feature_names())
function()
总结:
对于特征当中存在类别信息的时候,可以做one-hot编码处理
在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算很重要的,常用的距离或相似度的计算是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
而one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。
将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。
具体可参考学习:one-hot
3.2 文本特征提取
sklearn.feature_extraction.text.CountVectorizer(stop_words=[]) # 返回词频矩阵
CountVectorizer.fit_transform(X) # X表示文本或包含文本字符串的可迭代对象,返回sparse矩阵
CountVectorizer.inverse_transform(X) # X表示array数组或sparse矩阵,返回之前的数据格式
CountVectorizer.get_feature_names() # 返回值是单词列表
sklearn.feature_extraction.text.TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
def function():
data = ["life is short, i like python","life is too long, i dislike pyhon"]
# 1、实例化一个转换器类
transfer = CountVectorizer()
# 2、调用fit_transform
data = transfer.fit_transform(data)
print("文本特征提取结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names())
function()
总结:
(1) 在这里,英文默认是以空格分开的,这其实已经达到了分词的效果,而对于中文文本,需要进行分词处理
(2)而这里应该注意的是如何处理某个词或短语在多篇文章中出现的次数高这种情况,主要用到的是TF-IDF文本特征提取(TF-IDF是分类机器学习算法进行文章分类中前期数据的处理方式)
4 特征预处理
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征。因此需要通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。
4.1 归一化
通过对原始数据进行变换,把数据映射到(默认为[0,1])之间
X ′ = x − m i n m a x − m n i X'=\frac{x-min}{max-mni} X′=max−mnix−min
sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)...)
MinMaxScalar.fit_transform(X) # X表示numpy array格式的数据[n_samples,n_features],返回转换后的形状相同的array
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def function():
data = np.mat(np.random.randint(0,10,(4,3))) # random.randint创建的是一个数组,需要将其转化为matrix
print("原数据:\n", data)
# 1、实例化一个转换器类
transfer = MinMaxScaler(feature_range=(0,1)) # 0-1之间
#2、调用fit_transform
data = transfer.fit_transform(data)
print("最小值最大值归一化处理的结果:\n", data)
function()
总结:
最大值最小值容易受异常点影响,这种方法鲁棒性较差,只适合传统精确小数据场景。
4.2 标准化
通过对原始数据进行变化把数据变化到均值为0,标准差为1的范围内
X
′
=
x
−
m
e
a
n
σ
X'=\frac{x-mean}{\sigma}
X′=σx−mean
理解:作用于每一列,mean为平均值,
σ
\sigma
σ为标准差
- 对于归一化来说:如果出现异常点,影响了最大值和最小值,结果会发生变化
- 对于标准化来说:如果出现异常点,因为有一定的数据量,少量的异常点对平均值的影响并不大,从而方差改变较小
sklearn.preprocessing.StandardScaler()
StandardScaler.fit_transform(X) # X表示numpy array格式的数据[n_samples,n_features],返回转化后的形状相同的array
import pandas as pd
from sklearn.preprocessing import StandardScaler
def function():
data = np.mat(np.random.randint(0,10,(4,3))) # random.randint创建的是一个数组,需要将其转化为matrix
print("原数据:\n", data)
# 1、实例化一个转换器类
transfer = StandardScaler()
# 2、调用fit_transform
data = transfer.fit_transform(data)
print("标准化的结果:\n", data)
print("每一列的平均值:\n", transfer.mean_)
print("每一列的方差:\n", transfer.var_)
function()
总结: 标准化在已有样本足够多的情况下比较稳定,适合现代嘈杂的大数据场景。
5 特征降维
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程。因为在进行训练的适合,我们都是用特征进行学习,如果特征本身存在问题或者特征之间的相关性较强的话,对算法学习预测的影响会很大。
降维的两种方式
- 特征选择
- 主成分分析(感觉也可以理解成特征提取)
5.1 特征选择
数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。
方法:
-
Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间的关联
方差选择法:低方差特征过滤
相关系数 -
Embedded(嵌入式):算法自动选择特征(特征与目标值之间的关联)
决策树:信息熵、信息增益
正则化:L1、L2
深度学习:卷积等
sklearn.feature_selection.VarianceThreshold(threshold=0.0) # 删除所有低方差特征
Variance.fit_transform(X) # X表示numpy array格式的数据[n_samples,n_features],训练集差异低于threshold的特征将被删除,默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征
5.2 相关系数
皮尔逊相关系数(Pearson Correlation Coefficient):反映变量之间相关关系密切程度的统计指标
r
=
n
∑
x
y
−
∑
x
∑
y
n
∑
x
2
−
(
∑
x
)
2
)
n
∑
y
2
−
(
∑
y
)
2
r=\frac{n\sum xy-\sum x\sum y}{\sqrt{n\sum x^2-(\sum x)^2)} \sqrt{n\sum y^2 -(\sum y)^2}}
r=n∑x2−(∑x)2)n∑y2−(∑y)2n∑xy−∑x∑y
具体介绍可参考:https://blog.youkuaiyun.com/shijing_0214/article/details/50866477
from scipy.stats import pearsonr
# numpy(np.corrcoef())、pandas(data.corr())也可以计算皮尔逊相关系数
6 总结
1、对于特征提取
一般常用方法包括降维(PCA、ICA、LDA)等、图像方面的SIFT、Gabor、HOG等、文本方面的词袋模型、词嵌入模型等
先前学习了解的词袋模型是对文本的特征提取,LDA主题建模提取出的主题及TF-IDF得到的关键词也相当于是文本特征
2、对于特征选择
常见的特征选择分为三类方法:过滤式(filter)、包裹式(wrapper)、嵌入式(embedding)