pandas高级数据分析快速入门之五——机器学习特征工程篇(代码片段)

肖永威 肖永威     2022-12-30     343

关键词:

Pandas高级数据分析快速入门之一——Python开发环境篇
Pandas高级数据分析快速入门之二——基础篇
Pandas高级数据分析快速入门之三——数据挖掘与统计分析篇
Pandas高级数据分析快速入门之四——数据可视化篇
Pandas高级数据分析快速入门之五——机器学习特征工程篇
Pandas高级数据分析快速入门之六——机器学习预测分析篇

0. Pandas高级数据分析使用机器学习概述

需求解决方案技术方案
时序趋势斜率线性回归算斜率,Scipy.stats.linregress
正常状态聚类数据密度,最多的均值聚类数据密度,SKlearn DBScan
数据相关性相关性分析相关系数,Pearson相关系数
预测两种状态聚类分析聚类,SKlearn KMean
数据可比性归一化、标准化数据标准化,sklearn StandardScaler

1. 线性回归计算斜率和方差

在Python科学计算包Scipy的统计模块stats 中,有 linregress 函数可以做一元线性回归,返回斜率、截距、相关系数、p值和标准误差。

交易间隔天数趋势回归斜率,左侧为典型流失情况, K ∆ t = 2.872 K_∆t=2.872 Kt=2.872;右侧为不流失正常情况, K ∆ t = − 2.272 K_∆t=-2.272 Kt=2.272

计算斜率和方差

scipy.stats.linregress(x, y=None)

参数:

  • 输入数据x,y,类数组
    两组测量值。两个数组的长度应该相同。如果只给出了x(y=None),那么它必须是一个二维数组,其中一个维度的长度为2。然后通过沿长度为2的维度拆分数组来找到两组测量值。

返回值:

  • 斜率、截距、相关系数、p值和标准误差。

本文涉及到的交易数据,参照上篇博文[1]描述获取数据集及其DataFrame,此处略。

from scipy import stats

def stats_linear_regression(df):
    user_df = df.loc[df['carduser_id']== 2085603 ].reset_index(drop=True)
       
    Days = user_df['days'].values
    Days = Days[1:]
    k = []
    for i in range(len(Days)):
        k.append(i)
    #Days = Days.reshape(-1,1)
    x = np.array(k)
    y = Days
    # 科学计算包中统计方法,用于计算散点回归线趋势的斜率、截距
    slope, intercept, r_value, p_value, std_err = stats.linregress(x, y) 
    print('slope is ' + str(slope))
    
    # 画图
    plt.rcParams['figure.figsize']= 10,5 #设置图例尺寸
    plt.rcParams['font.sans-serif']=['SimHei'] #设置为中文黑体,如果设置楷体则为 KaiTi
    plt.rcParams['axes.unicode_minus']=False

    plt.scatter(x, y, color='b',label='间隔时间')
    plt.plot(x, slope*x + intercept, color='r',label='趋势回归线')
    plt.legend()      #绘制图例,右上角标识图
    plt.show()   

stats_linear_regression(trade_df)
slope is -0.11791958041958041

2. 数据密度计算正常状态/周期

基于聚类——数据密度(DBSCAN)提取典型(正常状态)特征,DBSCAN是基于一组邻域来描述样本集密度的空间聚类算法,将具有足够密度的区域划分为簇,参数 ( ϵ , M i n P t s ) (ϵ,MinPts) (ϵ,MinPts)用来描述邻域的样本分布紧密程度。其中, ϵ ϵ ϵ描述了某一样本的邻域距离阈值, M i n P t s MinPts MinPts描述了某一样本的距离为ϵ的邻域中样本个数的阈值。

通过DBSCan聚类分析各个客户交易行为规律,设 ∆ t ∆t t x x x,使用交易间隔天数的密度分簇,寻找最大的簇为“平常交易间隔天数 μ t μ_t μt”,与交易间隔天数平均值、中位数、众数相比,更接近实际情况。
例如图所示交易序列,中位数为15,均值为19.5,聚类最大簇的平均间隔时间μ_t为12天。

