2.1 数据集
2.1.1离散型
离散变量是指其数值只能用自然数或整数单位计算的则为离散变量.例如,班级人数、进球个数、是否是某个类别等等。
2.1.2 连续型
连续型数据是指在指定区间内可以是任意一个数值,例如,票房数据、花瓣大小分布数据。
首先连续型数据是有规律的,离散型数据是没有规律的
只要记住一点,离散型是区间内不可分,连续型是区间内可分
2.1.3 数据集的数据结构组成
特征值+目标值
2.2 特征工程
2.2.1 为何要特征工程
“数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这句话很好的阐述了数据在机器学习中的重要性。大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据,那么需要进行一些特征处理,特征的缩放等等,满足训练数据的要求。
最初的原始特征数据集可能太大,或者信息冗余,因此在机器学习的应用中,一个初始步骤就是选择特征的子集,或构建一套新的特征集,减少功能来促进算法的学习,提高泛化能力和可解释性。
例如:你要查看不同地域女性的穿衣品牌情况,预测不同地域的穿衣品牌。如果其中含有一些男性的数据,是不是要将这些数据给去除掉
2.2.2 特征工程
特征是数据中抽取出来的对结果预测有用的信息,可以是文本或者数据。
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。过程包含了特征提取、特征构建、特征选择等模块。
特征工程的目的是筛选出更好的特征,获取更好的训练数据。因为好的特征具有更强的灵活性,可以用简单的模型做训练,更可以得到优秀的结果。“工欲善其事,必先利其器”,特征工程可以理解为利其器的过程。互联网公司里大部分复杂的模型都是极少数的数据科学家在做,大多数工程师们做的事情基本是在数据仓库里搬砖,不断地数据清洗,再一个是分析业务不断地找特征。 例如,某广告部门的数据挖掘工程师,2周内可以完成一次特征迭代,一个月左右可以完成模型的小优化,来提升auc。
https://www.cnblogs.com/infaraway/p/8645133.html
2.2.3 特征工程的意义
1.更好的特征意味着更强的鲁棒性
2.更好的特征意味着只需用简单模型
3.更好的特征意味着更好的结果
2.3 特特征工程之特征处理
特征工程中最重要的一个环节就是特征处理,特征处理包含了很多具体的专业技巧。
特征处理其实就是在对已有的数据进行运算达到我们目标的数据标准。
特征预处理
单个特征
归一化
标准化
缺失值
多个特征
降维
PCA
个人认为:特征处理包括:特征提取,特征选择,特征预处理
2.3.1 特征工程之特征抽取
特征抽取则是将任意数据格式(例如文本和图像)转换为机器学习的数字特征。
而特征选择是在已有的特征中选择更好的特征。
现实世界中多数特征都不是连续变量,比如分类、文字、图像等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,因此就用到了特征提取. sklearn.feature_extraction提供了特征提取的很多方法
2.3.1.1文本特征提取(只限于英文)
文本的特征提取应用于很多方面,比如说文档分类、垃圾邮件分类和新闻分类。那么文本分类是通过词是否存在、以及词的概率(重要性)来表示。
(1)文档的中词的出现
数值为1表示词表中的这个词出现,为0表示未出现
sklearn.feature_extraction.text.CountVectorizer()
将文本文档的集合转换为计数矩阵(scipy.sparse matrices)
fit_transform(raw_documents,y) 学习词汇词典并返回词汇文档矩阵
需要toarray()方法转变为numpy的数组形式
温馨提示:每个文档中的词,只是整个语料库中所有词,的很小的一部分,这样造成特征向量的稀疏性(很多值为0)为了解决存储和运算速度的问题,使用Python的scipy.sparse矩阵结构
#文本的特征提取
def dictVecText():
cv=CountVectorizer();
data=cv.fit_transform(["life is short,but i love python","python is easy language"])
print(cv.get_feature_names())
print(data.toarray())
return None
#调用文本的特征提取
dictVecText();
2.3.1.2字典数据的特征提取
我们将城市和环境作为字典数据,来进行特征的提取。
sklearn.feature_extraction.DictVectorizer(sparse = True)
将映射列表转换为Numpy数组或scipy.sparse矩阵
sparse 是否转换为scipy.sparse矩阵表示,默认开启
fit_transform(X,y)
应用并转化映射列表X,y为目标类型
inverse_transform(X[, dict_type])
将Numpy数组或scipy.sparse矩阵转换为映射列表
#字典的特征抽取
def dictVec():
dict=DictVectorizer(sparse=False);
data=dict.fit_transform(list);
print(dict.get_feature_names())
print(data);
return None;
2.3.1.3 中文文本的特征提取
def splitWords2():
content1="Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发";
content2="Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。";
#分词
cuts1=jieba.cut(content1);
cuts2=jieba.cut(content2);
print(cuts1)
#转成列表
cList01=list(cuts1);
cList02=list(cuts2);
#转成字符串
str1=" ".join(cList01);
str2=" ".join(cList02);
return str1,str2;
def chineseTextVec2():
cv=CountVectorizer();
c1,c2=splitWords2();
data=cv.fit_transform([c1,c2])
print(cv.get_feature_names())
print(data.toarray())
结果:
2.3.1.4 TF和IDF特征提取
TF:TERM FRENCENCY 词频 出现的次数
IDF:IVERSE DOCUMENT FREQUENCY log(总文档数/该词出现的文档数量)
TF-IDF:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为改词或者短语具有很好的类别区分能力,适合用来分类。
作用:用以评估一个字词对于一个文件集或一个语料库中的其中一个文件的重要程度。
def splitWords2():
content1="Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发";
content2="Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。";
#分词
cuts1=jieba.cut(content1);
cuts2=jieba.cut(content2);
print(cuts1)
#转成列表
cList01=list(cuts1);
cList02=list(cuts2);
#转成字符串
str1=" ".join(cList01);
str2=" ".join(cList02);
return str1,str2;
def tfidfTextVec2():
tf=TfidfVectorizer();
c1,c2=splitWords2();
data=tf.fit_transform([c1,c2])
print(tf.get_feature_names())
print(data.toarray())
2.3.2 特征工程之特征预处理
通过特定的统计方法(数学方法)将数据转换成算法要求的数据。
数值型数据:标准缩放:
1、归一化
2、标准化
3、缺失值
类别型数据:one-hot编码
时间类型:时间的切分
2.3.2.1归一化
归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,这样比较起来才有意义,其次可以程序可以运行更快。 例如:一个人的身高和体重两个特征,假如体重50kg,身高175cm,由于两个单位不一样,数值大小不一样。如果比较两个人的体型差距时,那么身高的影响结果会比较大,k-临近算法会有这个距离公式。
min-max方法
常用的方法是通过对原始数据进行线性变换把数据映射到[0,1]之间,变换的函数为:
其中min是样本中最小值,max是样本中最大值,注意在数据流场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
from sklearn.preprocessing import MinMaxScaler
list1=[90,2,10,40];
list2=[60,4,15,45];
list3=[75,3,13,46];
list=[];
list.append(list1)
list.append(list2)
list.append(list3)
print(list)
def guiyihua():
mm=MinMaxScaler();#默认归一化区间为0,1
data=mm.fit_transform(list);
print(data);
return None;
guiyihua();
2.3.2.2 标准化
将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。https://blog.csdn.net/bbbeoy/article/details/70185798
z-score 标准化(zero-meannormalization)也叫标准差标准化,经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
常用的方法是z-score标准化,经过处理后的数据均值为0,标准差为1,处理方法是:
适应于在已有的样本足够多的情况下比较稳定,适合嘈杂的数据场景
def standDeal():
X_train = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
std = StandardScaler()
X_train_std = std.fit_transform(X_train)
print(X_train_std)
#guiyihua();
standDeal();
2.3.2.3 缺省值处理
#from sklearn.preprocessing import Imputer 0.22版本没有此函数
from sklearn.impute import SimpleImputer
def fitempty():
train_X = np.array([[1, 2], [np.nan, 3], [7, 6]])
#imp = SimpleImputer(missing_values=np.nan, strategy='mean', axis=0)
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
print(imp.fit(train_X));
data=imp.fit_transform(train_X);
print(data);
return None;
2.3.3 特征工程之特征降维
2.3.3.1 特征选择
特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,
特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯
定比选择前小,毕竟我们只选择了其中的一部分特征。
为何要进行特征选择:
冗余:部分特征的相关度高,容易消耗计算性能
噪声:部分特征对预测结果有负影响
而对于特征选择来说,有很多方法:
Filter(过滤式):VarianceThreshold
Embedded(嵌入式):正则化、决策树
Wrapper(包裹式)
其中过滤式的特征选择后,数据本身不变,而数据的维度减少。而嵌入式的特征选择方法也会改变数据的值,维度也改变。Embedded方式是一种自动学习的特征选择方法,后面讲到具体的方法的时候就能理解了。
特征选择主要有两个功能:
(1)减少特征数量,降维,使模型泛化能力更强,减少过拟合
(2)增强特征和特征值之间的理解
from sklearn.feature_selection import VarianceThreshold
##特征选择-删除方差低的特征
def jiangwei():
var=VarianceThreshold(threshold=0.0);
data=var.fit_transform([[0,2,0,3],[0,1,4,3],[0,1,1,3]])
print(data)
return None;
jiangwei()
'''
[0,2,0,3],
[0,1,4,3],
[0,1,1,3]
第一列,第四列的方差均为0,所以舍弃
'''
2.3.3.2 PCA(主成分分析-多维度降维)
PCA(Principal component analysis),主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA极其容易受到数据中特征范围影响,所以在运用PCA前一定要做特征标准化,这样才能保证每维度特征的重要性等同。
本质:PCA是一种分析、简化数据集的技术
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
作用:可以削减回归分析或者聚类分析中特征的数量
PCA顾名思义,就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据。具体的,假如我们的数据集是n维的,共有m个数据。我们希望将这m个数据的维度从n维降到n’维,希望这m个n’维的数据集尽可能的代表原始数据集。我们知道数据从n维降到n’维肯定会有损失,但是我们希望损失尽可能的小。那么如何让这n’维的数据尽可能表示原来的数据
说白点:假设100个特征,就是将100个特征,通过pca降维到10个特征,这10个特征就能代表了这个100个特征的功能。
通俗理解:就是找出一个最主要的特征,然后进行分析。
def pcademo():
r=PCA(n_components=0.9);
data=r.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)
return None;
pcademo();
2.4 案例一 用户对物品类别的喜好细分降维
2.4.1 数据
数据:
products.csv 商品信息
order_products__prior.csv 订单与商品信息
orders.csv 用户的订单信息
aisles.csv 商品所属具体物品类别
#将各个表的数据合并到一张表中:
Prior: product_id,order_id;
Products:product_id,aisle_id
Prders:order_id,user_id;
Aisle:aisle_id ,asile
数据集下载来源地址(应该是国外的一个菜篮子项目):
https://www.kaggle.com/c/instacart-market-basket-analysis/data
资源:链接: https://pan.baidu.com/s/16aOgoEfFVcm6DWE46XbZYQ 提取码: vbzs
狗日的:通过官网去下载,下载不下来,本人特意将下载下来的数据集上传到网盘中,还不为我的行为点赞,还在干什么呢。
import pandas as pd
from sklearn.decomposition import PCA
'''
数据如下:
order_products__prior.csv:订单与商品信息
字段:order_id, product_id, add_to_cart_order, reordered
products.csv:商品信息
字段:product_id, product_name, aisle_id, department_id
orders.csv:用户的订单信息
字段:order_id,user_id,eval_set,order_number,….
aisles.csv:商品所属具体物品类别
字段: aisle_id, aisle
https://blog.csdn.net/weixin_44513830/article/details/99937668
'''
def pcademo():
# 去读四张表的数据
prior = pd.read_csv("../data/order_products__prior.csv")
products = pd.read_csv("../data/products.csv")
orders = pd.read_csv("../data/orders.csv")
aisles = pd.read_csv("../data/aisles.csv")
#
products=products.head(1000);
orders=orders.head(1000);
# 合并四张表
mt = pd.merge(prior, products, on=['product_id', 'product_id'])
mt1 = pd.merge(mt, orders, on=['order_id', 'order_id'])
mt2 = pd.merge(mt1, aisles, on=['aisle_id', 'aisle_id'])
# pd.crosstab 统计用户与物品之间的次数关系(统计次数)
cross = pd.crosstab(mt2['user_id'], mt2['aisle'])
# PCA进行主成分分析
pc = PCA(n_components=0.95)
data = pc.fit_transform(cross)
print(data);
pcademo();
总结:
6.PCA算法总结
这里对PCA算法做一个总结。作为一个非监督学习的降维方法,它只需要特征值分解,就可以对数据进行压缩,去噪。因此在实际场景应用很广泛。为了克服PCA的一些缺点,出现了很多PCA的变种,比如第六节的为解决非线性降维的KPCA,还有解决内存限制的增量PCA方法Incremental PCA,以及解决稀疏数据降维的PCA方法Sparse PCA等。
PCA优点:
1)仅仅需要以方差衡量信息量,不受数据集以外的因素影响。
2)各主成分之间正交,可消除原始数据成分间的相互影响的因素。
3)计算方法简单,主要运算是特征值分解,易于实现。
PCA缺点:
1)主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。
2)方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。
https://blog.csdn.net/weixin_44513830/article/details/99937668