首页 > 其他分享 >数据分析之数据建模

数据分析之数据建模

时间:2023-03-22 14:11:07浏览次数:39  
标签:数据分析 特征 异常 模型 样本 建模 算法 数据

一、什么是数据建模?

(1)数据模型,就是在数据层面建立起来的一种逻辑关系的算法集合,该算法集合可以运算未来的同源数据,并产生可预期的结果。通俗说,模型就是算法或公式,如模型y=ax+b,通过该公式,输入x,可以得到y值。通过数据建模输出的模型,就是数据模型。

(2)数据建模是数据分析的一部分,数据分析是一个数据收集、数据检验清洗、数据重构、数据建模的过程,其目的是发现数据中潜在的信息,得出有建设性的结论,辅助决策。所以数据建模的最终目的是提升效率(优化业务流程)。
(3)数据建模,这里指的是业务模型和算法模型的构建,更多的是算法模型的一个过程,不是指数据仓库相关的模型构建。

二、数据模型有哪些分类?

数据模型一般分为业务模型和算法模型这两种,当然最终目的都是为了支持业务。

(1)业务模型

通过分析方法,如对比分析法,RFM分析法,AARRR分析法,从业务维度和指标出发,确定模型的分类维度和指标阈值,构建业务规则的指标体系,形成业务模型,如RFM分析模型、AARRR分析模型、5W2H分析模型等。一句话,加入业务思考的分析法就是业务分析模型。

(2)算法模型

算法模型是基于机器学习等算法构建的模型,如常见的算法有相关、聚类、决策树(分类)、逻辑回归、神经网络、时间序列等,通过这些算法建立的模型基本上分为预测、聚类、关联异常检测四种,如流失预警模型、购物篮分析模型、消费额预测模型、消费者群体模型等。一句话,基于不同的业务问题构建不同的算法模型,不同的算法模型有多种可选的算法来构建。

三、数据模型的构建全流程

数据建模可以分为以下几个步骤:
(1)明确业务问题,确定目标;
(2)数据理解和获取,并对数据描述分析;
(3)数据清洗,数据预处理,包括缺失值、异常值和重复值的处理;
(4)数据规整,包括打标签、标准化等;根据实际情况再次进行数据清洗;
(5)描述统计,洞察结论;是报告的第一部分;
(6)特征选择,模型选择,即选择变量和算法;
(7)数据集划分,设定参数,加载算法,构建模型;
(8)模型评估;
(9)模型调优;
(10)输出规则,模型加载,结果呈现;
(11)模型部署。

四、数据建模分析步骤

1、明确业务问题,确定目标
首先要理解业务,然后根据业务问题确定目标;如用户存在持续性流失,要构建流失预警模型;社交平台存在假粉丝的问题,构建识别假粉的模型;分析用户行为,分类用户,输出洞察报告;等等。
2、数据理解和获取,数据描述分析
数据理解,是指为了避免盲目获取数据,与业务实际要求不统一;所以,要先跟业务方沟通,统一数据口径,核实数据源的真实性,数据符合业务需求的时效性。
数据获取,可能内部数据库获取,也可能是网站上爬取。
数据描述分析,是指在获取数据后,为了避免后期的踩坑和复工,要先了解手上的数据。获取的数据指标是否满足需求?数据的质量怎么样?特征字段的含义和计算方法是什么?各个特征字段的分布是否符合预期?特征字段间的相关性是否符合基本逻辑?探索数据中的规律和模式,形成可试验的假设,有必要的话可计算相关关系,箱线图分析,等等。
3、数据清洗,数据预处理
(1)删除无效信息;
(2)重复值,是整条信息重复还是个别字段重复,确定要不要去重。
(3)缺失值,根据样本数据的多少和缺失比例,来判断是整个字段删除,还是进行缺失值的填充。
计算样本量n,各个特征字段数据缺失率y,样本数据特征缺失率x;特征缺失率x较高的样本一般删除,因为多个特征都缺失,填补困难,填补信息偏差大;某特征数据缺失率y较大则删除,若y较小且特征价值大,在样本量大时可删除特征缺失的样本,样本量小则进行填充。
①可根据特征的众数、中位数或平均值填充;
②可对样本分类后所在分类的平均值等进行填充;
③可通过回归法做样本填充;可通过随机法、特殊值法、多重插补法等较复杂的方法进行填充;
④有些算法也可自动处理缺失值,如KNN,决策树,随机森林,神经网络,朴素贝叶斯,DBSCAN。但是算法识别异常值比较消耗资源,能直接判断的异常值就无需建模。
(4)异常值,有伪异常(业务运营动作产生的)和真异常(异常数据本身就是目标数据);异常值的处理要慎重,不轻易抛弃异常数据。关键在于识别异常数据,再根据实际业务删除或修正异常数据,避免异常数据影响分析结论。
①从单个特征字段判断数据是否异常
一是简单描述统计;根据业务角度设置最大值最小值,不在该范围内的值就是异常值
二是正态分布的3个标准差;在正态分布角度上,偏离均值3个标准出现的概率小于3‰,所以,若数据与平均值偏差超出了3倍的标准差,那么该值就是异常值;也可根据严格程度设定其余倍数的标准差。有时数据不符正态分布或数据是负数,可对所有数加上同一个数得到所有正数,在通过box-cox方法将数据转换为满足正态分布的数据。
#python的box-cox的用法

