Python预测 数据分析与算法 学习笔记(特征工程、时间序列)2

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: Python预测 数据分析与算法 学习笔记(特征工程、时间序列)

第4章 特征工程

4.1特征变换

特征变换通常是指对原始的某个特征通过一定规则或映射得到新特征的方法,主要方法包括概念分层、标准化、离散化、函数变换以及深入表达。

4.1.1概念分层

在数据分析的过程中,对于类别过多的分类变量通常使用概念分层的方法变换得到类别较少的变量,比如可以将年龄变量,其值为“1岁”“12岁”“38岁”等,变换成更高概念层次的值,如“儿童”“青年”“中年”等,其中每个值对应多个年龄,经过这样的处理,类别减少到几类,既避免了程序陷入过拟合,又能提高算法的效率。因此,概念分层是缩减离散变量取值数量的方法。由于取值概念层级更高,这必然会损失一些细节信息,极端情况是取到概念分层的顶层,也就是信息损失最大的取值,在这种情况下,对所有的样本,该变量的值都是一样的,因此就失去概念分层的意义了。(通常取值为2-5类,在数据分析实践中,通过配置维表或相关数据结构,再进行关联操作可以实现概念分层)

4.1.2标准化

在数据分析过程中,通常使用的变量量纲不一致,在确定权重、系数、距离时,也会有所影响,因此要进行数据标准化。标准化对数据进行无量纲处理,使不同量纲的数据可以在同一个数量级上进行横向比较,减少因为数据级的差异带来的误差。常见用于标准化的方法,可以简单地分成线性标准化和非线性标准化两类。

#该函数用于获取数据x的各种标准化值
# x:用于标准化的实数数组
# is_positive:是否是正向指标
def std_proc(x,is_positive=True):
    x = np.array(x)
    v_max, v_min, v_std, v_mean = np.max(x), np.min(x), np.std(x), np.mean(x)
    # 1. 线性标准化
    #---极差标准化
    if v_max > v_min:
        yExt = (x - v_min if is_positive else v_max - x)/(v_max - v_min)
    else:
        print("最大值与最小值相等,不能进行极差标准化!")
        yExt = None
    #---z-score标准化
    if v_std == 0:
        print("由于标准差为0,不能进行z-score标准化")
        yZsc=NULL
    else:
        yZsc=(x-v_mean)/v_std
    #---小数定标标准化
    yPot = x/(10**len(str(np.max(np.abs(x)))))
    # 2. 非线性标准化
    #---对数标准化
    y = np.log((x-v_min if is_positive else v_max - x)+1)
    yLog = y/np.max(y)
    #---倒数标准化
    yInv=np.min(np.abs(x[x!=0]))/x
return {"yExt":yExt,"yZsc":yZsc,"yPot":yPot,"yLog":yLog,"yInv":yInv}

4.1.3离散化

离散化通常是对实数而言的,它是将无限的连续值映射到有限分类值中的方法,并且这些分类规定了与无限连续值相同的取值空间。比如我们可以将收入金额的取值范围设为 2000~100000,离散化成“低等收入"“中等收入”“高等收入”等分类值,一般对于这种类型的离散化,得到的是有序分类变量。通过离散化处理,可以简化数据,有助于提高算法的执行效率和模型的可解释性。常见用于离散化处理的方法主要包括分箱法、嫡离散法、规则离散法等。

  1. 分箱法

分箱法是一种将连续数值按照一定规则存放到不同箱中的数据处理方法,箱的宽度表示箱中数值的取值区间,箱的深度表示箱中数值的数量。通常按箱的等宽、等深的差异将分箱法分成两类, 一类是等宽分箱,另一类是等比分箱。

数值分箱后,各分箱分别用什么值来表示:除了可以根据取值的范围来定义分类,还可以考虑将其进行平滑处理,通常有以下三种方法:使用箱内各值的平均值、使用箱内各位的中位数、使用箱内的最大值或最小值。

  1. 熵离散法

熵离散法是基于信息熵的一种数据离散方法,通常用在分类问题的预测场景中对数值属性或特征进行离散化处理,这是一种有指导的离散化方法,并且通常进行二元离散化。

  1. 规则离散化

所谓规则离散法就是不单纯依赖于数据和算法,而主要靠业务经验设定的规定来离散化数据的方法。比如对于收入数据,一般可分为低收入、中等收入、高收入3类,但是在特定场景下,也可以按收入的稳定性分为稳定收入、不稳定收入两类。也就是通过业务规则,甚至在特征中引入非线性变化,对于某些场景的建模可能会有所裨益。

4.1.4函数变换

函数变换指的是使用函数映射将变量或特征变换成另外一个特征的方法。通过函数变换会改变数据的分布,因此常用于对数据分布比较敏感的模型中。常见的函数变换方法主要包括幂函数变换和对数变换。

