阿里云天池大赛赛题解析——机器学习篇-赛题一(7)

简介: 阿里云是国内知名的云计算、大数据、人工智能技术型公司,是阿里巴巴集团最重要的技术部门。阿里云天池是阿里云面向开发者和教育行业的资源输出部门,天池大赛是国内最大规模的人工智能算法赛事,致力于汇聚全球AI精英为企业解决真实问题。自2014年至今已举办数十次行业顶级算法赛事,全球参赛开发者超过30万人。然而对于更广大的普通开发者和大学生群体来说,高规格的算法大赛仍然具有很高的门槛。本书就是针对受众最广泛的新手人群而编写的,精选阿里巴巴最典型的人工智能算法应用案例,邀请天池大赛最顶级的获奖选手联合编撰,公开那些鲜为人知的技术秘籍,力图使每一个涉足数据智能算法技术的开发者从中获益......

2.2.4 可视化数据分布

      下面以可视化方式对数据特征、数据分布等进行探索分析。

1. 箱形图

      首先绘制训练集中特征变量V0 的箱形图:

fig = plt.figure(figsize=(4, 6)) # 指定绘图对象的宽度和高度

sns.boxplot(train_data['V0'],orient="v", width=0.5)

运行结果:

1.jpg

      从图中可以看出有偏离值,许多数据点位于下四分位点以下。

      然后绘制训练集中变量V0~V37 的箱形图:

column = train_data.columns.tolist()[:39] # 列表头

fig = plt.figure(figsize=(80, 60), dpi=75) # 指定绘图对象的宽度和高度

for i in range(38):

      plt.subplot(7, 8, i + 1) # 7 行8 列子图

      sns.boxplot(train_data[column[i]], orient="v", width=0.5) #箱式图

      plt.ylabel(column[i], fontsize=36)

plt.show()

运行结果:

2.jpg

      从图中发现数据存在许多偏离较大的异常值,可以考虑移除。

2. 获取异常数据并画图

      此方法是采用模型预测的形式找出异常值,可在看完模型训练和验证的理论讲解后,再回来仔细查看下面的代码。

      获取异常数据的函数,代码如下:

# function to detect outliers based on the predictions of a model

def find_outliers(model, X, y, sigma=3):

      # predict y values using model

      try:

          y_pred = pd.Series(model.predict(X), index=y.index)

      # if predicting fails, try fitting the model first

      except:

          model.fit(X,y)

          y_pred = pd.Series(model.predict(X), index=y.index)

      # calculate residuals between the model prediction and true y values

      resid = y - y_pred

      mean_resid = resid.mean()

      std_resid = resid.std()

      # calculate z statistic, define outliers to be where |z|>sigma

      z = (resid - mean_resid)/std_resid

      outliers = z[abs(z)>sigma].index

      # print and plot the results

      print('R2=',model.score(X,y))

      print("mse=",mean_squared_error(y,y_pred))

      print('---------------------------------------')

      print('mean of residuals:',mean_resid)

      print('std of residuals:',std_resid)

      print('---------------------------------------')

      print(len(outliers),'outliers:')

      print(outliers.tolist())

      plt.figure(figsize=(15,5))

      ax_131 = plt.subplot(1,3,1)

      plt.plot(y,y_pred,'.')

      plt.plot(y.loc[outliers],y_pred.loc[outliers],'ro')

      plt.legend(['Accepted','Outlier'])

      plt.xlabel('y')

      plt.ylabel('y_pred');

      ax_132=plt.subplot(1,3,2)

      plt.plot(y,y-y_pred,'.')

      plt.plot(y.loc[outliers],y.loc[outliers]-y_pred.loc[outliers],'ro')

      plt.legend(['Accepted','Outlier'])

      plt.xlabel('y')

      plt.ylabel('y - y_pred');

      ax_133=plt.subplot(1,3,3)

      z.plot.hist(bins=50,ax=ax_133)

      z.loc[outliers].plot.hist(color='r',bins=50,ax=ax_133)

      plt.legend(['Accepted','Outlier'])

      plt.xlabel('z')

      plt.savefig('outliers.png')

      return outliers

      通过岭回归模型找出异常值,并绘制其分布,代码如下:

