数据科学案例分析

1. 聚类分析

1.1 K-means

注意处理异常值

不同维度或者变量之间,如果存在数值规模或量纲的差异,则需要先进行归一化或者标准化

1.2 DBSCAN——基于密度的带有噪声的空间聚类

优点:

  • 原始数据集的分布规律没有明显要求,对于非凸状、圆环状等异形簇分布的识别较好
  • 无需制定聚类数量
  • 能够有效应对数据噪点

缺点:

  • 对于高维度问题,基于半径和密度的定义是个问题
  • 当簇的密度变换太大,聚类效果不好
  • 数据量增大时,I/O消耗加大

1.3 MiniBatchKMeans——对于大数据的聚类算法

从不同类别的样本中抽取一部分样本作为代表参与聚类算法

1.4 聚类——重要的中间预处理过程

  1. 图形压缩
    使用较少的数据量来表示原有的像素矩阵的过程,也称图形编码。数字图像的显著特点就是数据量庞大,所以我们需要压缩再进行下一步。
    使用聚类算法做图形压缩时,会先定义K个颜色数,颜色数就是聚类类别的数量,K-Means算法会把类似的颜色分在K个簇中,然后每一个簇使用一种颜色来代替原始颜色,那么结果有多少个簇,就生成由多少种颜色构成的图像,由此实现图像压缩

  2. 图像分割
    聚类算法是图像分割方法的一种,其实施的关键是通过不同区域间明显不同的图像色彩特征做聚类,聚类数量就是要分割的区域的数量

1.5 降维、子空间聚类——应对高维数据的聚类

1.6 如何选择聚类方法

  1. 高维数据,选择谱聚类,子空间聚类的一种
  2. 数据规模较小(100万条以内)选择K均值算法,超过可以考虑MiniBatchKMeans
  3. 数据集中存在噪点(离群点),使用基于密度的DBSCAN
  4. 追求更高的分类准确度,选择谱聚类比K均值准确度会更好

1.7 聚类“准确性”的评估指标

非监督式指标评估

  • silhouette_s:轮廓系数,使用平均群内距离和每个样本的平均最近簇距离来计算,最大值为1,最差值为-1, 0附近的值表示重叠的聚类,负值表示样本被分配到错误的集群 >0.5表示聚类效果不错
  • calinski_harabaz_s:该参数定义为群内离散与簇间离散的比值

监督式指标评估

为了验证K-Means或其他聚类模型的聚类效果与真实分类的差异,可以选择带有已经标识的label标签的数据集进行训练,通过sklearn.metrics中的一些监督指标做聚类结果评估

  • adjusted_rand_score:调整后的兰德指数。取值范围为【-1, 1】,越接近1越好,越接近-1越不好
  • mutual_info_score:互信息(MI)互信息是一个随机变量中包含的关于另一个随机变量的信息量,这里指相同数据的两个标签之间的相似度的度量,结果非负
  • homogeneity_score:同质化得分,取值范围【0, 1】值越大意味着聚类结果与真实情况越吻合
  • completeness_score:完整性得分,同上
  • v_measure_score: 同质化和完整性之间的谐波平均值

1.8 案例分析:客户特征的聚类与探索性分析

题目背景:一些关于客户的数据,希望数据部门通过对数据的分析,给业务部门一些启示,或者提供后续分析或业务思考的建议

基于上述场景和需求,我们需要交付:

  • 一次探索性数据分析的任务,没有任何先验经验提供
  • 分析结果应用于业务的知识启发或后续分析的深入应用
  • 多维度数据可视化分析

案例分析思路:

  1. 观察数据集
    在这里插入图片描述

注意到:

  • IS_ACTIVE是字符串类型变量
  • SEX是分类变量
  • 数值变量ORDERS,MONEY的量纲差异
  • 分割ID我们不需要ID列进行计算
  1. 解决思路
    我们可以有以下思路对数据进行处理
    对于字符串型变量的处理方法有两种:
    一、首先进行转换,然后进行OneHotEncoder,这样做相似度计算时可以充分考虑分类特征的不可直接计算性,但是独热编码后的数据会给业务理解和应用带来困难
    二、 直接将分类型特征,当作原本的字符串做计算,对于字符串的计算,无法直接通过就相似度的方式,而是计算其聚类类别内的分类特征值的出现频数和频率
    三、 对于数值型数据的量纲不一致我们使用模型MinMaxScaler()进行标准化
    四、 根据分类的标签对性别和活跃度进行归纳分析