4.2特征组合

特征组合是指将两个或多个原始特征通过一定规则或映射得到新特征的方法。常见的特征组合方法包括基于特定领域知识的方法、二元组合和高阶多项式。其中基于特定领域知识的方法是以特定领域知识为基础,在一定的业务经验指导下实现的,属于由人工完成的方法,二元组合、高阶多项式通常是使用数据分析方法进行组合发现的,试图在有限范围内发现区分度更强的特征。

4.2.1基于经验

针对确定的预测主题,很有必要使用相关的领域知识来构建特征。比如使用最近一周的负荷数据对未来的负荷水平做预测。根据领域知识,可以根据最近一周的负荷数据(7个变量)衍生出近一周负荷平均增量、近一周负荷波动程度、近一周负荷平均增长率等特征。特定的领域知识在具体的 预测项目中扮演着重要的角色,根据参与构造组合特征的变量的量纲差异,将特定的领域知识分成两类:同质性组合、异质性组合。

(1)同质性组合

对于量纲相同的同质性变量,在进行组合时,通常构建平均值、变异程度、比率、增长率、平均增长率、最大最小增长率等特征,而这些特征在不同行业和领域中代表不同的业务含义,比如在医疗领域,用门诊确认病例数除以门诊总病例数可得到确诊率,而这个确诊率就是比率。又比如在电商领域,用离开网站人数除以访问的总人数,则可得到跳出率。这些指标都是通过同质性变量行生而来的。

(2)异质性组合

与同质性组合不同,异质性组合主要考虑量纲不同的变量。在进行组合时,通常构建单位性或平均性指标。比如在医疗领域,可以用确诊病人确诊总天数除以确诊病人总人数,得到平均确诊天数的特征:又比如在电商领域,可以用客户网站浏览时间除以网站交易量,得到每交易平均浏览时间等。

对于特定的预测问题,结合相关的领域知识,进行组合特征衍生,有助于发现区分度更强的特征,但是需要人工完成。如果找的特征比较准确,可以较好地提升预测模型的精度。

4.3特征评价

在建立预测模型之前,我们已经按照特征构建的方法得到了数据集,然而这样的数据集可能存在大量的特征,特征之间可能存在相关性,还有可能存在冗余的特征。为了提升建模效率,获取区分度更好的特征,需要进行特征选择。特征评价技术用于特征选择的过程中,它基于对现有数据的特征进行评价,进一步选取用 于建模的最优特征子集。特征评价的常用方法通常可分为3类:特征初选、影响评价、模型法。

4.3.1特征初选

所谓特征初选,就是可以通过直接观察数据的分布来判断是否保留该特征的方法。针对离散特征,可以统计该特征所有类型的所占比例,如果有一种的占比太大,比如占了90%及以上,那么这个特征就可以考虑去掉,不参与建模,因为这样的特征对建模没有任何意义,对于绝大部分的样本,这个特征都取一样的值,区分力度不够。针对连续变量,有两种方法可以考虑:一种方法是将连续特征离散化,再按针对离散特征的方法来排除;另外一种方法是计算该连续特征的标准差,如果标准差太小,则可以将该特征剔除。

4.3.2影响评价

除了基于单个变量的特征初选,我们还可以使用影响评价的方法来选择特征。影响评价是很常用的方法,对每个特征依次进行评价,然后把不满足要求的排除,以达到特征选择的目的。常用的算法包括Pearson相关系数、距离相关系数、单因素方差分析、信息增益卡方检验、Gini系数。

  1. Pearson相关系数

Pearson相关系数是一种衡量特征与响应变量之间关系的方法,它反映的是两个变量间的线性相关性。Pearson相关系数适用于两变量均为服从正态分布的连续变量,并且变量成对,用于表示两变量的线性关系。

import pandas as pd
from scipy import stats
iris = pd.read_csv("http://image.cador.cn/data/iris.csv")
stats.pearsonr(iris['Sepal.Length'], iris['Petal.Length'])
#(0.8717537758865832, 1.0386674194497525e-47)

打印的第一个值为Pearson相关系数r,第二个值为假设检验的P值,远小于0.01,即此时应该拒绝原假设,说明花萼长度与花瓣长度相关性很强。

注:Pearson相关系数只对线性关系敏感,如果两变量是非线性关系,即使它们之间存在一一对应的关系,也会导致计算的结果趋近于0.

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
matplotlib.rcParams['font.family'] = 'Arial Unicode MS'
x=np.linspace(-1,1,50)
y=x**2
plt.plot(x,y,'o')
plt.xlabel('$x$')
plt.ylabel('$y$')
plt.show()
stats.pearsonr(x, y)
#(-1.5265566588595902e-16, 0.999999999999995)
  1. 距离相关系数

