你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure 中的 Ubuntu Data Science Virtual Machine 完成数据科学任务

本演练介绍如何使用 Ubuntu Data Science Virtual Machine (DSVM) 完成多项常见数据科学任务。 Ubuntu DSVM 是 Azure 中提供的虚拟机映像,其中预装了常用于执行数据分析和机器学习的工具集合。 预配 Ubuntu Data Science Virtual Machine 资源中逐项列出了主要的软件组件。 借助 DSVM 映像,只需花费几分钟时间即可轻松开展数据科学,且无需单独安装和配置每个工具。 如果需要,可以轻松地纵向扩展 DSVM,也可以在不使用时停止它。 DSVM 资源既具有弹性,又具有成本效益。

在本演练中,我们对 spambase 数据集进行了分析。 Spambase 是一组标记为 spam 或 ham(非 spam)的电子邮件。 Spambase 还包含有关电子邮件内容的一些统计信息。 本演练的稍后部分将讨论统计信息。

先决条件

在使用 Linux DSVM 之前,必须满足以下先决条件:

下载 spambase 数据集

spambase 数据集是一个相当小的数据集,其中包含 4,601 个示例。 由于资源要求适中,此资源的方便且易于管理的大小使我们能够轻松展示 DSVM 的一些主要功能。

注意

本演练是使用 D2 v2 大小的 Linux DSVM 创建的。 可以使用这种大小的 DSVM 来完成本演练中展示的过程。

如需更多存储空间,可以创建更多磁盘,并将其附加到 DSVM。 这些磁盘使用 Azure 永久性存储,所以即使服务器因为调整大小或关机而重新预配,它们的数据也会保留。 若要添加磁盘并将其附加到 DSVM,请执行将磁盘添加到 Linux VM 中的步骤。 添加磁盘的步骤使用已安装在 DSVM 上的 Azure CLI。 可以完全从 DSVM 中执行这些步骤。 还可以使用 Azure 文件存储来增加存储。

若要下载数据,打开终端窗口,然后运行以下命令:

wget --no-check-certificate https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data

下载的文件没有标头行。 接下来创建另一个具有标头的文件。 运行以下命令来创建具有适当标头的文件:

echo 'word_freq_make, word_freq_address, word_freq_all, word_freq_3d,word_freq_our, word_freq_over, word_freq_remove, word_freq_internet,word_freq_order, word_freq_mail, word_freq_receive, word_freq_will,word_freq_people, word_freq_report, word_freq_addresses, word_freq_free,word_freq_business, word_freq_email, word_freq_you, word_freq_credit,word_freq_your, word_freq_font, word_freq_000, word_freq_money,word_freq_hp, word_freq_hpl, word_freq_george, word_freq_650, word_freq_lab,word_freq_labs, word_freq_telnet, word_freq_857, word_freq_data,word_freq_415, word_freq_85, word_freq_technology, word_freq_1999,word_freq_parts, word_freq_pm, word_freq_direct, word_freq_cs, word_freq_meeting,word_freq_original, word_freq_project, word_freq_re, word_freq_edu,word_freq_table, word_freq_conference, char_freq_semicolon, char_freq_leftParen,char_freq_leftBracket, char_freq_exclamation, char_freq_dollar, char_freq_pound, capital_run_length_average,capital_run_length_longest, capital_run_length_total, spam' > headers

然后将两个文件相连接:

cat spambase.data >> headers
mv headers spambaseHeaders.data

数据集内有多种关于每封电子邮件的统计信息:

  • word_freq_WORD 等列指明电子邮件中的单词与 WORD 的匹配百分比。 例如,如果 word_freq_make 为 1,那么电子邮件中的所有单词有 1% 是 make
  • char_freq_CHAR 等列指明电子邮件中所有 CHAR 字符所占的百分比
  • capital_run_length_longest 是一连串大写字母的最大长度。
  • capital_run_length_average 是所有连串大写字母的平均长度。
  • capital_run_length_total 是所有连串大写字母的合计长度。
  • spam 指示是否将电子邮件视为垃圾邮件(1 = 垃圾邮件,0 = 不是垃圾邮件)。

使用 R Open 探索数据集