from scipy.stats import boxcox
import numpy as np
x=np.random.random(2,1000)
y_box,lambda_=boxcox(x+0.0000001) #0.0000001是为了有助于转换为0
#x为原来的数据,y为正太化后的数据

三是利用箱线图;箱线图的识别标准是,小于下边缘【下边缘=下四分位数-1.5*(上四分位数-下四分位数)】或者大于上边缘【上边缘=上四分位数+1.5*(上四分位数-下四分位数)】的数据就是异常值。这里异常值偏差大也不会影响用于识别异常的上下边缘,这是要优于3个标准差方法。
②从多个特征字段判断数据是否异常
有时单个特征字段不合适去判断数据异常,而是用多个特征字段来判断是数据异常,这种方法可以借用算法模型,如聚类模型、孤立森林模型、one-class svm模型等。
孤立森林iforest是一个可扩散到多变量的快速异常检测方法,适用于连续数据的异常检测。其核心原理,对一组一维数据进行切分,把a,b两个点单独切分出来,现在最大最小值之间随机选择一个数x,然后按照<x和>=x把数据分为两组,这两组中重复上述步骤,直到数据不可再分,有些点与其他数据比较稀疏,用很少的步骤就可以把它切分出来,而有些点与其他数据比较密集。需要更多的步骤来切分;而对于二维数据也是一样。最后得到的值就是异常值。

from sklearn.ensemble import IsolationForest
IsolationForest(*,n_estimators=100,max_samples='auto',contamination='auto',max_features=1,bootstrap=False,n_jobs=None,random_state=None,verbose=0,warm_start=False)

③时间序列相关异常数据的识别方法
有时需要对时间序列相关的数据进行监控分析,如订单量,点击量,从时间维度识别异常问题。
i、设置固定警戒值。一般情况下时间序列呈现动态稳定波动状态,围绕某个值在范围内波动,就可以设定上下界警戒值,超出上下界警戒值就是异常值。
ii、设置动态警戒值。由以往的多段时间的序列数据计算,对于没有周期性,且比较平稳的时间序列,用移动平均法设定动态警戒值。即,确定固定移动窗口n,以过去n个窗口的指标平均值作为下一个窗口的预测值,以过去n个窗口的指标的平均值加减3倍方差作为上下警戒值;超出警戒值就是异常值。

#Ft是对下一期的预测值,n是移动平均的时期个数,A(t-1)前期实际值,A(t-2),A(t-3),A(t-4),A(t-n)表示前两期,前三期,前四期,前n期
Ft=(A(t-1)+A(t-2)+A(t-3)+A(t-4)+……+A(t-n))/n