主要衡量非线性相关的程度。

# 使用scipy库中spatial.distanc模块的correlation函数,针对Pearson相关系数分析非线性的情况再做一次验证

from scipy.spatial.distance import correlation as dcor
dcor(x,y)
#1.0000000000000002

在使用Pearson相关系数时,相关度接近于0,而使用距离相关函数,其相关度达到了1.0,即完全正相关。所有针对非线性的相关问题,使用距离相关系数时比较合适的选择,但是对线性相关的问题,Pearson相关系数还是很强大的。

  1. 单因素方差分析

单因素方差分析就是讨论一个因素对观测变量的影响。使用statsmodels库中的stats.anova模块里面的anova_lm函数来实现单因素方差分析。

#用iris数据集中的Species作为因素,Sepal.Width作为观测值。

import pandas as pd
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
iris = pd.read_csv("http://image.cador.cn/data/iris.csv")
iris.columns = ['_'.join(x.split('.')) for x in iris.columns]
anova_lm(ols('Sepal_Width~C(Species)', iris).fit())
df sum_sq mean_sq F PR(>F)
C(Species) 2.0 11.344933 5.672467 49.16004 4.492017e-17
Residual 147.0 16.962000 0.115388 NaN NaN

F检验的P值为4.492017e-17,接近于0,明显小于0.01,说明Species对Sepal.Width的影响显著。

4.3.3模型法

将要评价的所有特征加入模型中进行训练和测试,通过分析这些特征对模型的贡献程度来识别特征的重要性,这种思路就是模型法用于评价特征重要性的出发点。有两大类经常使用的方法:增益法和置换法。其中增益法主要通过收集决策树建模过程中特征的Gini增益来评估特征的重要程度,而置换法主要通过比较特征在置换前后,其所建模型在OOB数据集的精度下降程度来评估特征的重要性。

第5章 参数优化

常用的参数优化方法主要包括交叉验证、网格搜索、遗传算法、粒子群优化、模拟退火

5.1交叉验证

交叉验证的基本思想是将数据集分割成N份,依次使用其中1份作为测试集,其他N-1份整合到一起作为训练集,将训练好的模型用于测试集中,以得到模型好坏的判断或估计值,可以得到N个这样的值。交叉验证通常用于估计模型的误差,这里将N个对应的误差求平均作为对模型误差的估计。也可以根据这N个值,选出拟合效果最好的模型,对应模型的参数也被认为是最优或接近最优的,因此交叉验证可以用来辅助确定参数。

5.2网格搜索

网格搜素的基本原理是将各参数变量值的区间划分为一系列的小区间,并按顺序计算出对应各 参数变量值组合所确定的目标值(通常是误差),并逐一择优,以得到该区间内最小目标值及其对应 的最佳参数值。该方法可保证所得的搜索解是全局最优或接近最优的,可避免产生重大的误差。

第6章 线性回归及其优化

6.1多元线性回归

6.1.1多重共线性

在多元线性回归的过程中,当自变量彼此相关时,回归模型可能并不稳定。估计的效果会由于模型中的其他自变量而改变数值,甚至符号。这一问题,通常称为多重共线性问题。

6.2Ridge回归

在进行多元线性回归时,有时会因为变量间存在共线性,而导致最小二乘回归得到的系数不稳定,方差较大。根本原因是系数矩阵与它的转置矩阵相乘得到的矩阵不能求逆。这个问题可以通过Ridge回归得到解决。Ridge回归也被称为岭回归,是一种专用于共线性数据分析的有偏估计回归方法。Ridge回归对最小二乘法进行了改良,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价来获得回归系数更为符合实际情况、更为可靠的回归方法,对病态数据的拟合效果要强于最小二乘法。

6.3Lasso回归

最小二乘估计虽有很多好的性质,但仍存在一些不足,特别是在进行大量预测时,为了预测准确,我们希望使某些回归系数减小到0,不仅可以减小预测方差,还可以减少变量。但是最小二乘法做不到这点。Lasso回归可以将某些回归系数置为0,可基于此特性进行特征选择。

6.4分位数回归

分位数回归是用解释变量X估计响应变量y的条件分位数的基本方法,它利用解释变量的多个分位数(例如四分位、十分位、百分位等)来得到响应变量的条件分布的相应的分位数方程。分位数回归相对于最小二乘回归应用的条件更为宽松,挖掘的信息更丰富,它不仅可以度量回归变量在分布中心的影响,而且还可以捕捉整个条件分布的特征。特别当误差为非正态分布时,分位数回归估计量比最小二乘估计量更有效。

分位数回归是使加权残差绝对值之和达到最小的参数估计方法,其优点主要体现在如下几个方面

