特征工程之特征选择

特征选择其实就是减少属性个数,为什么要这么做呢?直接使用原始数据来训练模型的话,虽然说在训练模型上的准确率会非常高,但是在测试样本上的准确率将会大打折扣,也就是会产生过拟合的现象。所以说需要选择出最适合的属性进行训练。

特征选择的原因:

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值