iii、STL数据拆解。如果周期性数据,使用STL算法将数据拆分为趋势项、周期项和余项的和或乘,而判断数据是否异常就是根据余项,余项数据是平稳状态则可设置固定警戒值或动态警戒值,超出警戒值就是异常值。
4、数据规整
(1)有些数据用来跑模型是得不出结果的,需要把数据整理成可以进一步分析的格式,这个时候一般是进行‘打标签’,根据业务所需的内容字段(如行为类型,目标对象,行为特征等等)。打完标签后,有些是不符合标签内容的,要进行第二轮的数据清洗过程。
(2)对底层数据适当计算,产生有业务意义的新特征字段。有些甚至是分箱转换,如把金额变量转换成金额区间段。
(3)有些建模要求高的,还需要考量数据分布,如果偏差太大,就会影响模型效果,需要转换成近似正态分布,有几个方法:取对数、开平方根、取倒数、开平方、取指数,也可以上面说的box-cox方法。
(4)数据标准化处理。像聚类,线性回归,逻辑回归等这样的模型,需要计算特征系数,如果不同特征数值差很大就会影响系数计算,就需要在建模之前做标准化处理。当然,决策树、随机森林、朴素贝叶斯这些是不用做标准化处理的。数据标准化其实就是将数据按照比例缩放到一个小的区间范围内,不同变量标准化后才可以平等分析比较。
有离差标准化(最小最大规范化)和标准差标准化(z值规范化)两种方法;
方法一是X=(x-min)/(max-min);
方法二是Z标准化,X=(x-均值)/标准差,将其规范化为均值0标准差1(如果使用均值时受离群点影响大,可用终止代替均值,绝对标准差代替标准差)。
5、描述统计,洞察结论
描述基本情况,为后续魔性的建立提供基础信息。这个是分析报告的第一部分。
6、特征选择,模型选择
(1)特征选择
为什么要做特征选择?有些特征存在多重共线性(解释变量之间存在精确相关关系或高度相关关系使得模型估计失真或难以估计准确),会对一些模型影响很大,如线性回归和逻辑回归;同时特征太多,增加模型复杂性和无关性。进行特征选择可以缓解维数灾难,降低学习任务的难度,以及增强模型的可解释性。
特征选择的方法有三类:过滤式:先对数据集进行特征选择在进行训练;方差选择法、相关系数法、卡方检验法、互信息法。包裹式:直接使用最终的学习器的性能作为特征选择的标准;递归特征消除法。嵌入式:融合特征选择的过程和分类器学习的过程,在学习过程中进行特征选择;L1正则化、树模型。
①方差选择法
计算各个特征字段的方差,移除方差较低的特征;方差小意味着特征波动小。
②相关系数法
pearson系数:单特征选择,计算某特征与目标的线性相关性;仅能评估线性关系,适用于回归问题。pearson是将单特征向量与目标向量分别中心化后,计算两个向量的cos相似度。取值[-1,1],1代表正相关,0代表没有线性关系,-1代表负相关。

spearman系数:斯皮尔曼相关性系数,,根据原始数据的排序位置进行求解。
 ,对原始数据xiyi从大到小排序,为xi'yi',称为秩次,秩次差di=xi'-yi'

spearman相对于pearso对异常值更不敏感。
③卡方检验
假设检验方法,检验连个分类变量之间是否是独立无关的。通过观察理论值和实际值的偏差来确定原假设是否成立,无关性假设和理论值四格表。
,A表示实际值,T表示理论值;根据CHI值依据自由度查卡方分布临界值表,自由度V=(行数-1)*(列数-1),CHI值比对应概率大,即假设成立概率小于0.005,属于强相关。

④互信息法
信息度量,可以看成是一个随机变量中包含的关于另一个随机变量的信息量。

