0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

机器学习开发课程,使用Pandas探索数据分析

zhKF_jqr_AI 来源:未知 作者:李倩 2018-03-14 18:07 次阅读

编者按:Mail.Ru数据科学家Yury Kashnitsky和Segmento数据科学家Katya Demidova合作开设了机器学习开发课程。第一课介绍了如何使用Pandas进行数据分析。

这一篇文章意味着,我们OpenDataScience的开放机器学习课程开始了。这一课程的目标并不是开发另一个全面的机器学习或数据分析的引导课程(所以这并不能代替基础性的教育,在线和线下课程,培训,以及书籍)。本系列文章的目的是帮你快速温习知识,同时帮你找到进一步学习的主题。我们的角度和Deep Learning book的作者们类似,从回顾数学和机器学习基础开始——简短扼要,包含很多指向其他资源的链接。

这一课程的设计考虑到了理论和实践的平衡;因此,每个主题附带了作业。你可以参加Kaggle上相应的竞赛。

我们在OpenDataScience的Slack小组中讨论这一课程。请填写这个表单申请加入。

概览

关于本课程

作业说明

主要Pandas方法

预测电信运营商的客户离网率

作业一

参考资源

1. 关于本课程

大纲

使用Pandas探索数据分析

使用Python可视化数据

分类、决策树、K近邻

线性分类、线性回归

Bagging、随机森林

特征工程、特征选取

无监督学习:主成分分析、聚类

Vowpal Wabbit:学习GB级数据

使用Python进行时序分析

梯度提升

社区

我们的课程的最突出的优势之一就是活跃的社区。如果你加入OpenDataScience的Slack小组,你会发现文章和作业的作者们在#eng_mlcourse_open频道热心答疑。对初学者而言,这非常有用。请填写这个表单申请加入。表单会询问一些关于你的背景和技能的问题,包括几道简单的数学题。

我们的聊天比较随意,喜欢开玩笑,经常使用表情。不是所有的MOOC敢夸口说自己有这样一个活跃的社区。另外,Reddit上也有这一课程的subreddit。

预备知识

预备知识:

微积分的基本概念

线性代数

概率论和统计

Python编程技能

如果你需要补习一下,可以参考“Deep Learning”一书的第一部分,以及众多数学和Python的线上课程(例如,CodeAcademy的Python课程)。以后我们的wiki页面将补充更多信息

软件

目前而言,你只需要Anaconda(基于Python 3.6),就可以重现当前课程中的代码。在之后的课程中,你需要安装其他库,例如Xgboost和Vowpal Wabbit。

你也可以使用这个Docker容器,其中已经预装了所有需要用到的软件。更多信息请看相应的wiki页面。

2. 作业

每篇文章以Jupyter notebook的形式给出作业。作业包括补全代码片段,以及通过Google表单回答一些问题。

每个作业必须在一周之内完成。

请在OpenDataScience的Slack小组#eng_mlcourse_open频道或直接评论留言讨论课程内容。

作业的答案会发给提交了相应的Google表单的用户。

Pandas的主要方法

好吧……其实已经有很多关于Pandas和可视化数据分析的教程了。如果你很熟悉这些主题,请等待本系列的第3篇文章,正式开始机器学习的内容。

下面的材料以Jupyter notebook的形式查看效果最佳。如果你克隆了本教程的代码仓库,你也可以在本地运行。

Pandas是一个Python库,提供了大量数据分析的方法。数据科学家经常和表格形式的数据(比如.csv、.tsv、.xlsx)打交道。Pandas可以使用类似SQL的方式非常方便地加载、处理、分析这些表格形式的数据。搭配Matplotlib和Seaborn效果更好。

Pandas的主要数据结构是Series和DataFrame类。前者是一个包含某种固定类型数据的一维数组,后者是一个二维数据结构——一张表格——其中每列包含相同类型的数据。你可以把它看成Series实例构成的字典。DataFrame很适合表示真实数据:行代表实例(对象、观测,等等),列代表每个实例的相应特征。