1)分位数回归对模型中的随机误差项的分布不做任何假定。由于该分布可以是任何一个概率分布,这就使得整个模型具有很强的稳健性。

(2)分位数回归是对所有的分位数进行回归,因此对数据中的异常点不敏感。

(3)分位数回归对于因变量具有单调不变性。

(4)分位数回归估计出来的参数具有大样本理论下的渐进优良性。

6.5稳健回归

在回归分析中,通常使用普通最小二乘法来确定回归系数,而普通最小二乘法估计参数时一般需求数据满足一些性质,如正态性等。然而,现实中的数据常常不能满足这些性质,这便使得基于普通最小二乘法的回归模型难以达到满意的预测精度。此外,数据中的异常点,引起数据分布的偏离,特别对线性回归的拟合形成杠杆效应,最终使预测结果与真实值偏离较远。稳健回归就可以解决这些问题。

第7章 复杂回归分析

对于简单的回归问题,比如满足自变量独立、数据服从正态分布、线性或简单非线性关系的情况,通常采用多元线性回归及其优化方法即可有效处理。然而,现实世界中遇到的多数问题并不都满足以上条件,甚至出现高维度、小样本、非线性等复杂的回归问题,这就需要建立针对复杂回归问题的分析体系(GBDT回归方法、神经网络、支持向量回归以及高斯过程回归等,评价指标残差平方和)。

第8章 时间序列分析

时间序列就是按照时间顺序取得的一系列观测值。很多数据都是以时间序列的形式出现的,比如股票市场的每日波动、科学实验、工厂装船货物数量的月度序列、公路事故数量的周度序列,以及某化工生产过程按小时观测的产量等。时间序列典型的本质特征就是相邻观测值的依赖性。作为一门概率统计学科,时间序列分析的应用性较强,在金融经济、气象天文、信号处理、机械据动等众多领域有着广泛的应用。使用时间序列方法进行预测就是通过编制和分析时间序列,根据时间序列所反映出来的发展过程、方向和趋势,进行类推或延伸,借以预测下一段时间或以后若干年内可能达到的水平。

8.1门限自回归模型

TRA模型适用于周期性波动、非线性影响等情况。

8.2向量自回归模型

在时间序列预测实践中,通常使用的不止一个指标,比如电力行业的负荷预测,除了基本的电力负荷数据,还可以加入气温、湿度、节假日等因素。因此,针对一个指标的时间序列预测方法在这种情况下发挥空间有限。向量自回归模型,是目前处理多个相关时序指标分析与预测最容易操作的模型之一。

由于只有平稳的时间序列才能够直接建立VAR模型,因此在建立VAR模型之前,首先要对变量进行平稳性检验。通常可利用序列的自相关分析图来判断时间序列的平稳性,如果序列的自相关系数随着滞后阶数的增加很快趋于0,即落入随机区间,则序列是平稳的,反之序列则是不平稳的。另外,也可以对序列进行ADF检验来判断平稳性。对于不平稳的序列,需要进行差分运算,直到差分后的序列平稳,才能建立VAR模型。

8.3卡尔曼滤波

8.4循环神经网络(RNN)

8.7长短期记忆网络

循环神经网络由于存在梯度消失和梯度爆炸的问题,使得其难以训练,这就会限制该算法的普及应用。针对循环神经网络在实际应用中的问题,长短期记忆网络(LongShortTermMemory Network,LSTM)被提出,它能够让信息长期保存,成功地解决了循环神经网络的缺陷问题,而成为当前最为流行的RNN,特别是在语音识别、图片描述、NLP(自然语言处理)等任务中广泛应用。

相关文章
|
8天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
128 55
|
23天前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析的入门指南
本文将引导读者了解如何使用Python进行数据分析,从安装必要的库到执行基础的数据操作和可视化。通过本文的学习,你将能够开始自己的数据分析之旅,并掌握如何利用Python来揭示数据背后的故事。
|
24天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
125 67
|
24天前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
116 61
|
18天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
106 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
26天前
|
机器学习/深度学习 算法 数据挖掘
数据分析的 10 个最佳 Python 库
数据分析的 10 个最佳 Python 库
81 4
数据分析的 10 个最佳 Python 库
|
24天前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
24天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
1月前
|
存储 数据可视化 数据挖掘
使用Python进行数据分析和可视化
本文将引导你理解如何使用Python进行数据分析和可视化。我们将从基础的数据结构开始,逐步深入到数据处理和分析的方法,最后通过实际的代码示例来展示如何创建直观的数据可视化。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。让我们一起探索数据的世界,发现隐藏在数字背后的故事!
|
27天前
|
存储 数据可视化 数据挖掘
Python数据分析项目:抖音短视频达人粉丝增长趋势
Python数据分析项目:抖音短视频达人粉丝增长趋势