Datawhale 零基础入门数据挖掘-Task3

1 特征工程定义

特征工程本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下方面:

2 数据探查与预处理

个人将主要数据探查和预处理方法归结如下图所示:

3 常见方法与代码

3.1 特征归一化/标准化

3.1.1 (0,1)标准化:

这是最简单也是最容易想到的方法,通过遍历feature vector里的每一个数据,将Max和Min的记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理:

Python实现:

def MaxMinNormalization(x,Max,Min):
	x = (x - Min) / (Max - Min)
	return x

找大小的方法直接用np.max()和np.min()就行了。

3.1.2 Z-score标准化:

这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,这里的关键在于复合标准正态分布,个人认为在一定程度上改变了特征的分布,关于使用经验上欢迎讨论,我对这种标准化不是非常地熟悉,转化函数为:

Python实现:

def Z_ScoreNormalization(x,mu,sigma):
	x = (x - mu) / sigma
	return x

这里一样,mu(即均值)用np.average(),sigma(即标准差)用np.std()即可。

3.1.3 Sigmoid函数

Sigmoid函数是一个具有S形曲线的函数,是良好的阈值函数,在(0, 0.5)处中心对称,在(0, 0.5)附近有比较大的斜率,而当数据趋向于正无穷和负无穷的时候,映射出来的值就会无限趋向于1和0,是个人非常喜欢的“归一化方法”,之所以打引号是因为我觉得Sigmoid函数在阈值分割上也有很不错的表现,根据公式的改变,就可以改变分割阈值,这里作为归一化方法,我们只考虑(0, 0.5)作为分割阈值的点的情况:

Python实现:

def sigmoid(X,useStatus):
	if useStatus:
		return 1.0 / (1 + np.exp(-float(X)))
	else:
		return float(X)

这里useStatus管理是否使用sigmoid的状态,方便调试使用。

3.2 缺失值处理

在实际应用中对于数据进行分析的时候,经常能看见缺失值,下面来介绍一下如何利用pandas来处理缺失值。常见的缺失值处理方式有,过滤、填充。

3.2.1 缺失值的判断

pandas使用浮点值NaN(Not a Number)表示浮点数和非浮点数组中的缺失值,同时python内置None值也会被当作是缺失值。

(1)Series的缺失值判断

    s = Series(["a","b",np.nan,"c",None])
    print(s)
  
    #判断缺失值,如果是则返回True,否则返回False
    print(s.isnull())

    #输出缺失值的索引和值
    print(s[s.isnull()])

(2)DataFrame的缺失值判断

    a = [[1,np.nan,2],[3,4,None]]
    data = DataFrame(a)
    #DataFrame的None值变成了NaN
    print(data)

    print(data.isnull())

    print(data[data.isnull()])

在使用Series和DataFrame的时候,如果其中有值为None,Series会输出None,而DataFrame会输出NaN,但是对空值判断没有影响。DataFrame使用isnull方法在输出空值的时候全为NaN,因为DataFrame对于False对应的位置,输出值会使用NaN代替,而Series对于Fasel对应的位置是没有输出值的。

3.2.2 过滤缺失数据

(1)Series的缺失值过滤

    s = Series(["a","b",np.nan,"c",None])
    #通过使用notnull方法来获取非缺失数据
    print(s[s.notnull()])

    #使用dropna方法删除缺失数据,返回一个删除后的Series
    print(s.dropna())

    #并没有在原来的Series上进行直接删除
    print(s)

    #通过设置inplace参数为True,在原Series上进行删除,不会返回Series
    print(s.dropna(inplace=True))
    #None
    print(s)

(2)DataFrame的缺失值过滤

DataFrame删除缺失值相对于Series而言就要复杂一些,也许有的时候你是想删除含有缺失值的行或列,也许有时候你需要删除的是,当整行或整列全为缺失值的时候才删除,好在pandas对于这两种情况都有相对应的处理方法。

    #(1)删除含有缺失值的行和列
    a = [[1, np.nan, 2],[9,None,np.nan],[3, 4, None],[5,6,7]]
    data = DataFrame(a)
    print(data)

    #使用dropna方法删除含有缺失值的行,默认是行
    print(data.dropna())

    #删除含有缺失值的列
    print(data.dropna(axis=1))



    #(2)删除全为NaN的行和列
    a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
    data = DataFrame(a)
    print(data)

    #当行全为NaN的时候,才删除,参数how默认是any,含有缺失值就删除
    print(data.dropna(how="all"))

    #当列全为NaN的时候,才删除
    print(data.dropna(how="all",axis=1))

dropna方法的inplace的设置与Series一样。

3.2.3填充缺失值

数据都是宝贵的,也许有时候你的数据不够多,因为数据越多对于模型的训练,数据分析都是有好处的,所以很多的时候我们都不想删除数据。通常情况下,也许你会选择用一些特殊值来填充缺失值。下面介绍使用pandas的fillna方法来填充缺失数据。

(1)指定特殊值填充缺失值

    a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
    data = DataFrame(a)
    print(data)

    #用0填充所有的缺失数据
    print(data.fillna(0))

(2)不同列使用不同的填充值

    a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
    data = DataFrame(a)
    print(data)

    print(data.fillna({1:1,2:2}))

(3)前向填充和后向填充

    a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
    data = DataFrame(a)
    print(data)

    #前向填充,使用默认是上一行的值,设置axis=1可以使用列进行填充
    print(data.fillna(method="ffill"))

    #后向填充,使用下一行的值,不存在的时候就不填充
    print(data.fillna(method="bfill"))

(4)使用列的平均值进行填充

    a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
    data = DataFrame(a)
    print(data)

    print(data.fillna(data.mean()))

4 思考与总结

与很多前辈一样,个人也觉得,特征工程是一个入门简单,但想精通非常难的一件事。

特征工程的主要目的还是在于将数据转换为能更好地表示潜在问题的特征,从而提高机器学习的性能。一切特征工程的处理都是为了最终提高预测准确率服务的,可能在使用机器学习算法的过程中,需要不断回溯、调整特征工程的处理方法,直到达到最好的效果。个人以为,想要提高在特征工程处理方面的能力,一方面需要大量的练习以获得足够的经验,另一方面也需要针对不同的项目进行不断的尝试,运气也是优秀结果的一部分,有时候“试”出一份很棒的结果时,再回推过程,可能会发现之前没有发现的一些有趣的点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值