我们将通过分析电信运营商的客户离网率数据集来展示Pandas的主要方法。我们首先通过read_csv读取数据,然后使用head方法查看前5行数据:

import pandas as pd

import numpy as np

df = pd.read_csv('../../data/telecom_churn.csv')

df.head()

每行对应一位客户,我们的研究对象,列则是对象的特征。

让我们查看一下数据的维度、特征名称和特征类型。

print(df.shape)

结果:

(3333, 20)

所以我们的表格包含3333行和20列。下面我们尝试打印列名:

print(df.columns)

结果:

Index(['State', 'Account length', 'Area code', 'International plan',

'Voice mail plan', 'Number vmail messages', 'Total day minutes',

'Total day calls', 'Total day charge', 'Total eve minutes',

'Total eve calls', 'Total eve charge', 'Total night minutes',

'Total night calls', 'Total night charge', 'Total intl minutes',

'Total intl calls', 'Total intl charge', 'Customer service calls',

'Churn'],

dtype='object')

我们可以使用info()方法输出dataframe的一些总体信息:

print(df.info())

RangeIndex: 3333 entries, 0 to 3332

Data columns (total 20 columns):

State 3333 non-null object

Account length 3333 non-null int64

Area code 3333 non-null int64

International plan 3333 non-null object

Voice mail plan 3333 non-null object

Number vmail messages 3333 non-null int64

Total day minutes 3333 non-null float64

Total day calls 3333 non-null int64

Total day charge 3333 non-null float64

Total eve minutes 3333 non-null float64

Total eve calls 3333 non-null int64

Total eve charge 3333 non-null float64

Total night minutes 3333 non-null float64

Total night calls 3333 non-null int64

Total night charge 3333 non-null float64

Total intl minutes 3333 non-null float64

Total intl calls 3333 non-null int64

Total intl charge 3333 non-null float64

Customer service calls 3333 non-null int64

Churn 3333 non-null bool

dtypes: bool(1), float64(8), int64(8), object(3)

memory usage: 498.1+ KB

None

bool、int64、float64和object是我们特征的数据类型。这一方法同时也会显示是否有缺失的值。在上面的例子中答案是没有缺失,因为每列都包含3333个观测,和我们之前使用shape方法得到的数字是一致的。

我们可以通过astype方法更改列的类型。让我们将这一方法应用到Churn特征以将其修改为int64:

df['Churn'] = df['Churn'].astype('int64')

describe方法可以显示数值特征(int64和float64)的基本统计学特性:未缺失值的数值、均值、标准差、范围、四分位数。

df.describe()

查看非数值特征的统计数据时,需要通过include参数显式指定包含的数据类型:

df.describe(include=['object', 'bool'])

类别(类型为object)和布尔值(类型为bool)特征可以应用value_counts方法。让我们看下Churn的分布:

df['Churn'].value_counts()

结果:

0 2850

1 483

Name: Churn, dtype: int64

3333位客户中,2850位是忠实客户;他们的Churn值为0。调用value_counts函数时,带上normalize=True参数可以显示比例:

df['Churn'].value_counts(normalize=True)

结果:

0 0.855086

1 0.144914

Name: Churn, dtype: float64

排序

DataFrame可以根据某个变量的值(也就是列)排序。比如,根据每日消费额排序(ascending=False倒序):

df.sort_values(by='Total day charge', ascending=False).head()

此外,还可以根据多个列的数值排序:

df.sort_values(by=['Churn', 'Total day charge'], ascending=[True, False]).head()

索引和获取数据

DataFrame可以以不同的方式索引。

使用DataFrame['Name']可以得到一个单独的列。比如:离网率有多高?

df['Churn'].mean()

结果:

0.14491449144914492

对一家公司而言,14.5%的离网率是一个很糟糕的数据;这么高的离网率可能导致公司破产。