让我们检查数据,并使用 R 执行一些基本的机器学习任务。 DSVM 上已预装了 CRAN R。

若要获取本演练中使用的代码示例的副本,请使用 git 来克隆 Azure-Machine-Learning-Data-Science 存储库。 Git 已预装在 DSVM 上。 从 git 命令行运行:

git clone https://github.com/Azure/Azure-MachineLearning-DataScience.git

打开终端窗口,在 R 交互式控制台中启动一个新的 R 会话。 若要导入数据并设置环境,请运行:

data <- read.csv("spambaseHeaders.data")
set.seed(123)

此代码示例显示有关每个列的摘要统计信息:

summary(data)

有关数据的不同视图:

str(data)

此视图显示每个变量的类型和数据集中的前几个值。

spam 列作为一个整数被读取,但实际上它是一个分类变量 (或系数)。 若要设置其类型:

data$spam <- as.factor(data$spam)

若要进行一些探索分析,请使用 ggplot2 包,这是适用于 R 的常用绘图库。ggplot2 包已预装在 DSVM 上。 根据前面显示的摘要数据,我们已经获得有关感叹号字符的频率的汇总统计信息。 若要在此处绘制这些频率,请运行以下命令:

library(ggplot2)
ggplot(data) + geom_histogram(aes(x=char_freq_exclamation), binwidth=0.25)

由于零条形会扭曲绘图,因此我们将其消除:

email_with_exclamation = data[data$char_freq_exclamation > 0, ]
ggplot(email_with_exclamation) + geom_histogram(aes(x=char_freq_exclamation), binwidth=0.25)

有一个大于 1 的重要密度,看起来很有趣。 让我们只看该数据:

ggplot(data[data$char_freq_exclamation > 1, ]) + geom_histogram(aes(x=char_freq_exclamation), binwidth=0.25)

然后按垃圾邮件与非垃圾邮件来拆分它:

ggplot(data[data$char_freq_exclamation > 1, ], aes(x=char_freq_exclamation)) +
geom_density(lty=3) +
geom_density(aes(fill=spam, colour=spam), alpha=0.55) +
xlab("spam") +
ggtitle("Distribution of spam \nby frequency of !") +
labs(fill="spam", y="Density")

这些示例应有助于绘制类似的绘图和探索其他列中的数据。

训练和测试机器学习模型

让我们训练几个机器学习模型来识别数据集中包含垃圾邮件或非垃圾邮件的电子邮件。 在本部分中,我们会训练决策树模型和随机林模型。 然后,测试预测的准确性。

注意

DSVM 上已安装了以下代码中使用的 rpart(递归分区和回归树)包。

首先,让我们将该数据集拆分为训练集和测试集:

rnd <- runif(dim(data)[1])
trainSet = subset(data, rnd <= 0.7)
testSet = subset(data, rnd > 0.7)

然后创建决策树,将电子邮件分类:

require(rpart)
model.rpart <- rpart(spam ~ ., method = "class", data = trainSet)
plot(model.rpart)
text(model.rpart)

结果如下:

显示创建的决策树的示意图。

使用此代码示例来确定它对训练集的表现如何:

trainSetPred <- predict(model.rpart, newdata = trainSet, type = "class")
t <- table(`Actual Class` = trainSet$spam, `Predicted Class` = trainSetPred)
accuracy <- sum(diag(t))/sum(t)
accuracy

若要确定它对测试集的表现如何,请运行以下代码:

testSetPred <- predict(model.rpart, newdata = testSet, type = "class")
t <- table(`Actual Class` = testSet$spam, `Predicted Class` = testSetPred)
accuracy <- sum(diag(t))/sum(t)
accuracy

让我们也尝试一个随机林模型。 随机林训练多个决策树。 它输出一个类,该类是所有单独决策树的分类的模式值。 它们提供了一种更强大的机器学习方法,因为它们纠正了决策树模型过度拟合训练数据集的倾向。

require(randomForest)
trainVars <- setdiff(colnames(data), 'spam')
model.rf <- randomForest(x=trainSet[, trainVars], y=trainSet$spam)

trainSetPred <- predict(model.rf, newdata = trainSet[, trainVars], type = "class")
table(`Actual Class` = trainSet$spam, `Predicted Class` = trainSetPred)