2. 将模型对象保存到硬盘

有些时候,我们需要将算法对象保存到硬盘中,也称对象持久化
优点:

  • 将训练好的模型对象保存,方便预测和后期应用时直接调用,避免了重新训练模型并应用的时间延迟问题
  • 将训练和应用过程拆分,避免紧耦合带来的系统问题
  • 避免内存错误导致训练好的模型对象丢失,即使训练过程中出错,也可以调用最近的一次模型实例
  • 方便不同环境的模型对象迁移,这样测试和生产环境可以隔离训练和应用过程

pickle

这里的模型必须是实例化的模型!

dump——用于将python对象进行序列化/持久化

import pickle
pickle.dump(model_name, open("file_name.pkl", "wb"))

load——从本地读取python对象并恢复实例对象

model_name = pickle.load(open("file_name.pkl", "rb"))

3. 回归分析

3.1 如何选择回归分析算法

  • 当自变量数量少或经过降维后得到可以使用的二维变量,可以通过散点图发现自变量和因变量的关系,再选择最佳回归方法
  • 经过判断发现自变量和因变量有较强的共线性关系,可以使用对多重共线性(自变量高度相关)能灵活处理的算法,如岭回归
  • 数据集噪音较多,主成分分析,各个主成分相互正交能够解决多元线性回归中的共线性问题,有效提高模型的抗干扰能力
  • 高维度变量,使用正则化回归方法效果更好,例如Lasso, Ridge, ElasticNet或者使用逐步回归中挑选影响显著的自变量建立回归模型
  • 使用交叉验证做多个模型的效果对比
  • 集成或组合回归方法

3.2 案例分析:大型促销活动前的销售预测

案例背景:大型促销活动的前夜,业务方得到一些数据,想要通过现有数据做回归预测,由于时间紧迫,需要短时间内出结果

可以分析本次数据工作的特点:

  • 回归任务,预测数值
  • 时间短,无法深入观察、探索性分析,深入的算法选择和参数调优得到最优结果
  • 注重结果

具体实施时我们选择常见的、效果好的算法和模型、在特征的预处理和特征工程上不投入过多精力,希望通过模型自身的能力取尽量解决特征存在的隐形问题

具体思路:

  1. 导入众多回归模型
# 导入库
import pandas as pd
import numpy as np
from sklearn.linear_model import BayesianRidge, ElasticNet# 批量导入要实现的回归算法
from sklearn.svm import SVR  # SVM中的回归算法
from xgboost import XGBRegressor
from sklearn.ensemble.gradient_boosting import GradientBoostingRegressor  # 集成算法
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import explained_variance_score, mean_absolute_error, \
mean_squared_error, r2_score  # 批量导入指标算法
import matplotlib.pyplot as plt  # 导入图形展示库

导入多种回归算法,目的是
检验没有先验的条件下,通过多个模型的训练,从中找到最佳拟合算法

  1. 观察数据
    在这里插入图片描述
    由于没有标签,通过经验我们直到这是一个多变量回归问题,最后一列为因变量,开始划分训练集和测试集

  2. 初选回归模型

# 初选回归模型
n_folds = 5  # 设置交叉检验的次数
model_names = ['BayesianRidge', 'XGBR', 'ElasticNet', 'SVR', 'GBR']  
# 不同模型的名称列表

model_br = BayesianRidge()  
# 建立贝叶斯岭回归模型对象

model_xgbr = XGBRegressor(random_state=0)  
# 建立XGBR对象

model_etc = ElasticNet(random_state=0)  
# 建立弹性网络回归模型对象

model_svr = SVR(gamma='scale')  
# 建立支持向量机回归模型对象

model_gbr = GradientBoostingRegressor(random_state=0)  # 建立梯度增强回归模型对象

model_list = [model_br, model_xgbr, model_etc,model_svr, model_gbr] 
 # 不同回归模型对象的集合

pre_y_list = [model.fit(X_train, y_train).predict(X_test) for model in model_list]  # 各个回归模型预测的y值列表
  1. 模型评估 使用回归评估指标