布尔值索引同样很方便。语法是df[P(df['Name'])],P是检查Name列每个元素的逻辑条件。这一索引的结果是DataFrame的Name列中满足P条件的行。

让我们使用布尔值索引来回答这样一个问题:

离网用户的数值变量的均值是多少?

df[df['Churn'] == 1].mean()

结果:

Account length 102.664596

Area code 437.817805

Number vmail messages 5.115942

Total day minutes 206.914079

Total day calls 101.335404

Total day charge 35.175921

Total eve minutes 212.410145

Total eve calls 100.561077

Total eve charge 18.054969

Total night minutes 205.231677

Total night calls 100.399586

Total night charge 9.235528

Total intl minutes 10.700000

Total intl calls 4.163561

Total intl charge 2.889545

Customer service calls 2.229814

Churn 1.000000

dtype: float64

离网用户在白天打电话的总时长的均值是多少?

df[df['Churn'] == 1]['Total day minutes'].mean()

结果:

206.91407867494814

未使用国际套餐的忠实用户(Churn == 0)所打的最长的国际长途是多久?

df[(df['Churn'] == 0) & (df['International plan'] == 'No')]['Total intl minutes'].max()

结果:

18.899999999999999

DataFrame可以通过列名、行名、行号进行索引。loc方法为通过名称索引,iloc方法为通过数字索引。

loc的例子:给我们0至5行(含)、State(州)至Area code(区号)(含)的数据;iloc的例子:给我们前5行、前3列的数据(和典型的Python切片一样,不含最大值)。

df.loc[0:5, 'State':'Area code']

df.iloc[0:5, 0:3]

df[:1]和df[-1:]可以得到DataFrame的首行和末行。(译者注:个人更喜欢用df.head(1)和df.tail(1)。)

应用函数到单元格、列、行

使用apply()方法应用函数至每一列:

df.apply(np.max)

结果:

State WY

Account length 243

Area code 510

International plan Yes

Voice mail plan Yes

Number vmail messages 51

Total day minutes 350.8

Total day calls 165

Total day charge 59.64

Total eve minutes 363.7

Total eve calls 170

Total eve charge 30.91

Total night minutes 395

Total night calls 175

Total night charge 17.77

Total intl minutes 20

Total intl calls 20

Total intl charge 5.4

Customer service calls 9

Churn 1

dtype: object

apply方法也可以应用函数至每一行,指定axis=1即可。lambda函数在这一场景下十分方便。比如,选中所有以W开头的州:

df[df['State'].apply(lambda state: state[0] == 'W')].head()

map方法可以替换某一列中的值:

d = {'No' : False, 'Yes' : True}

df['International plan'] = df['International plan'].map(d)

df.head()

其实也可以直接使用replace方法:

df = df.replace({'Voice mail plan': d})

df.head()

Pandas下分组数据的一般形式为:

df.groupby(by=grouping_columns)[columns_to_show].function()

groupby方法根据grouping_columns的值进行分组。

接着,选中感兴趣的列(columns_to_show)。如果不包括这一项,那么会包括所有非groupby列。

最后,应用一个或多个函数。

在下面的例子中,我们根据Churn变量的值分组数据,显示每组的统计数据:

columns_to_show = ['Total day minutes', 'Total eve minutes',

'Total night minutes']

df.groupby(['Churn'])[columns_to_show].describe(percentiles=[])

和上面的例子类似,只不过这次将一些函数传给agg():

columns_to_show = ['Total day minutes', 'Total eve minutes',

'Total night minutes']

df.groupby(['Churn'])[columns_to_show].agg([np.mean, np.std,

np.min, np.max])

汇总表

假设我们想知道样本的Churn(离网)和International plan(国际套餐)的分布,我们可以使用crosstab方法构建一个列联表(contingency table):

pd.crosstab(df['Churn'], df['International plan'])

