特征工程

1.基本数值特征

  • 对于刚拿到的数据,先进行缺失值处理

  • 对于离散值,我们常用 LabelEncoder OneHotEncoder来对其进行编码以方便识别。常用的为pandas中的get_dummies()方法,当然sklearn 也有对应的类

  • 对于二值特征:Sklearn中的二值化类是Binarizer,当然Pandas直接判断也很方便

  • 对于多项式特征:也就是多个特征指标的组合(一般支持向量机用的比较多,乘积、平方等等),使用PolynomialFeatures来实现。

  • 对于binning(连续)特征:可以做离散化,划分区间分成几个类(比如年龄),可以直接写map()函数映射。比较常用的方法,可以直接试一试,效果不好说。

  • 分位数切分: 四分位,二分位,四分之三分位等切分成离散的方式,常用pandans的quantile()方法,然后用qcut()的方法进行切分

  • 对数变换(COX-BOX): 对于分布是正态分布假设的算法(可以用偏度来判定),数据本身可能偏度很大,而做了对数变换有可能使得其更接近对数变换。使用numpy.log()即可。COX-BOX是另一种更复杂的对数变换,其目的也是让数据近似于正态分布。

2.日期特征处理

一般的日期转化为dataTime格式,可以直接把年月日拿出来用的数据(apply)。提取出年月日之后可以当成特征,也可以二次加工。比如四季、早晚、前半年、后半年等等。 整体的思路是:前期多提特征,后期再筛选。

3.文本特征处理

文本特征的难度是如何让计算机认识这些文字,文字本身对于计算机来说很难提取出特征
可以使用nltk工具包进行预处理,具体使用应该专门学习
关于语句的编码,常用的有词袋模型(对输入的词进行编码,句子中出现的词表示为1,未出现的词表示为0,其实就是词汇分布表,并包含有词频,sklearn中有对应的CountVectorizer)

4.时间序列的特征挖掘

  1. 统计特征 : 最大值(max),最小值(min),均值(mean),中位数(median),方差(variance),标准差(standard variance),偏度(skewness),峰度(kurtosis)
    关于偏度和峰度,它们是如下两个公式:

    \[\mu\,=\,\frac{1}{T}\sum_{i=1}^{T}x_i\] \[\sigma^{2}\,=\,\sum_{i=1}^{T}\frac{1}{T}(x_i - \mu)^{2}\] \[skewness(X)\,=\,E[(\frac{X\,-\,\mu}{\sigma})^{3}]\,=\,\frac{1}{T}\,\sum_{i=1}^{T}\frac{(x_i\,-\,\mu)^3}{\sigma^{3}}\] \[kurtosis(X)\,=\,E[(\frac{X\,-\,\mu}{\mu})^4]\,=\,\frac{1}{T}\,\sum_{i=1}^{T}\frac{(x_i\,-\,\mu)^4}{\sigma^4}\]

  2. 熵特征
    熵是衡量数据确定性和不确定性的指标,在相同的方差、均值和中位数的情况下,entropy越大,系统就越混乱。
    entropy公式如下:
    \(entropy(X)\,=\,-\sum_{i=1}^{\infty}\,P\{x\,=\,x_i\}\,ln(P\{x\,=\,x_i\})\)
    上面是信息论中基本的熵公式,下面介绍几个在时间序列中运用的熵:
    • 2.1 Binned Entropy
      这种做法是把时间序列进行分桶的操作,计算每个桶内的熵,以此来衡量时间序列的集中程度
      如果一个时间序列的 Binned Entropy 较大,说明这一段时间序列的取值是较为均匀的分布在\(\,min(X_T), max(X_T)\,\)之间。如果取值较小,说明其取值是集中在某一段上的. \(binned entropy\,=\,-\sum_{k=0}^{min(maxbin,len(X))}\;p_k\,ln(p_k)\,\cdot\,1_{p_k>0}\)
    • 2.2 Approximate Entropy
      这个指标可判断这个时间序列是具备某种趋势还是随机出现。AE这种方法是将一位空间中的时间序列提升到高维空间中,通过高维空间中向量的距离或者相似度来判断一维空间中是否存在某种趋势。算法大致如下:
      • step1: 给定两个参数m,r .其中m表示取多长的子片段分析,r表示投射到高位时两向量是否相近的阈值。需要构造的m维向量如下:
        \(X_1(m)\,=\,(x_1,\cdots,x_m)\in\mathbb{R},\)
        \(X_i(m)\,=\,(x_i,\cdots,x_{m+i-1})\in\mathbb{R},\)
        \(X_{N-m+1}(m)\,=\,(x_{N-m+1},\cdots,x_N)\in\mathbb{R}.\)
      • step2: 通过上述m维向量可以计算出哪些向量和\(X_i(m)\)相似: \(C_i^m(r)\,=\,(number\,of\,X_j(m)\,such\,that\,d(X_i(m),X_j(m)\,\leq\,r)/(N-m+1))\)
        在这里,d可以选取\(L^1,L^2,L^P,L^\infty\)范数,这里常用\(L^\infty\)范数.
      • step3: 考虑函数:
        \(\Phi^m(r)\,=\,(N-m+1)^-1\:.\sum_{i=1}^{N-m+1}ln(C_i^m(r))\)
      • step4: Approximate Entropy可定义为:
        \(ApEn(m,r)\,=\,\Phi^m(r)-\Phi^{m+1}(r)\)
      • remark:
        1. m一般取值2或者3,r>0, r需要根据具体的时间序列进行调整
        2. 如果某个时间序列有许多很相似或者重复的时间序列,那么他的Approximate Entropy就相对较小,反之就相对较大。
    • 2.3. Sample Entropy
      测试