testSetPred <- predict(model.rf, newdata = testSet[, trainVars], type = "class")
t <- table(`Actual Class` = testSet$spam, `Predicted Class` = testSetPred)
accuracy <- sum(diag(t))/sum(t)
accuracy

深度学习教程和演练

除了基于框架的示例外,我们还提供了一套综合演练。 这些演练可帮助你快速开始开发图像、文本语言理解等领域中的深度学习应用程序。

  • 在不同的框架中运行神经网络:一个综合演练,演示如何将代码从一个框架迁移到另一个框架。 它还演示了如何跨框架比较模型和运行时性能。

  • 生成端到端解决方案以检测图像中产品的操作方法指南:图像检测是一种在图像中查找对象并对其进行分类的技术。 该技术可以在许多现实商业领域提供巨大的回报。 例如,零售商可以使用此技术确定客户已从货架上选取哪个产品。 从而,此信息可帮助商店管理产品库存。

  • 音频深度学习:此教程展示如何使用城市声音数据集训练用于音频事件检测的深度学习模型。 此教程提供有关如何处理音频数据的概述。

  • 文本文档分类:本演练演示如何构建和训练两种不同的神经网络体系结构:分层网络和长短期记忆 (LSTM)。 这些神经网络使用用于深度学习的 Keras API 对文本文档进行分类。 Keras 是以下三大最热门深度学习框架的前端:Microsoft Cognitive Toolkit、TensorFlow 和 Theano。

其他工具

其余部分介绍了如何使用 Linux DSVM 上安装的一些工具。 让我们了解这些工具:

  • XGBoost
  • Python
  • JupyterHub
  • Rattle
  • PostgreSQL 和 SQuirreL SQL
  • Azure Synapse Analytics(以前称为 SQL DW)

XGBoost

XGBoost 可提供快速、准确的提升树实现。

require(xgboost)
data <- read.csv("spambaseHeaders.data")
set.seed(123)

rnd <- runif(dim(data)[1])
trainSet = subset(data, rnd <= 0.7)
testSet = subset(data, rnd > 0.7)

bst <- xgboost(data = data.matrix(trainSet[,0:57]), label = trainSet$spam, nthread = 2, nrounds = 2, objective = "binary:logistic")

pred <- predict(bst, data.matrix(testSet[, 0:57]))
accuracy <- 1.0 - mean(as.numeric(pred > 0.5) != testSet$spam)
print(paste("test accuracy = ", accuracy))

还可以从 Python 或命令行调用 XGBoost。

Python

对于 Python 开发,Anaconda Python 发行版 3.5 和 2.7 已预装在 DSVM 上。

注意

Anaconda 分发版包括 Conda。 可以使用 Conda 创建自定义 Python 环境,这些环境中安装了不同的版本或包。

让我们读入部分 spambase 数据集,并使用 Scikit-learn 中的支持向量机对电子邮件进行分类:

import pandas
from sklearn import svm
data = pandas.read_csv("spambaseHeaders.data", sep = ',\s*')
X = data.ix[:, 0:57]
y = data.ix[:, 57]
clf = svm.SVC()
clf.fit(X, y)

若要进行预测:

clf.predict(X.ix[0:20, :])

为演示如何发布 Azure 机器学习终结点,接下来创建更基本的模型。 我们将使用前面发布 R 模型时使用的三个变量:

X = data[["char_freq_dollar", "word_freq_remove", "word_freq_hp"]]
y = data.ix[:, 57]
clf = svm.SVC()
clf.fit(X, y)

JupyterHub

DSVM 中的 Anaconda 发行版附带了 Jupyter Notebook。 此资源是用于共享 Python、R 或 Julia 代码和分析的跨平台环境。 Jupyter Notebook 是可通过 JupyterHub 访问的。 可以使用本地 Linux 用户名和密码在 https://<DSVM DNS name or IP address>:8000/ 处登录。 可以在 /etc/jupyterhub 中找到所有 JupyterHub 配置文件。

注意

若要从当前内核中的 Jupyter Notebook 使用 Python 包管理器(通过 pip 命令),请在代码单元格中使用以下命令:

 import sys
 ! {sys.executable} -m pip install numpy -y