Churn(离网)和Voice mail plan(语音邮件套餐)的分布:

pd.crosstab(df['Churn'], df['Voice mail plan'], normalize=True)

我们可以看到,大部分用户是忠实的,同时并不使用额外的服务(国际套餐、语音邮件)。

对熟悉Excel的而言,这很像Excel中的透视表(pivot table)。当然,Pandas实现了透视表:pivot_table方法接受以下参数:

values需要计算统计数据的变量列表

index分组数据的变量列表

aggfunc需要计算哪些统计数据,例如,总和、均值、最大值、最小值,等等。

让我们看下不同区号下白天、夜晚、深夜的电话量的均值:

df.pivot_table(['Total day calls', 'Total eve calls', 'Total night calls'], ['Area code'], aggfunc='mean')

转换DataFrame

和其他很多Pandas任务一样,在DataFrame中新增列有很多方法。

比如,为所有用户计算总的电话量:

total_calls = df['Total day calls'] + df['Total eve calls'] +

df['Total night calls'] + df['Total intl calls']

df.insert(loc=len(df.columns), column='Total calls', value=total_calls)

df.head()

上面的代码创建了一个中间Series实例,其实可以直接添加:

df['Total charge'] = df['Total day charge'] + df['Total eve charge'] +

df['Total night charge'] + df['Total intl charge']

df.head()

使用drop方法删除列和行,将相应的索引和axis参数(1表示删除列,0表示删除行,默认值为0)传给drop方法。inplace参数表示是否修改原始DataFrame(False表示不修改现有DataFrame,返回一个新DataFrame,True表示修改当前DataFrame)。

# 移除先前创建的列

df.drop(['Total charge', 'Total calls'], axis=1, inplace=True)

# 如何删除行

df.drop([1, 2]).head()

4. 预测离网率的首次尝试

让我们看下International plan(国际套餐)变量和离网率的相关性。我们将通过crosstab列联表来查看这一关系,我们也将使用Seaborn进行可视化分析(不过,可视化分析的更多内容将在本系列的下一篇文章介绍):

pd.crosstab(df['Churn'], df['International plan'], margins=True)

# 加载模块,配置绘图

%matplotlib inline

import matplotlib.pyplot as plt

# pip install seaborn

import seaborn as sns

plt.rcParams['figure.figsize'] = (8, 6)

sns.countplot(x='International plan', hue='Churn', data=df);

我们看到,开通了国际套餐的用户的离网率要高很多,这是一个很有趣的观测结果。也许,国际电话高昂、难以控制的话费很容易引起争端,让电信运营商的客户很不满意。

接下来,让我们查看下另一个重要特征——客服呼叫。我们同样编制一张汇总表,并绘制一幅图像。

pd.crosstab(df['Churn'], df['Customer service calls'], margins=True)

sns.countplot(x='Customer service calls', hue='Churn', data=df);

也许汇总表不是很明显,但图形很明显地显示了,从4次客户呼叫开始,离网率显著提升了。

让我们给DataFrame添加一个二元属性——客户呼叫超过3次。同样让我们看下它与离网率的相关性:

df['Many_service_calls'] = (df['Customer service calls'] > 3).astype('int')

pd.crosstab(df['Many_service_calls'], df['Churn'], margins=True)

sns.countplot(x='Many_service_calls', hue='Churn', data=df);

让我们创建另一张列联表,将Churn(离网)与International plan(国际套餐)及新创建的Many_service_calls(多次客服呼叫)关联起来:

pd.crosstab(df['Many_service_calls'] & df['International plan'] , df['Churn'])

因此,预测客户呼叫客服超过3次,且已开通国际套餐的情况下会离网(Churn=1),我们可以期望的精确度为85.8%的精确度(我们只有464+9次弄错了)。我们基于非常简单的推理得到的数字85.8%,可以作为一个良好的开端(我们即将创建的更多机器学习模型的基线)。