⑤递归特征消除RFE
主要思想是反复的构建模型,然后剔除掉权重值最差的特征,剩余的特征重复过程,知道所有特征遍历。过程中特征被消除的次序就是特征的排序。
⑥L1正则化
实际上是一种对于成本函数求解最优的过程;L1范数正则化通过向成本函数中添加L1范数,使得学习得到的结果满足稀疏化,从而方便人们提取特征。
⑦树模型
确定以哪个特征为标进行树的划分,如何衡量哪个特征的划分效果好。分类问题一般使用基尼系数和信息增益,回归问题一般使用RMSE(均方根误差)和MSE(平方误差)。
特征选择时,业务逻辑优于数据逻辑,因为业务逻辑是从实际情况中产生的,建模结果也是反馈到业务中,所以业务逻辑优先级较高。
(2)模型选择
不同的业务问题要选择合适的算法来建模;对顾客分类可用聚类、分类,购物篮的分析可用相关或聚类;满意度调查用回归、聚类或分类,等等。
确定算法后,查看变量特征是否满足算法要求,不满足时进行变量重构,重复上述流程。
7、数据集划分,设定参数,加载算法,构建模型
(1)数据集划分
数据集分为训练集(训练模型的数据集)、测试集(测试模型的是数据集,通过测试集评估模型,可得到对该误差的评估)和验证集(用验证集得到最佳的超参数和模型,如使用正则化等算法防止过拟合时)。
了解模型对新场景的泛化能力的唯一办法是让模型真实处理新场景,更好的选择是将数据分割成训练集和测试集两部分;训练集训练模型,测试集测试模型,通过测试集评估模型,得到泛化误差(应对新场景的误差)的评估,就是模型处理新场景的能力;训练误差很低而繁华误差很高,说明模型对于训练数据存在过度拟合。
如果经过多次模型训练,在新场景中泛化误差还是比较大,意味着该模型对于新数据不太可能有良好的的表现;此时常见的解决方案是再单独分出一个集合,即验证集。不同的参数训练多个模型,然后通过验证集选出最好的那个模型和对应的超参数,对模型满意后再用测试集运行最后一轮测试,并得到泛化误差的估值。
为避免验证集浪费太多训练数据,一般使用交叉验证法,即将训练集分成若干个互补子集,然后每个模型通过这些子集的不同组合来训练,之后用剩余的子集进行验证;一单模型和超参数被选定,最终的模型带着超参数对整个训练集进行一次训练,最后再用测试集测量泛化误差。
划分数据有三种方法:留出法、交叉验证法、自助法:
①留出法;将数据按照分层抽样按比例划分成训练集和测试集,一般有测试集比例有30%,25%,20%,15%和10%;如果要划分验证集则60%训练集,20%验证集和20%测试集。百万级别数据量中验证集和测试集比例会变小。

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(train_data,train_target,test_size=0.25,tandom_state=1,stratify=y)

train_test_split将数据按照用户的需要指定划分为 训练集和测试集:
X_train,划分出的训练集数据;X_test划分出的测试集数据;y_train划分出的训练集数据的标签;y_test划分出的测试集数据集的标签
train_data,待划分的样本特征集合
train_target,所要划分的样本结果
test_size,测试集样本占原始样本数目占比,如果是整数的话就是样本的数量
random_state,随机数的种子,随机数种子就是该随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数,如果该参数不填或填0,那么每次构建的模型都不一样、每次生成的数据集也是不一样,每次拆分出的训练集和测试集都是不一样的。

 

②交叉验证法
将训练集分成k个互斥的子集,K个子集随机分为K-1个一组作为训练集,剩下一个为另一组作为测试集,有K种分法。
③自助法
每次随机从m个样本的数据集中抽取一个样本,然后再放回,m次后得到m个样本的数据集,作为训练集;始终不被抽取到的样本比例约为0.368,这部分作为测试集,即没有进入该训练集的样本成为测试集。

 

import numpy as np
X=[1,4,3,23,4,6,7,8,9,45,67,89,34,54,76,98,43,52]

#通过产生的随机数获得抽样样本的序号
bootstrapping=[]
for i in range(len(x)):
bootstrapping.append(np.floor(np.random.random()*len(X)))

#通过序号获得原始数据集中的数据
D_1=[]
for i in range(len(X)):
D_1.append(X[int(bootstrapping[i])])