若要从当前内核中的 Jupyter Notebook 使用 Conda 安装程序(通过 conda 命令),请在代码单元格中使用以下命令:

 import sys
 ! {sys.prefix}/bin/conda install --yes --prefix {sys.prefix} numpy

DSVM 上已安装了几个示例 Notebook:

注意

Linux DSVM 上的命令行也提供了 Julia 语言。

Rattle

可以使用 Rattle (RAnalytical Tool To Learn Easily) 图形 R 工具进行数据挖掘。 Rattle 具有直观的界面,可方便地加载、浏览和转换数据,生成和评估模型。 Rattle:R 的数据挖掘 GUI一文提供了演练来演示 Rattle 的功能。

运行以下命令来安装并启动 Rattle:

if(!require("rattle")) install.packages("rattle")
require(rattle)
rattle()

注意

无需在 DSVM 上安装 Rattle。 但 Rattle 打开时,系统可能会提示安装其他程序包。

Rattle 使用一个基于选项卡的接口。 大部分选项卡与团队数据科学过程中的步骤相对应,如加载数据或浏览数据等。 数据科学过程从左到由通过选项卡流动。 最后一个选项卡包含 Rattle 运行的 R 命令的日志。

要加载和配置数据集:

  1. 若要加载文件,请选择“数据”选项卡
  2. 选择“文件名”旁边的选择器,然后选择“spambaseHeaders.data”
  3. 要加载文件, 选择“执行”。 应该会看到每一列的摘要,包括它的已标识数据类型;是输入、目标还是其他类型的变量,以及唯一值的数量
  4. Rattle 已经正确标识 spam 列作为目标。 选择“垃圾邮件”列,然后将“目标数据类型”设置为“分类”

要浏览数据:

  1. 选择“浏览”选项卡
  2. 若要查看变量类型的相关信息和一些摘要统计信息,请选择“摘要”>“执行”
  3. 若要查看每个变量其他类型的统计信息,请选择其他选项,如“描述”或“基本信息” 。

此外还可以使用“浏览”选项卡生成富有见解的绘图。 若要绘制数据直方图:

  1. 选择“分布”
  2. 对于 word_freq_remove 和 word_freq_you,选择“直方图”
  3. 选择“执行”。 应该会在一个图表窗口中看到两个密度绘图,很显然在电子邮件中 you 一词的出现比 remove 更频繁

“关联”绘图也值得关注。 若要创建绘图:

  1. 对于“类型”,请选择“关联”
  2. 选择“执行”
  3. Rattle 会发出警告,建议最多使用 40 个变量。 选择“是”以查看绘图

这里出现了一些有趣的关联。 例如,technology 与 HP 和 labs 密切关联。 它还与 650 密切关联,因为数据集捐赠者的区号是 650。

”资源管理器“窗口中提供了单词之间的关联性数值。 有意思的是,technology 很少与 your 和 money 关联 。

Rattle 可以转换数据集,以处理一些常见问题。 例如,它可以重新调整功能、输入缺失值、处理离群值,并删除缺少数据的变量或观察值。 Rattle 还可以识别观察值和变量之间的关联规则。 本介绍性演练不涵盖这些选项卡。

Rattle 还可以处理聚类分析。 让我们来排除某些功能,以使输出更易于理解。 在“数据”选项卡上,选择每个变量旁边的“忽略”,以下 10 项除外:

  • word_freq_hp
  • word_freq_technology
  • word_freq_george
  • word_freq_remove
  • word_freq_your
  • word_freq_dollar
  • word_freq_money
  • capital_run_length_longest
  • word_freq_business
  • spam

返回“群集”选项卡。选择 KMeans,然后将“群集的数”设置为 4 。 选择“执行”。 输出窗口会显示结果。 其中一个聚类具有高频率的 george 和 hp,可能是合法的企业电子邮件。

若要构建基本决策树机器学习模型:

  1. 选择“模型”选项卡
  2. 对于“类型”,请选择“树”
  3. 选择“执行”,在输出窗口中以文本形式显示树
  4. 选择”绘制“按钮,以查看图形版本。 决策树与我们之前使用 rpart 获取的树很相似。

