机器学习(二)
特征工程
数据集
Kaggle网址:https://www.kaggle.com/datasets
UCI数据集网址: http://archive.ics.uci.edu/ml/
scikit-learn网址:http://scikit-learn.org/stable/datasets/index.html#datasets
- sklearn安装
- 打开pycharm点击下面的Terminal
运行:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ scikit-learn==0.19.2
安装scikit-learn需要Numpy, Scipy等库
sklearn数据集
- scikit-learn数据集API介绍
1.sklearn.datasets
加载获取流行数据集
2.datasets.load_()
获取小规模数据集,数据包含在datasets里
3.datasets.fetch_(data_home=None)
获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
小数据集
from sklearn import datasets
sklearn.datasets.load_iris()
大数据集
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
subset:‘train’或者’test’,‘all’,可选,选择要加载的数据集。
训练集的“训练”,测试集的“测试”,两者的“全部”
- 返回值类型
load和fetch返回的数据类型:datasets.base.Bunch(字典格式)
data:特征数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组
target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
DESCR:数据描述
feature_names:特征名,新闻数据,手写数字、回归数据集没有
target_names:标签名
数据集划分
机器学习一般的数据集会划分为两个部分:
训练数据:用于训练,构建模型
测试数据:在模型检验时使用,用于评估模型是否有效
- 数据集划分api
sklearn.model_selection.train_test_split(arrays, *options)
x 数据集的特征值
y 数据集的标签值
test_size 测试集的大小,一般为float
random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
return 测试集特征训练集特征值值,训练标签,测试标签(默认随机取)
from sklearn.model_selection import train_test_split
# 训练集的特征值x_train 测试集的特征值x_test 训练集的目标值y_train 测试集的目标值y_test
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
特征工程
机器学习领域的大神Andrew Ng(吴恩达)老师说“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ”
注:业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。(会直接影响机器学习的效果)
- 特征工程的位置
特征提取
将任意数据(如文本或图像)转换为可用于机器学习的数字特征。
字典特征提取(特征离散化)
对字典数据进行特征值化
- sklearn.feature_extraction.DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names() 返回类别名称
举例:对以下数据进行特征提取
[{‘city’: ‘北京’,‘temperature’:100}
{‘city’: ‘上海’,‘temperature’:60}
{‘city’: ‘深圳’,‘temperature’:30}]
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
"""
对字典类型的数据进行特征抽取
:return: None
"""
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())
return None
没有加上sparse=False参数的结果
加上参数,得到想要的结果:
- 处理数据的技巧叫做”one-hot“编码,对于特征当中存在类别信息的我们都会做one-hot编码处理。
文本特征提取
对文本数据进行特征值化
- sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
返回词频矩阵
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
stop_words:不统计stop_words中的词
CountVectorizer.get_feature_names() 返回值:单词列表
举例:对以下数据进行特征提取
[“life is short,i like python”, “life is too long,i dislike python”]
from sklearn.feature_extraction.text import CountVectorizer
def text_count_demo():
"""
对文本进行特征抽取,countvetorizer
:return: None
"""
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、实例化一个转换器类
# transfer = CountVectorizer(sparse=False)
transfer = CountVectorizer()
# 2、调用fit_transform 输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)
data = transfer.fit_transform(data)
print("文本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names())
return None
返回结果:
注意:将数据替换成中文,使用jieba进行分词
- jieba.cut()
返回词语组成的生成器
Tf-idf文本特征提取
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
- 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
- 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
图像特征提取
深度学习内容
特征预处理
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征,于是通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。
数值型数据的无量纲化
- 归一化
通过对原始数据进行变换把数据映射到(默认为[0,1])之间
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
MinMaxScalar.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_demo():
"""
归一化演示
:return: None
"""
data = pd.read_csv("dating.txt")
print(data)
# 1、实例化一个转换器类
transfer = MinMaxScaler(feature_range=(2, 3))
# 2、调用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("最小值最大值归一化处理的结果:\n", data)
return None
总结:最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
- 标准化
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
sklearn.preprocessing.StandardScaler( ) 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
StandardScaler.fit_transform(X) X:numpy
array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array
import pandas as pd
from sklearn.preprocessing import StandardScaler
def stand_demo():
"""
标准化演示
:return: None
"""
data = pd.read_csv("dating.txt")
print(data)
# 1、实例化一个转换器类
transfer = StandardScaler()
# 2、调用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("标准化的结果:\n", data)
print("每一列特征的平均值:\n", transfer.mean_)
print("每一列特征的方差:\n", transfer.var_)
return None
总结:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
特征降维
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程.
因为在进行训练的时候,我们都是使用特征进行学习。如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测会影响较大。所以需要进行降维。
特征选择
数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。
- 方法1 - Filter(过滤式)
主要探究特征本身特点、特征与特征和目标值之间关联
- 方差选择法:低方差特征过滤
删除低方差的一些特征,前面讲过方差的意义。再结合方差的大小来考虑这个方式的角度。
特征方差小:某个特征大多样本的值比较相近
特征方差大:某个特征很多样本的值都有差别
sklearn.feature_selection.VarianceThreshold(threshold = 0.0) 删除所有低方差特征
Variance.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
from sklearn.feature_selection import VarianceThreshold
def variance_demo():
"""
删除低方差特征——特征选择
:return: None
"""
data = pd.read_csv("factor_returns.csv")
print(data)
# 1、实例化一个转换器类 # threshold过滤掉不太重要的特征 去掉方差《=1的
transfer = VarianceThreshold(threshold=1)
# 2、调用fit_transform
data = transfer.fit_transform(data.iloc[:, 1:10])
print("删除低方差特征的结果:\n", data)
print("形状:\n", data.shape)
return None
- 相关系数
皮尔逊相关系数(Pearson Correlation Coefficient)
反映变量之间相关关系密切程度的统计指标
解读:
相关系数的值介于–1与+1之间,即–1≤ r ≤+1。其性质如下:
当r>0时,表示两变量正相关,r<0时,两变量为负相关 当|r|=1时,表示两变量为完全相关,当r=0时,表示两变量间无相关关系
当0<|r|<1时,表示两变量存在一定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱
一般可按三级划分:|r|<0.4为低度相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关
API:
from scipy.stats import pearsonr
x : (N,) array_like
y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)
def pearson_relation(data):
# 皮尔逊相关系数范围[-1,1], 如果大于0就是正相关(越接近1就越相关), 反之亦然
r = pearsonr(data["milage"], data["Liters"])
print("milage和Liters的相关系数为:\n", r)
# show_relation(data["milage"], data["milage"])
# 计算相关系数及显著性
# r: 相关系数[-1,1]之间,p - value: p值。
# 注: p值越小,表示相关系数越显著,一般p值在500个样本以上时有较高的可靠性。
r = pearsonr(data["milage"], data["Consumtime"])
print("milage和Liters的相关系数为:\n", r)
# 如果相关性高可用以下方法:
# 1 选取其中一个特征
# 2 两个特征加权求和,进行合并
# 3 主成分分析(高维数据变低维,舍弃原由数据,创造新数据,如: 压缩数据维数,降低原数据复杂度,损失少了信息)
return None
- 方法2 - Embedded(嵌入式)
算法自动选择特征(特征与目标值之间的关联)
-
决策树:信息熵、信息增益
-
正则化:L1、L2
-
深度学习:卷积等
-
List item
主成分分析
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
应用:回归分析或者聚类分析当中
- API
sklearn.decomposition.PCA(n_components=None) 将数据分解为较低维数空间
n_components: 小数:表示保留百分之多少的信息 整数:减少到多少特征 PCA.fit_transform(X) X:numpy
array格式的数据[n_samples,n_features] 返回值:转换后指定维度的array
from sklearn.decomposition import PCA
def pca_demo():
"""
对数据进行PCA降维
:return: None
"""
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 1、实例化PCA, 小数——保留多少信息
transfer = PCA(n_components=0.9)
# 2、调用fit_transform
data1 = transfer.fit_transform(data)
print("保留90%的信息,降维结果为:\n", data1)
# 1、实例化PCA, 整数——指定降维到的维数
transfer2 = PCA(n_components=3)
# 2、调用fit_transform
data2 = transfer2.fit_transform(data)
print("降维到3维的结果:\n", data2)
return None