from sklearn.linear_model import Ridge

from sklearn.metrics import mean_squared_error

X_train=train_data.iloc[:,0:-1]

y_train=train_data.iloc[:,-1]

outliers = find_outliers(Ridge(), X_train, y_train)

      运行结果:

R2= 0.8890858938210386

mse= 0.10734857773123635

---------------------------------------

mean of residuals: 7.686602970006927e-17

std of residuals: 0.3276976673193503

---------------------------------------

31 outliers:

[321, 348, 376, 777, 884, 1145, 1164, 1310, 1458, 1466, 1484, 1523, 1704,1874, 1879, 1979, 2002, 2279, 2528, 2620, 2645, 2647, 2667, 2668, 2669, 2696,2767, 2769, 2807, 2842, 2863]

3.jpg

      说明:也可以采用其他回归模型代替岭回归模型。

3. 直方图和Q-Q 图

      Q-Q 图是指数据的分位数和正态分布的分位数对比参照的图,如果数据符合正态分布,则所有的点都会落在直线上。首先,通过绘制特征变量V0 的直方图查看其在训练集中的统计分布,并绘制Q-Q 图查看V0 的分布是否近似于正态分布。

      绘制变量V0 的直方图和Q-Q 图,代码如下:

plt.figure(figsize=(10,5))

ax=plt.subplot(1,2,1)

sns.distplot(train_data['V0'],fit=stats.norm)

ax=plt.subplot(1,2,2)

res = stats.probplot(train_data['V0'], plot=plt)

      运行结果:


4.jpg

      可以看到,训练集中特征变量V0 的分布不是正态分布。

      然后,绘制训练集中所有变量的直方图和Q-Q 图。

train_cols = 6

train_rows = len(train_data.columns)

plt.figure(figsize=(4*train_cols,4*train_rows))

i=0

for col in train_data.columns:

      i+=1

      ax=plt.subplot(train_rows,train_cols,i)

      sns.distplot(train_data[col],fit=stats.norm)

      i+=1

      ax=plt.subplot(train_rows,train_cols,i)

      res = stats.probplot(train_data[col], plot=plt)

plt.tight_layout()

plt.show()

      篇幅所限,这里只展示一部分结果:

5.jpg

      从数据分布图可以发现,很多特征变量(如V1,V9,V24,V28 等)的数据分布不是正态的,数据并不跟随对角线分布,后续可以使用数据变换对其进行处理。

4. KDE 分布图

      KDE(Kernel Density Estimation,核密度估计)可以理解为是对直方图的加窗平滑。通过绘制KDE 分布图,可以查看并对比训练集和测试集中特征变量的分布情况,发现两个数据集中分布不一致的特征变量。

      首先对比同一特征变量V0 在训练集和测试集中的分布情况,并查看数据分布是否一致。

plt.figure(figsize=(8,4),dpi=150)

ax = sns.kdeplot(train_data['V0'], color="Red", shade=True)

ax = sns.kdeplot(test_data['V0'], color="Blue", shade=True)

ax.set_xlabel('V0')

ax.set_ylabel("Frequency")

ax = ax.legend(["train","test"])

      运行结果:

6.jpg

      可以看到,V0 在两个数据集中的分布基本一致。

      然后,对比所有变量在训练集和测试集中的KDE 分布。

dist_cols = 6

dist_rows = len(test_data.columns)

plt.figure(figsize=(4 * dist_cols, 4 * dist_rows))

i = 1

for col in test_data.columns:

    ax = plt.subplot(dist_rows, dist_cols, i)

    ax = sns.kdeplot(train_data[col], color="Red", shade=True)

    ax = sns.kdeplot(test_data[col], color="Blue", shade=True)

    ax.set_xlabel(col)

    ax.set_ylabel("Frequency")

    ax = ax.legend(["train", "test"])

    i += 1

plt.show()

      运行结果(这里只展示部分结果):

7.jpg