Rattle 可以运行多个机器学习方法并快速评估它们。 这是一项有用的功能。 操作方法如下:

  1. 对于“类型”,请选择“全部”
  2. 选择“执行”
  3. 在 Rattle 完成运行后,可以选择任意“类型”值(如“SVM”),然后查看结果
  4. 还可以使用“评估”选项卡来比较验证集上模型的性能。例如,”错误矩阵“选项显示验证集上每个模型的混淆矩阵、整体错误和平均类错误。 此外,还可以绘制 ROC 曲线、运行敏感度分析,并执行其他类型的模型评估

生成模型后,选择“日志”选项卡以查看 Rattle 在会话期间运行的 R 代码。 可选择“导出”按钮来保存它。

注意

当前版本的 Rattle 中存在一个 Bug。 若要修改脚本或稍后使用它来重复步骤,必须在日志文本中的“导出此日志...”前面插入 # 字符。

PostgreSQL 和 SQuirreL SQL

DSVM 已预安装 PostgreSQL。 PostgreSQL 是一个复杂的开源关系数据库。 本部分介绍如何将 spambase 数据集加载到 PostgreSQL,然后对它进行查询。

在可以加载数据之前,必须允许来自 localhost 的密码身份验证。 在命令提示符处运行以下命令:

sudo gedit /var/lib/pgsql/data/pg_hba.conf

配置文件的底部附近的几行详细说明了允许的连接数:

# "local" is only for Unix domain socket connections:
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

更改“IPv4 local connections”行,以使用 md5 而不是 ident,这样我们就可以使用用户名和密码登录

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

然后重启 PostgreSQL 服务:

sudo systemctl restart postgresql

若要作为内置 postgres 用户启动 psql(PostgreSQL 的交互式终端),请运行以下命令:

sudo -u postgres psql

使用你用来登录的 Linux 帐户的用户名创建新的用户帐户。 创建密码:

CREATE USER <username> WITH CREATEDB;
CREATE DATABASE <username>;
ALTER USER <username> password '<password>';
\quit

登录到 psql:

psql

将数据导入新的数据库:

CREATE DATABASE spam;
\c spam
CREATE TABLE data (word_freq_make real, word_freq_address real, word_freq_all real, word_freq_3d real,word_freq_our real, word_freq_over real, word_freq_remove real, word_freq_internet real,word_freq_order real, word_freq_mail real, word_freq_receive real, word_freq_will real,word_freq_people real, word_freq_report real, word_freq_addresses real, word_freq_free real,word_freq_business real, word_freq_email real, word_freq_you real, word_freq_credit real,word_freq_your real, word_freq_font real, word_freq_000 real, word_freq_money real,word_freq_hp real, word_freq_hpl real, word_freq_george real, word_freq_650 real, word_freq_lab real,word_freq_labs real, word_freq_telnet real, word_freq_857 real, word_freq_data real,word_freq_415 real, word_freq_85 real, word_freq_technology real, word_freq_1999 real,word_freq_parts real, word_freq_pm real, word_freq_direct real, word_freq_cs real, word_freq_meeting real,word_freq_original real, word_freq_project real, word_freq_re real, word_freq_edu real,word_freq_table real, word_freq_conference real, char_freq_semicolon real, char_freq_leftParen real,char_freq_leftBracket real, char_freq_exclamation real, char_freq_dollar real, char_freq_pound real, capital_run_length_average real, capital_run_length_longest real, capital_run_length_total real, spam integer);
\copy data FROM /home/<username>/spambase.data DELIMITER ',' CSV;
\quit

现在,让我们来浏览数据并使用 SQuirreL SQL 运行一些查询 - SQuirreL SQL 是可以通过 JDBC 驱动程序来与数据库交互的图形工具。

首先,在“应用程序”菜单中打开 SQuirreL SQL。 若要设置驱动程序:

  1. 选择“Windows”>“查看驱动程序”
  2. 右键单击“PostgreSQL”,然后选择“修改驱动程序”
  3. 选择“附加类路径”>“添加”
  4. 对于“文件名”,请输入“/usr/share/java/jdbcdrivers/postgresql-9.4.1208.jre6.jar”
  5. 选择“打开”
  6. 选择“列出驱动程序”。 对于“类名”,请依次选择“org.postgresql.Driver”和“确定”