复习一下我们介绍的内容:

样本中忠实客户的份额为85.5%。这意味着最幼稚总是预测“忠实客户”的模型有85.5%的概率猜对。也就是说,后续模型的正确答案的比例(精确度)不应该比这个数字少,并且很有希望显著高于这个数字;

基于一个简单的预测“(客服呼叫次数 > 3) & (国际套餐 = True) => Churn = 1, else Churn = 0”,我们可以期望85.8%的精确度,刚刚超过85.5%。以后我们将讨论决策树,看看如何仅仅基于输入数据自动找出这样的规则;

我们没有应用机器学习就得到这两条基线,它们将作为后续模型的开端。如果经过大量的努力,我们将正确答案的份额提高了0.5%,那么也许我们搞错了什么,限制使用一个包含两个条件的简单模型已经足够了;

在训练复杂模型之间,建议摆弄下数据,绘制一些图表,检查一下简单的假设。此外,在业务上应用机器学习时,通常从简单的方案开始,接着尝试更复杂的方案。

5. 作业一

第一次作业将分析包含美国居民的人口信息的UCI成人数据。我们建议你在Jupyter notebook中完成这些任务,然后通过Google表单回答10个问题。提交表单之后,同样可以编辑你的回答。

截止日期:February 11, 23:59 CE

6. 相关资源

首先,当然是Pandas官方文档

10 minutes to pandas(十分钟入门pandas)

Pandas cheatsheet PDF

GitHub仓库:Pandas exercises(Pandas练习)和Effective Pandas

scipy-lectures.org pandas、numpy、matplotlib、scikit-learn教程

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    66

    文章

    8375

    浏览量

    132400
  • 数据分析
    +关注

    关注

    2

    文章

    1427

    浏览量

    34010

原文标题:机器学习开放课程(一):使用Pandas探索数据分析

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    怎么有效学习Python数据分析

    Python在人工智能、机器学习领域受到火热追捧,很大程度上在于它拥有非常庞大的第三方库,以及强大的通用编程性能。因此,快速掌握Python进行数据分析,就是学习Python各种第三方
    发表于 06-28 15:18

    pandas数据分析的方法

    pandas数据分析中常用方法
    发表于 06-03 06:16

    推荐几本机器学习和深度学习必读书籍+机器学习实战视频PPT+大数据分析书籍

    小白 机器学习和深度学习必读书籍+机器学习实战视频PPT+大数据分析书籍推荐!
    发表于 07-22 17:02

    pandas数据分析常见操作

    数据分析-pandas数据处理清洗常用总结
    发表于 08-08 06:46

    pandas是什么?

    的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器
    发表于 07-14 07:48

    pandas是什么

    人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习
    发表于 08-09 07:39

    机器学习的基础内容

    学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于Num
    发表于 08-20 08:07

    如何去使用pandas工具

    学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于Num
    发表于 08-24 06:49

    pandas的定义及使用步骤

    学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于Num
    发表于 08-24 07:10

    pandas是什么?

    人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习
    发表于 01-12 07:53

    pandas的使用步骤有哪些呢

    学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于Num
    发表于 01-12 07:18

    机器学习的基础内容介绍

    学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于Num
    发表于 01-12 08:12

    机器学习的基础内容汇总

    人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习
    发表于 02-28 06:12

    12种用于数据分析Pandas技巧可用来学习Python详细概述

    如果你正开始学习Python,而且目标是数据分析,相信NumPy、SciPy、Pandas会是你进阶路上的必备法宝。尤其是对数学专业的人来说,Pandas可以作为一个首选的
    的头像 发表于 05-19 11:40 5303次阅读

    机器学习数据分析中的应用

    随着大数据时代的到来,数据量的爆炸性增长对数据分析提出了更高的要求。机器学习作为一种强大的工具,通过训练模型从
    的头像 发表于 07-02 11:22 543次阅读