VS Code 数据科学教程
本教程演示了如何使用 Visual Studio Code 和 Microsoft Python 扩展,以及常见的数据科学库来探索基本的数据科学场景。具体来说,您将使用泰坦尼克号的乘客数据,学习如何设置数据科学环境、导入和清理数据、创建一个用于预测泰坦尼克号上生存情况的机器学习模型,并评估生成模型的准确性。
先决条件
完成本教程需要以下安装。如果尚未安装,请务必安装它们。
-
从 Visual Studio Marketplace 安装 适用于 VS Code 的 Python 扩展 和 适用于 VS Code 的 Jupyter 扩展。有关安装扩展的更多详细信息,请参阅扩展市场。这两个扩展均由 Microsoft 发布。
-
注意:如果您已经安装了完整的 Anaconda 发行版,则无需安装 Miniconda。另外,如果您更喜欢不使用 Anaconda 或 Miniconda,可以创建一个 Python 虚拟环境并使用 pip 安装本教程所需的包。如果选择此方法,您需要安装以下包:pandas、jupyter、seaborn、scikit-learn、keras 和 tensorflow。
设置数据科学环境
Visual Studio Code 和 Python 扩展为数据科学场景提供了出色的编辑器。通过对 Jupyter notebook 的原生支持以及与 Anaconda 的结合,入门变得非常容易。在本节中,您将为本教程创建一个工作区,创建一个包含本教程所需数据科学模块的 Anaconda 环境,并创建一个用于创建机器学习模型的 Jupyter notebook。
-
首先为数据科学教程创建一个 Anaconda 环境。打开 Anaconda 命令提示符并运行
conda create -n myenv python=3.10 pandas jupyter seaborn scikit-learn keras tensorflow
来创建名为 myenv 的环境。有关创建和管理 Anaconda 环境的更多信息,请参阅 Anaconda 文档。 -
接下来,在方便的位置创建一个文件夹,用作本教程的 VS Code 工作区,将其命名为
hello_ds
。 -
通过运行 VS Code 并使用文件 > 打开文件夹命令在 VS Code 中打开项目文件夹。由于是您创建的文件夹,因此可以安全信任它。
-
VS Code 启动后,创建本教程将使用的 Jupyter notebook。打开命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 并选择创建:新建 Jupyter Notebook。
注意:另外,在 VS Code 文件资源管理器中,您可以使用新建文件图标创建一个名为
hello.ipynb
的 Notebook 文件。 -
使用文件 > 另存为... 将文件保存为
hello.ipynb
。 -
创建文件后,您应该会在 notebook 编辑器中看到打开的 Jupyter notebook。有关原生 Jupyter notebook 支持的更多信息,请阅读 Jupyter Notebooks 主题。
-
现在,选择 notebook 右上角的选择内核。
-
选择您上面创建的 Python 环境来运行您的内核。
-
要从 VS Code 的集成终端管理您的环境,请使用 (⌃` (Windows, Linux Ctrl+`)) 打开它。如果您的环境未激活,可以像在终端中一样激活它 (
conda activate myenv
)。
准备数据
本教程使用 泰坦尼克号数据集,该数据集可在 OpenML.org 获取,并来自 Vanderbilt 大学生物统计系 (https://hbiostat.org/data)。泰坦尼克号数据提供了泰坦尼克号乘客的生存信息以及年龄和船票等级等乘客特征。使用这些数据,本教程将建立一个模型来预测特定乘客是否会在泰坦尼克号沉没中幸存。本节展示了如何在 Jupyter notebook 中加载和操作数据。
-
首先,从 hbiostat.org 下载泰坦尼克号数据作为 CSV 文件(下载链接在右上角),命名为
titanic3.csv
,并将其保存到您在上一节中创建的hello_ds
文件夹中。 -
如果您尚未在 VS Code 中打开文件,请通过依次点击文件 > 打开文件夹来打开
hello_ds
文件夹和 Jupyter notebook (hello.ipynb
)。 -
在您的 Jupyter notebook 中,首先导入 pandas 和 numpy 库,这两个是常用的数据操作库,并将泰坦尼克号数据加载到 pandas 的 DataFrame 中。为此,将以下代码复制到 notebook 的第一个单元格中。有关在 VS Code 中使用 Jupyter notebook 的更多指导,请参阅 使用 Jupyter Notebooks 文档。
import pandas as pd import numpy as np data = pd.read_csv('titanic3.csv')
-
现在,使用运行单元格图标或 Shift+Enter 快捷方式运行该单元格。
-
单元格运行完成后,您可以使用变量资源管理器和数据查看器查看已加载的数据。首先选择 notebook 上方工具栏中的变量图标。
-
VS Code 底部将打开一个 JUPYTER: VARIABLES 面板。它包含当前运行的内核中已定义的变量列表。
-
要查看之前加载到 Pandas DataFrame 中的数据,请选择
data
变量左侧的数据查看器图标。 -
使用数据查看器可以查看、排序和筛选数据行。查看数据后,绘制数据的某些方面以帮助可视化不同变量之间的关系可能会有所帮助。
另外,您可以使用其他扩展(例如 Data Wrangler)提供的数据查看体验。Data Wrangler 扩展提供了丰富的用户界面,可以显示关于您的数据的洞察,并帮助您执行数据分析、质量检查、转换等。在我们的文档中了解更多关于 Data Wrangler 扩展的信息。
-
在绘制数据图之前,您需要确保数据没有问题。如果您查看泰坦尼克号的 csv 文件,会注意到一个问号 (“?”) 用于标识数据不可用的单元格。
虽然 Pandas 可以将此值读取到 DataFrame 中,但对于像 age 这样的列,结果是其数据类型将被设置为 object 而不是数字数据类型,这对于绘图来说是个问题。
这个问题可以通过将问号替换为 pandas 能够理解的缺失值来解决。将以下代码添加到 notebook 的下一个单元格中,将 age 和 fare 列中的问号替换为 numpy NaN 值。请注意,替换值后我们还需要更新列的数据类型。
提示:要添加新单元格,您可以使用现有单元格左下角的插入单元格图标。另外,您也可以使用 Esc 进入命令模式,然后按 B 键。
data.replace('?', np.nan, inplace= True) data = data.astype({"age": np.float64, "fare": np.float64})
注意:如果您需要查看用于列的数据类型,可以使用 DataFrame dtypes 属性。
-
现在数据已经整理好,您可以使用 seaborn 和 matplotlib 来查看数据集中的某些列如何与生存率相关联。将以下代码添加到 notebook 的下一个单元格中并运行,以查看生成的图表。
import seaborn as sns import matplotlib.pyplot as plt fig, axs = plt.subplots(ncols=5, figsize=(30,5)) sns.violinplot(x="survived", y="age", hue="sex", data=data, ax=axs[0]) sns.pointplot(x="sibsp", y="survived", hue="sex", data=data, ax=axs[1]) sns.pointplot(x="parch", y="survived", hue="sex", data=data, ax=axs[2]) sns.pointplot(x="pclass", y="survived", hue="sex", data=data, ax=axs[3]) sns.violinplot(x="survived", y="fare", hue="sex", data=data, ax=axs[4])
提示:要快速复制您的图表,您可以将鼠标悬停在图表的右上角,然后点击出现的复制到剪贴板按钮。您还可以通过点击展开图像按钮更好地查看图表的详细信息。
-
这些图表有助于查看生存率和数据输入变量之间的一些关系,但也可以使用 pandas 计算相关性。为此,用于计算相关性的所有变量都需要是数字类型,而当前性别存储为字符串。要将这些字符串值转换为整数,请添加并运行以下代码。
data.replace({'male': 1, 'female': 0}, inplace=True)
-
现在,您可以分析所有输入变量之间的相关性,以确定哪些特征是机器学习模型的最佳输入。值越接近 1,该值与结果之间的相关性越高。使用以下代码关联所有变量与生存率之间的关系。
data.corr(numeric_only=True).abs()[["survived"]]
-
查看相关性结果,您会注意到有些变量(如性别)与生存率的相关性相当高,而另一些变量(如亲属,sibsp = 兄弟姐妹或配偶,parch = 父母或子女)似乎相关性很小。
让我们假设 sibsp 和 parch 在影响生存率方面是相关的,并将它们分组到一个名为“亲属”的新列中,看看它们的组合是否与生存率有更高的相关性。为此,您将检查给定乘客的 sibsp 和 parch 数量是否大于 0,如果是,则可以认为他们有亲属在船上。
使用以下代码在数据集中创建一个名为
relatives
的新变量和列,并再次检查相关性。data['relatives'] = data.apply (lambda row: int((row['sibsp'] + row['parch']) > 0), axis=1) data.corr(numeric_only=True).abs()[["survived"]]
-
你会注意到,事实上,从一个人是否有亲属(而不是有多少亲属)的角度来看,与生存率的相关性更高。有了这些信息,您现在可以从数据集中删除低价值的 sibsp 和 parch 列,以及任何包含 NaN 值的行,最终得到可用于训练模型的数据集。
data = data[['sex', 'pclass','age','relatives','fare','survived']].dropna()
注意:尽管年龄的直接相关性较低,但仍保留它,因为与其他输入结合使用时,它可能仍然具有相关性,这似乎是合理的。
训练和评估模型
数据集准备就绪后,您现在可以开始创建模型了。在本节中,您将使用 scikit-learn 库(因为它提供了一些有用的辅助函数)对数据集进行预处理,训练一个分类模型来确定泰坦尼克号上的生存率,然后使用该模型和测试数据来确定其准确性。
-
训练模型时,常见的第一个步骤是将数据集划分为训练数据和验证数据。这允许您使用一部分数据训练模型,并使用另一部分数据测试模型。如果您使用所有数据来训练模型,就无法估计模型对从未见过的数据的实际表现。scikit-learn 库的一个优点是它提供了一个专门用于将数据集拆分为训练和测试数据的方法。
在 notebook 中添加并运行包含以下代码的单元格,以拆分数据。
from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(data[['sex','pclass','age','relatives','fare']], data.survived, test_size=0.2, random_state=0)
-
接下来,您将标准化输入,以便所有特征都被平等对待。例如,在数据集中,年龄的值范围约为 0-100,而性别只有 1 或 0。通过标准化所有变量,您可以确保值的范围都相同。在新的代码单元格中使用以下代码来缩放输入值。
from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(x_train) X_test = sc.transform(x_test)
-
有许多不同的机器学习算法可供选择来建模数据。scikit-learn 库还支持其中许多算法(详情)并提供了一个图表,可帮助您选择适合您的场景的算法。现在,使用朴素贝叶斯算法,这是一种常见的分类问题算法。添加包含以下代码的单元格来创建和训练该算法。
from sklearn.naive_bayes import GaussianNB model = GaussianNB() model.fit(X_train, y_train)
-
有了训练好的模型,您现在可以使用训练时保留的测试数据集对其进行测试。添加并运行以下代码来预测测试数据的结果并计算模型的准确性。
from sklearn import metrics predict_test = model.predict(X_test) print(metrics.accuracy_score(y_test, predict_test))
查看测试数据的结果,您会发现训练好的算法在预测生存率方面具有约 75% 的成功率。
(可选)使用神经网络
神经网络是一种使用权重和激活函数(模拟人类神经元)来根据提供的输入确定结果的模型。与您之前查看的机器学习算法不同,神经网络是一种深度学习形式,您无需事先知道解决问题集的理想算法。它可用于许多不同的场景,分类就是其中之一。在本节中,您将使用 Keras 库和 TensorFlow 来构建神经网络,并探索它如何处理泰坦尼克号数据集。
-
第一步是导入所需的库并创建模型。在本例中,您将使用序列神经网络,这是一种分层神经网络,其中多个层按顺序相互馈送。
from keras.models import Sequential from keras.layers import Dense model = Sequential()
-
定义模型后,下一步是添加神经网络的层。现在,我们保持简单,只使用三层。添加以下代码来创建神经网络的层。
model.add(Dense(5, kernel_initializer = 'uniform', activation = 'relu', input_dim = 5)) model.add(Dense(5, kernel_initializer = 'uniform', activation = 'relu')) model.add(Dense(1, kernel_initializer = 'uniform', activation = 'sigmoid'))
- 第一层将设置为具有维度 5,因为您有五个输入:性别、船票等级、年龄、亲属和船票价格。
- 最后一层必须输出 1,因为您需要一个 1 维输出,指示乘客是否能幸存。
- 中间层为简单起见保持为 5,尽管该值可以不同。
整流线性单元 (relu) 激活函数作为前两层的良好通用激活函数使用,而 sigmoid 激活函数是最后一层必需的,因为您想要的输出(乘客是否幸存)需要在 0-1 的范围内缩放(乘客幸存的概率)。
您也可以使用这行代码查看您构建的模型的摘要
model.summary()
-
模型创建后,需要进行编译。作为其中的一部分,您需要定义将使用的优化器类型、如何计算损失以及应优化哪些指标。添加以下代码来构建和训练模型。您会注意到,训练后准确率约为 61%。
注意:此步骤可能需要几秒到几分钟才能运行,具体取决于您的机器性能。
model.compile(optimizer="adam", loss='binary_crossentropy', metrics=['accuracy']) model.fit(X_train, y_train, batch_size=32, epochs=50)
-
现在模型已构建并训练完成,我们可以看看它在测试数据上的表现如何。
y_pred = np.rint(model.predict(X_test).flatten()) print(metrics.accuracy_score(y_test, y_pred))
与训练类似,您会注意到现在预测乘客生存率的准确率达到了 79%。使用这个简单的神经网络,结果比之前尝试的朴素贝叶斯分类器的 75% 准确率要好。
后续步骤
现在您已经熟悉了在 Visual Studio Code 中执行机器学习的基础知识,以下是一些其他可以查看的 Microsoft 资源和教程。
- 数据科学配置文件模板 - 创建一个包含精选扩展、设置和代码片段的新配置文件。
- 了解更多关于在 Visual Studio Code 中使用 Jupyter Notebooks 的信息(视频)。
- Azure Machine Learning for VS Code 入门,利用 Azure 的强大功能部署和优化您的模型。
- 在 Azure Open Data Sets 上查找更多可供探索的数据。