设置与本地服务器的连接:

  1. 选择“Windows”>“查看别名” 。
  2. 选择 + 按钮新建别名。 对于新别名,请输入“垃圾邮件数据库”
  3. 对于“驱动程序”,请选择“PostgreSQL”
  4. 将 URL 设置为“jdbc:postgresql://localhost/spam”
  5. 输入用户名和密码
  6. 选择“确定”
  7. 若要打开“连接”窗口,请双击“垃圾邮件数据库”别名
  8. 选择连接

运行一些查询:

  1. 选择“SQL”选项卡
  2. 在“SQL”选项卡顶部的查询框中输入基本查询:例如 SELECT * from data;
  3. 按 Ctrl+Enter 运行查询。 默认情况下,SQuirreL SQL 返回查询中的前 100 行

你可以运行更多查询来浏览此数据。 例如,在垃圾邮件和非垃圾邮件之间单词 make 的频率存在何种差异?

SELECT avg(word_freq_make), spam from data group by spam;

内容中频繁出现 3d 的电子邮件有什么特征?

SELECT * from data order by word_freq_3d desc;

大多数频繁出现 3d 的电子邮件显然是垃圾邮件。 此信息可能有助于构建预测模型来对电子邮件进行分类。

要使用 PostgreSQL 数据库中存储的数据进行机器学习,MADlib 效果很好。

Azure Synapse Analytics(以前称为 SQL DW)

Azure Synapse Analytics 是一种基于云的横向扩展数据库,可以处理大量数据(包括关系数据和非关系数据)。 有关详细信息,请访问什么是 Azure Synapse Analytics?

若要连接到数据仓库并创建表,请从命令提示符运行以下命令:

sqlcmd -S <server-name>.database.windows.net -d <database-name> -U <username> -P <password> -I

在 sqlcmd 提示符下,运行以下命令:

CREATE TABLE spam (word_freq_make real, word_freq_address real, word_freq_all real, word_freq_3d real,word_freq_our real, word_freq_over real, word_freq_remove real, word_freq_internet real,word_freq_order real, word_freq_mail real, word_freq_receive real, word_freq_will real,word_freq_people real, word_freq_report real, word_freq_addresses real, word_freq_free real,word_freq_business real, word_freq_email real, word_freq_you real, word_freq_credit real,word_freq_your real, word_freq_font real, word_freq_000 real, word_freq_money real,word_freq_hp real, word_freq_hpl real, word_freq_george real, word_freq_650 real, word_freq_lab real,word_freq_labs real, word_freq_telnet real, word_freq_857 real, word_freq_data real,word_freq_415 real, word_freq_85 real, word_freq_technology real, word_freq_1999 real,word_freq_parts real, word_freq_pm real, word_freq_direct real, word_freq_cs real, word_freq_meeting real,word_freq_original real, word_freq_project real, word_freq_re real, word_freq_edu real,word_freq_table real, word_freq_conference real, char_freq_semicolon real, char_freq_leftParen real,char_freq_leftBracket real, char_freq_exclamation real, char_freq_dollar real, char_freq_pound real, capital_run_length_average real, capital_run_length_longest real, capital_run_length_total real, spam integer) WITH (CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = ROUND_ROBIN);
GO

使用 bcp 复制数据:

bcp spam in spambaseHeaders.data -q -c -t  ',' -S <server-name>.database.windows.net -d <database-name> -U <username> -P <password> -F 1 -r "\r\n"

注意

下载的文件包含 Windows 样式的行尾。 bcp 工具需要 Unix 样式的行尾。 使用 -r 标志将此条件告知 bcp。

然后,使用 sqlcmd 进行查询:

select top 10 spam, char_freq_dollar from spam;
GO

还可以使用 SQuirreL SQL 进行查询。 使用 SQL Server JDBC 驱动程序执行类似于 PostgreSQL 的步骤。 JDBC 驱动程序位于 /usr/share/java/jdbcdrivers/sqljdbc42.jar 文件夹中。