#结果,[45,52,34,9,6,54,34,1,4,54,6,8,67,4,43,9,4,67],如数据3没有出现

 

(2)设定参数,加载算法,构建模型
针对不同的模型需要调整参数,如kmeans聚类算法需要聚成的类别数量,需要给出的起始的聚类中心和迭代次数上限。参数在后续的测试中要经过多次调整,优化模型,提升模型的解释能力和实用性,最后能达到一个比较好的效果。
调参后跑算法程序,构建模型,要注意的是,后续模型的输出可能是一个报告、一些规则或是一段代码。
8、模型评估
模型评估用于评价训练好的模型的表现效果,表现效果大致可分为过拟合和欠拟合。模型评估有多种方法:混淆矩阵,洛伦兹图,基尼系数,ks曲线,roc曲线,lift曲线。
①混淆矩阵

 

(可理解为预测是积极p或者消极n,但是结果是对T或者F错的。)
准确率ACC:=(TP+TN)/(TP+TN+FP+FN)
精确率(正确率PRE)precession:=TP/(TP+FP),预测为真的,有多少个实际也是真的;
召回率(真正率TPR)recall:=TP/(TP+FN),实际为真的,模型预测出来有多少个;正确的被识别为正确的占全部实际正确的比例。
错正率FPR:=FP/(TN+FP),假正率,错误识别为正确的占全部实际为错误的比例。
F1分数是将精度和召回率组合成的一个单一指标,是精度和召回率的谐波平均值,两者很高时,分类器才能得到较高的F1分数, 。F1分数对那些具有相近饿精度和召回率的分类更为有利。

②ROC曲线

 

横坐标FPR=FP/(FP+TN),预测为真实际为负的样本占所有负样本比例;纵坐标TPR=TP/(TP+FN),预测为真实际为真占所有正样本的比例,就是召回率。
AUC:ROC曲线的面积;面积越大,模型准确度越高。
AUC=1,是完美分类器,采用者预测模型时,存在至少一个阈值能得出完美预测,绝大多数预测的场合不存在完美分类器;
0.5<AUC<1,这个分类器妥善设定阈值的话,能有预测价值;
AUC=0.5,跟随机猜测一样,模型没有预测价值;
AUC<0.5,比随机猜测还差。
使用ROC曲线而不使用PR曲线的原因是,当样本中负样本很多时,ROC曲线基本不会受到影响,而PR曲线会受到影响而变畸形。
③ks曲线
训练出来的模型,一般不是直接给出是正类还是负类的结果,给的是否为正类的概率需要选择一个阈值,通过模型得到的概率大于阈值就判断为正类,否则就为负类。ks曲线用到精确率TPR和错正率FPR,通过找到一个唯一评判标准, KS=max(TPR-FPR) ,KS值越大,表示模型将正和负对象分开来的程度越大,模型的预测准确率越高,KS值>0.2的模型就比较好了。
可以这样理解,ks曲线是将每一组概率的好客户及坏客户的累积占比连接起来的两条线,ks值当有一个点,好客户减去坏客户的数量是最大的。其意义在于,在哪个违约概率的点切下去,创造的效益是最高的。

 

④lift曲线
模型预测后的观测对象按照预测概率分数从高到低排序,对排序后的观测对象按照均等的数量划分为10个或20个区间,每个区间观测对象数量一致。响应率就是指某区间或累计区间观测对象中,属于正的观测对象占该区间总体观测对象数量的百分比,响应率越大,预测准确率越高。

 

 ,这么理解lift值,在不使用模型时,先验概率估计正例的比例(分母),使用模型时,无需从整个样本挑选正例,只需从预测为正例那部分挑选正例即可。