explained_variance_score
mean_absolute_error
mean_squared_error
r2_score
  1. 可视化选择
    在这里插入图片描述
    可以得出集成类算法XGBoost和GrantBoosting的效果最好

  2. 使用模型进行预测

  3. 提升方法:增加数据集、特征理解和预处理、调参调优

4 分类算法

4.1 过拟合问题

模型过度学习训练集的特征,使得训练集的准确率非常高,但是应用到新的数据集时准确率却很差。
解决方法:

  1. 使用更多的数据。导致过拟合的根本原因是训练集和新数据集的特征存在较大差异,增加数据后,可能会增加训练集和新数据集的特征相似度,达到更高的效果
  2. 降维。通过维度选择或者转换的方式,降低参与分类模型的维度数量,能够有效防止原有数据集种的噪音对模型的影响
  3. 使用正则化方法。正则化通过定义不同特征的参数来保证每个特征有一定的效用,不会使某一特征特别重要。
  4. 使用组合方法,例如随机森林,adaboost

4.2 如何选择分类分析算法

  • 文本分类,大多使用朴素贝叶斯
  • 训练集较小,选择高偏差且低方差的分类算法效果更好,比如朴素贝叶斯和支持向量机
  • 训练集较大时,不管选择那种方法,都不会显著影响分类准确度
  • 重视算法的准确率,那么应该选择算法精度较高的方法,比如支持向量机、GBDT、XGBoost等基于boosting的集成方法
  • 注重效果的稳定性或模型鲁棒性,那么应选择随机森林、组合投票模型等基于bagging的方法
  • 担心离群点或数据不可分并且需要清晰的决策规则,那么选择决策树

4.3 案例分析

案例背景:对流失用户进行分析,找到流失用户的典型特征

本次数据工作的特点:

  • 关于特征提取的分析工作,交付特征的重要性和特征规则
  • 由于需要解释规则来进行下一步的业务优化,所以我们可以通过决策树来实现分类
  • 需要了解规则的关系,提供规则图
  • 数据集大概率出现样本不均衡问题,因为流失用户是少量的

具体思路:

  • 观察数据
    在这里插入图片描述
    我们可以发现数据存在NaN,样本共有41个特征,这里我们使用XGBoost的分类算法来实现规则提取,选择该模型的理由如下:
  • XGBoost具有容忍性——即可以不处理NA值
  • XGBoost的分类效果较好
  • 观察数据可知样本量较少但是特征数量较多,而XGBoost本身能够有效的选择特征并处理,无需做降维处理

导入需要用到的库

import pandas as pd
from sklearn.model_selection import train_test_split  # 数据划分
import xgboost as xgb
from sklearn.metrics import accuracy_score, auc, confusion_matrix, f1_score, \
    precision_score, recall_score, roc_curve  # 导入指标库
import matplotlib.pyplot as plt
from imblearn.over_sampling import SMOTE # 样本均衡处理
  1. 数据预处理

由于需要处理数据不平衡的问题,我们需要将NA值处理

然后调用imblearn库进行样本平衡处理(注意这里处理后的数据是一个numpy矩阵,我们需要使用pd.DataFrame()建立数据框)

  • 对于监督学习,我们需要划分训练集和测试集

  • 使用XGBoost进行模型训练

  • 分类问题我们使用混淆矩阵来进行效果评估

  1. 再通过一系列指标评估模型好坏:
  • AUC :ROC曲线下的面积,越大越好
  • accuracy :准确率,将正例预测为正例,负例预测为负例的比例
  • precision : 精确率,将正例预测为正例的比例
  • recall :召回率,预测结果被正确预测为正例占总的正例的比例
  • f1 :准确度和召回率的调和平均数
  1. 输出特征重要性
xgb.plot_importance(model, height=0.5, importance_type='gain', 
					max_num_features=10, xlabel='Gain Split', 
					grid=False)
model : 树模型对象
height : 条形图的高度
importance_type : 特征重要度的计算分为:
					weight :特征在树中的出现次数
					gain :使用该特征的平均增益值
					cover :使用作为分裂节点的覆盖的样本比例
grid :设置为false不显示网格线

注意需要加载matplotlib库

  1. 对于给出的规则来确定流失用户的特征
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国家一级假勤奋研究牲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值