sklearn.cluster.DBSCAN参数

sklearn.cluster.DBSCAN(eps=0.5, *, min_samples=5, metric=‘euclidean’, metric_params=None, algorithm=‘auto’, leaf_size=30, p=None, n_jobs=None)

参数:

  • eps:两个样本之间的最大距离,其中一个样本被视为在另一个样本的邻域中。这不是簇内点距离的最大界限。这是为数据集和距离函数选择的最重要的DBSCAN参数。
  • min_samples:最小采样点,默认值=5
    将一个点视为核心点的邻域中的样本数(或总权重)。
  • metric:或可调用,默认值为“欧几里德”。
    计算要素阵列中实例之间的距离时使用的度量。如果metric是字符串或可调用,则它必须是sklearn.metrics.pairwise_distance为其metric参数所允许的选项之一。若度量是“预计算”的,则假定X是距离矩阵,且必须是平方。X可以是术语表,在这种情况下,只有“非零”元素可以被视为DBSCAN的邻居。
  • leaf_size,默认值=30。
    传递给BallTree或cKDTree的叶大小。这可能会影响构造和查询的速度,以及存储树所需的内存。最佳值取决于问题的性质。
  • n_jobs,整形数。 指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。
    (1)若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。
    (2)若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。

属性:

  • labels_:给fit()的数据集中每个点的cluster label。噪声样本的标签为-1。
from sklearn.cluster import DBSCAN
from numpy import unique
import matplotlib.pyplot as plt

# 数据密度分析
def dbcsan_analysis(df): 
    user_df = df.loc[df['carduser_id']== 2085728 ].reset_index(drop=True)
       
    Days = user_df['days'].values
    Days = Days[1:]
    k = []
    for i in range(len(Days)):
        k.append(i)

    Days = Days.reshape(-1,1)
    dbs = DBSCAN(eps = 3, min_samples = 5).fit(Days)
    labels = dbs.labels_ 

    # 检索唯一群集
    clusters = unique(labels)
    k = np.array(k)
    k = k.reshape(-1)
    Days = Days.reshape(-1)
    
    plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签 KaiTi
    plt.rcParams['axes.unicode_minus']=False

    scatter = plt.scatter(k, Days, c=labels ,cmap='viridis') #'inferno')
    plt.show()  
    
    sub_df = user_df.drop(index=[0]).reset_index(drop=True) # 删除第一行,因为第一行的时间间隔不合理,或者不存在
    Days = sub_df[['days']].copy() # 间隔时间,建立副本处理
    Days['lables'] = labels
    Days = Days.loc[Days['lables']!=-1].reset_index(drop=True)

    count_group = Days[['lables','days']].groupby(by=['lables'],as_index=False).count()
    maxcount= count_group.sort_values(by=['days'], ascending = True).tail(1)[['lables']].values[0][0]
    
    count_mean = Days[['lables','days']].groupby(by=['lables'],as_index=False).mean()
    count_mean['days']= count_mean['days'].round(0)
    DBSan_mean = count_mean[['days']].loc[count_mean['lables']==maxcount].values[0][0]
    mean = Days[['days']].mean()
    
    median = Days[['days']].median()
    
    print(DBSan_mean)
    print(mean)
    print(median)
    
dbcsan_analysis(trade_df)

14.0
days    17.673469
days    15.0

3. 相关分析计算特征间关系

皮尔森相关系数 (Pearson Correlation) 是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为 [ − 1 , 1 ] [ − 1 , 1 ] [11],-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关。

ρ X , Y = c o v ( X , Y ) σ X σ Y \\rho_X,Y=\\fraccov(X,Y)\\sigma _X\\sigma_Y ρX,Y=σXσYcov(X,Y)