9、模型调优
通过模型评估和结果测试,查看模型的可解释性,如果较差,就需要打回重做。而模型调优的策略,主要是选择更合适的算法、调优模型参数和改进数据这三种。
不同的算法适合不同类型的数据集,可以一起训练它们,找到表现最好的那个。如分类模型可尝试神经网路、逻辑回归等。
超参数调优是常用模型调优方法,可让学习过程很快获得最佳结果,它明显影响学习过程的结果。如决策树允许的最大深度,随机森林包含树的数量等等。
用召回率换精度;精度和召回率是衡量模型性能的两个指标,问题的不同可能需要权衡两者中的一个,可尝试通过修改概率阈值来修改召回率和精度。
特征工程创建新的特征,特征选择优化取出不相关特征。
注意的是,模型的提升没有终点,什么情况就该停止调优?最低限度的标准是模型性能至少优于基线指标,其次对比模型性能和其他的一些指标,验证模型的意义性,评估继续优化模型的性价比,最后在真实条件下性能和测试环境类似,模型基本就成型了。重点是模型的可解释性和实用性。
10、输出规则,模型加载,结果呈现
最后,不管是业务模型和算法模型,都要输出结果,可能是一个业务模型,可能是一些规则,也可能是算法代码,相关数据进行可视化呈现。作为报告的第二部分。
11、模型部署
模型构建的最终目的就是投入业务应用,产生商业价值,并且实时跟踪,根据反馈结果优化迭代更新。

注: 以上信息为学习笔记!文档来源:https://zhuanlan.zhihu.com/p/558520007    知乎 数小分

标签:数据分析,特征,异常,模型,样本,建模,算法,数据
From: https://www.cnblogs.com/lxinghua/p/17243517.html

相关文章

  • 【数据结构】数组与广义表 - 笔记
    数组与广义表的一章相对更为简单,第1,2节都是很熟悉的数组相关定义、实现等。因此这篇博客的讲述重点放在第3节“特殊矩阵的压缩存储”中的“稀疏矩阵”的存储以及第4节“......
  • 数据分析第十章实践
    importpandasaspdimportmatplotlib.pyplotaspltinputfile='C:/Users/Lenore/Desktop/data\original_data.xls'#输入的数据文件data=pd.read_excel(inputfi......
  • 基于YOLOv5的舰船检测与识别系统(Python+清新界面+数据集)
    摘要:基于YOLOv5的舰船检测与识别系统用于识别包括渔船、游轮等多种海上船只类型,检测船舰目标并进行识别计数,以提供海洋船只的自动化监测和管理。本文详细介绍船舰类型识......
  • k8s版MongoShake数据迁移工具
    说明我们原有的MongoDB副本集集群部署在k8s上,后因业务需求,在k8s集群外使用三台虚拟机组建了一套相同架构的MongoDB副本集集群,现想将在k8s集群上mongoDB数据迁移到......
  • 一种基于实时大数据的图指标解决方案
    作者:京东科技尚建平1.现有技术在电商、金融风控领域,使用图来建模,将大量的人员和事件编织成一张庞大的图关系网络,构建图指标来识别异常人员和群体风险行为,目前图指标现......
  • java8读取Access数据库
       添加pom配置文件<dependency><groupId>net.sf.ucanaccess</groupId><artifactId>ucanaccess</artifactId><version>4.0.4</version></dependency......
  • Node-RED中连接Mysql数据库并实现增删改查的操作
    场景Node-RED中建立静态网页和动态网页内容:Node-RED中建立静态网页和动态网页内容_霸道流氓气质的博客-在上面的基础上,怎样实现连接Mysql数据库并将数据库中的数据显示在网......
  • Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
    场景Node-RED简介与Windows上安装、启动和运行示例:​​Node-RED简介与Windows上安装、启动和运行示例_霸道流氓气质的博客-_noderedwindows​​Node-RED怎样导出导入流程为......
  • 使用IDEA连接服务器,执行脚本/上传文件/连接数据库/模拟HTTP请求
    工欲善其事必先利其器所以最近使用开发的时候,由于测试环境太多,搞的人很是崩溃。开发的、测试的、回归问题的,不同的机器能测试侧重点不一样,使用的人不一样。结果一个bug出......
  • 数据结构笔记1 绪论 概念
    最近这一段时间在学习数据结构。感觉还是很值得的。有老大的话说就是这次投资成功了。开始决定学习的时候买了一本书《数据结构(C语言版)》相信大家都看过吧。是严蔚敏老师......