图1-2-12 分布不一致的特征

5. 线性回归关系图

      线性回归关系图主要用于分析变量之间的线性回归关系。首先查看特征变量V0 与target变量的线性回归关系。

fcols = 2

frows = 1

plt.figure(figsize=(8,4),dpi=150)

ax=plt.subplot(1,2,1)

sns.regplot(x='V0', y='target', data=train_data, ax=ax,

               scatter_kws={'marker':'.','s':3,'alpha':0.3},

               line_kws={'color':'k'});

plt.xlabel('V0')

plt.ylabel('target')

ax=plt.subplot(1,2,2)

sns.distplot(train_data['V0'].dropna())

plt.xlabel('V0')

plt.show()

      运行结果:

8.jpg

      然后查看所有特征变量与target 变量的线性回归关系。

fcols = 6

frows = len(test_data.columns)

plt.figure(figsize=(5*fcols,4*frows))

i=0

for col in test_data.columns:

    i+=1

    ax=plt.subplot(frows,fcols,i)

    sns.regplot(x=col, y='target', data=train_data, ax=ax,

                    scatter_kws={'marker':'.','s':3,'alpha':0.3},

                    line_kws={'color':'k'});

    plt.xlabel(col)

    plt.ylabel('target')

    i+=1

    ax=plt.subplot(frows,fcols,i)

    sns.distplot(train_data[col].dropna())

    plt.xlabel(col)

      运行结果:

9.jpg

相关文章
|
机器学习/深度学习 传感器 监控
机器学习:强化学习中的探索策略全解析
在机器学习的广阔领域中,强化学习(Reinforcement Learning, RL)无疑是一个充满魅力的子领域。它通过智能体与环境的交互,学习如何在特定的任务中做出最优决策。然而,在这个过程中,探索(exploration)和利用(exploitation)的平衡成为了智能体成功的关键。本文将深入探讨强化学习中的探索策略,包括其重要性、常用方法以及代码示例来论证这些策略的效果。
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
1095 3
|
机器学习/深度学习 自然语言处理 JavaScript
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
在信息论、机器学习和统计学领域中,KL散度(Kullback-Leibler散度)是量化概率分布差异的关键概念。本文深入探讨了KL散度及其相关概念,包括Jensen-Shannon散度和Renyi散度。KL散度用于衡量两个概率分布之间的差异,而Jensen-Shannon散度则提供了一种对称的度量方式。Renyi散度通过可调参数α,提供了更灵活的散度度量。这些概念不仅在理论研究中至关重要,在实际应用中也广泛用于数据压缩、变分自编码器、强化学习等领域。通过分析电子商务中的数据漂移实例,展示了这些散度指标在捕捉数据分布变化方面的独特优势,为企业提供了数据驱动的决策支持。
2695 2
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
|
机器学习/深度学习 算法 搜索推荐
机器学习“捷径”:自动特征工程全面解析
​ 在机器学习项目中,特征工程是影响模型性能的关键步骤。它通过从原始数据中提取出更有用的特征,帮助模型更好地捕捉数据中的模式。然而,传统的特征工程过程往往需要大量的领域知识和实验调整,是一项耗时费力的工作。 近年来,自动特征工程(Automated Feature Engineering)技术的兴起,为这一问题提供了新的解决方案。它旨在通过自动化方法从数据中生成和选择最优特征,使得特征工程过程更加高效。本文将详细介绍自动特征工程的基本概念、常用技术、工具,并通过代码示例展示其实际应用。
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
1921 3
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
1003 2
|
机器学习/深度学习 人工智能 算法
机器学习与深度学习:差异解析
机器学习与深度学习作为两大核心技术,各自拥有独特的魅力和应用价值。尽管它们紧密相连,但两者之间存在着显著的区别。本文将从定义、技术、数据需求、应用领域、模型复杂度以及计算资源等多个维度,对机器学习与深度学习进行深入对比,帮助您更好地理解它们之间的差异。
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
1023 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1702 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
732 4

热门文章

最新文章

推荐镜像

更多
  • DNS