ρ X , Y = ∑ i = 1 n ( X i − X ‾ ) ( Y i − Y ‾ ) ∑ i = 1 n ( X − X ‾ ) 2 ∑ i = 1 n ( Y − Y ‾ ) 2 \\rho_X,Y=\\frac\\sum_i=1^n(X_i-\\overlineX)(Y_i-\\overlineY)\\sqrt\\sum_i=1^n(X-\\overlineX)^2\\sqrt\\sum_i=1^n(Y-\\overlineY)^2 ρX,Y=i=1n(XX)2 i=1n(YY)2 i=1n(XiX)(YiY)

DataFrame.corr(method=‘pearson’, min_periods=1)

参数说明:

method:可选值为‘pearson’, ‘kendall’, ‘spearman’

  • pearson:Pearson相关系数来衡量两个数据集合是否在一条线上面,即针对线性数据的相关系数计算,针对非线性数据便会有误差。
  • kendall:用于反映分类变量相关性的指标,即针对无序序列的相关系数,非正太分布的数据
  • spearman:非线性的,非正太分布的数据的相关系数

min_periods:样本最少的数据量

返回值:各类型之间的相关系数DataFrame矩阵表格。

def pearson_corr(df):
    user_df = df.loc[df['carduser_id']== 2085728 ].reset_index(drop=True)
    relat = user_df[['volumn','amount']]
    pearson = relat.corr(method='pearson',min_periods=1)
    pv = round((pearson['amount'].values)[0],4)    
    
    return pv

pv = pearson_corr(trade_df)
print(pv)
0.9489

4. 归一化、标准化

现实的数据一般都是有单位的,比如常用身高的单位有米、厘米,这些情况会影响到数据分析的结果,这个无量纲化并不是说统一量纲为米,而是说,无论是米还是厘米,最后都会变成1,也就是没有了单位。无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和归一化。

标准化(Z-Score)

x ′ = x i − μ σ x' = \\fracx_i- \\mu \\sigma x=σxiμ
其中:

  • x ′ x' x—新值
  • x i x_i xi—输入值(原始值)
  • μ \\mu μ σ \\sigma σ表示 X i X_i Xi均值和标准差。

最大、最小值归一化(缩放)

x ′

pandas高级数据分析快速入门之六——机器学习预测分析篇(代码片段)

Pandas高级数据分析快速入门之一——Python开发环境篇Pandas高级数据分析快速入门之二——基础篇Pandas高级数据分析快速入门之三——数据挖掘与统计分析篇Pandas高级数据分析快速入门之四——数据可视化篇Pandas高级数据分析快速... 查看详情

pandas高级数据分析快速入门之二——基础篇(代码片段)

Pandas高级数据分析快速入门之一——Python开发环境篇Pandas高级数据分析快速入门之二——基础篇Pandas高级数据分析快速入门之三——统计分析篇Pandas高级数据分析快速入门之四——表内、表间数据处理篇Pandas高级数据分析快速入... 查看详情

pandas高级数据分析快速入门之一——python开发环境篇

Pandas高级数据分析快速入门之一——Python开发环境篇Pandas高级数据分析快速入门之二——基础篇Pandas高级数据分析快速入门之三——数据挖掘与统计分析篇Pandas高级数据分析快速入门之四——数据可视化篇Pandas高级数据分析快速... 查看详情

pandas高级数据分析快速入门之四——数据可视化篇(代码片段)

Pandas高级数据分析快速入门之一——Python开发环境篇Pandas高级数据分析快速入门之二——基础篇Pandas高级数据分析快速入门之三——数据挖掘与统计分析篇Pandas高级数据分析快速入门之四——数据可视化篇Pandas高级数据分析快速... 查看详情

pandas高级数据分析快速入门之三——数据挖掘与统计分析篇(代码片段)

Pandas高级数据分析快速入门之一——Python开发环境篇Pandas高级数据分析快速入门之二——基础篇Pandas高级数据分析快速入门之三——数据挖掘与统计分析篇Pandas高级数据分析快速入门之四——数据可视化篇Pandas高级数据分析快速... 查看详情

机器学习numpy&pandas快速入门笔记

