特征选择其实就是减少属性个数,为什么要这么做呢?直接使用原始数据来训练模型的话,虽然说在训练模型上的准确率会非常高,但是在测试样本上的准确率将会大打折扣,也就是会产生过拟合的现象。所以说需要选择出最适合的属性进行训练。
特征选择的原因:
1、冗余:部分特征的相关度高,容易消耗计算机性能
2、噪声:部分特征对预测结果又影响
进行特征选择的时候有两种情况:一种是知道特征和项目目的及背景的时候,手动的去选择一些合适的特征。另一种是在公司进行开发的时候,数据已经有了并且属性的量比较多,在这个时候人工去选择特征是不可能的事情,这个时候就只能借助工具来实现特征选择这一需求了。
特征选择主要方法
Filter:Variance Threshold
Embedded:正则化、决策树
Wrapper
Variance Threshold
删除所有低方差特征,因为方差值越低,特征的接近程度也就越高,当方差为0的时候,当前特征所有的特征值是一样的。(Threshold:阀值,阀值的大小根据实际需求进行调整)
下面是代码:
def var():
"""
特征选择-删除低方差的特征
:return: None
"""
var = VarianceThreshold(threshold=0.0)
data = var.fit_transform([[0,2,0,3],[0,1,4,3],[0,1,1,3]])
print(data)
运行结果
主成分分析
PCA本质:PCA是一种分析、简化数据集的技术
目的:使数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
作用:可以削减回归分析或则聚类分析中特征的数量
应用场景:特征数量达到上百的时候,考虑数据的简化(数据会改变,特征也会减少)
高维度容易出现的问题:特征之间是相关的(PCA原理以后再分析)
使用PCA进行降维的代码:
def pca():
"""
主成分分析进行降维
:return: None
"""
pca = PCA(n_components=0.9)#n_component填小数时,表示保留百分之多少的信息,填整数表示降多少维
data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)
return None
运行结果
下面是对数据进行降维处理的一个小案例(kaggle上的instacart)
首先需求是把数据处理成一个用户代表一个数据项,属性为商品类别,即每个用户买了多少该类别的商品
数据集上中有四张表分别是
products.csv:商品信息
order_products_train.csv:订单与商品信息
orders.csv:用户的订单信息
aisles.csv:商品所属具体物品分类
我们要做的工作如下:
1、将四张表合成一张表(使用pandas.merge()实现)
2、建立类似行,列数据即算法可用的形式(使用交叉表实现)
3、进行主成分分析
代码如下:
def instacart():
"""
处理市场篮子数据
:return: None
"""
#读取四张表的数据
train = pd.read_csv("./data/instacart/order_products__train.csv")
products = pd.read_csv("./data/instacart/products.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")
#合并四张表到一张表(用户-物品类别)
#merge()参数说明:合并的两张表的名字,以什么键合并
_mg = pd.merge(train,products,on=['product_id','product_id'])
_mg = pd.merge(_mg,orders,on=['order_id','order_id'])
mt = pd.merge(_mg,aisles,on=['aisle_id','aisle_id'])
print(mt.head(10))
#交叉表(特殊的分组工具)
#crosstab()第一个参数代表行属性,第二个参数代表列属性
cross = pd.crosstab(mt['user_id'],mt['aisle'])
print(cross.head(10))
#进行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
print(data)
return None