Numpy&Pandas 快速入门笔记XuAn  2018-4-6######Numpy部分######1、创建arrayimport numpy as npa=np.array([[2,23,4],[21,3,43],[34,43,234]],dtype=np.int32)  #创建矩阵 使用dty 查看详情

pandas高级数据分析快速入门——全过程综述及案例集锦

...,企业必须高度重视并大力投入。1.概述1.1.Pandas高级数据分析知识体系基于Pandas高级数据分析,知识技能包括:数据的读写、表内操作、表间操作(例如关系型数据库表关联,Excelsheet关联等)、 查看详情

pandas高级数据分析快速入门之数据编辑——删除行与列(代码片段)

在高级数据分析过程中,数据删除操作也是常用的数据编辑操作。本文总结了常用的行、列数据删除操作快速入门方法。首先,读取Excel或csv文件,用于演练删除操作。importpandasaspddf=pd.read_excel('sport.xlsx')dfidna... 查看详情

pandas高级数据分析快速入门之数据筛选——分组排序筛选实践笔记(代码片段)

首先,读取文件。importpandasaspdimportdatetimedf=pd.read_excel('sport.xlsx')df['birthday']=df['birthday'].astype('datetime64')dfidnameageGendersportbirthday01001 查看详情

简单易懂|机器学习如何快速入门?

1 什么是机器学习机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测。2 机器学习工作流程1.获取数据2.数据基本处理3.特征工程4.机器学习(模型训练)5.模型评估结果达到要求,上线服务没有达到要求... 查看详情

pandas高级数据分析快速入门之工具使用——jupyter导出pdf问题

JupyterNotebooks提供导出多种文件格式的功能,其中,导出PDF比较重要,如下图所示菜单:“文件->下载->PDFviaLatex(.pdf)”。首次执行(Windows10环境),出现如下错误。500:InternalServerError错误:nbconvertfailed 查看详情

机器学习入门05——pandas使用(代码片段)

文章目录系列文章5Pandas5.1Pandas介绍5.2Pandas数据结构1Series创建SeriesSeries属性2DataFrame创建DataFrameDataFrame属性重置索引设置某列值为新索引3MultiIndex5.3基本数据操作1索引操作直接操作loc和iloc2赋值操作3排序5.4运算1算数运算2逻辑运算3... 查看详情

14.sparkmllib之快速入门(代码片段)

简介??MLlib是Spark提供提供机器学习的库,专为在集群上并行运行的情况而设计。MLlib包含很多机器学习算法,可在Spark支持的所有编程语言中使用。??MLlib设计理念是将数据以RDD的形式表示,然后在分布式数据集上调用各种算法。... 查看详情

简单易懂|机器学习如何快速入门?(代码片段)

1 什么是机器学习机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测。2 机器学习工作流程1.获取数据2.数据基本处理3.特征工程4.机器学习(模型训练)5.模型评估结果达到要求,上线服务没有达到要... 查看详情

python机器学习入门——科学计算库(pandas)(代码片段)

目录Pandas介绍Pandas数据结构SeriesSeries的创建Series的属性DataFrameDataFrame的创建DataFrame的属性DatatFrame索引的设置基本数据操作索引操作赋值操作排序DataFrame排序Series排序DataFrame运算算术运算逻辑运算逻辑运算符号逻辑运算函数统计... 查看详情

tf.estimator快速入门[5]

tf.estimator快速入门TensorFlow的高级机器学习API(tf.estimator)可以很容易地配置,培训和评估各种机器学习模型。在本教程中,您将使用tf.estimator构建一个 神经网络 分类器和训练它在 虹膜数据集的基础上萼片/花瓣形状... 查看详情

学习(14)-pandas高级处理机器学习算法(knn算法)

查看详情

机器学习入门快速版

机器学习入门快速版本文地址:https://github.com/no7dw/MachineLearningTutorialbackground从数据量的角度,MachineLearning(ML)是解决传统程序在数据量大,条件多的情况下,使用代码处理复杂场景已经力不从心的情况下的一种解决方案。而DeepLea... 查看详情