在 VS Code 中进行数据科学教程
本教程演示如何使用Visual Studio Code和Microsoft Python扩展以及常见的数据科学库来探索一个基本的数据科学场景。具体来说,使用Titanic的乘客数据,您将学习如何设置数据科学环境,导入和清理数据,创建一个用于预测Titanic上生存的机器学习模型,并评估生成模型的准确性。
先决条件
完成本教程所需的以下安装。如果没有,请确保安装它们。
-
Visual Studio Marketplace 上的 Python 扩展 和 Jupyter 扩展。有关安装扩展的更多详细信息,请参阅 扩展市场。这两个扩展都由微软发布。
-
注意:如果您已经安装了完整的 Anaconda 分发版,那么不需要安装 Miniconda。或者,如果您不希望使用 Anaconda 或 Miniconda,您可以创建一个 Python 虚拟环境,并使用 pip 安装教程所需的包。如果您选择此方法,您需要安装以下包:pandas、jupyter、seaborn、scikit-learn、keras 和 tensorflow。
python -m pip install pandas jupyter seaborn scikit-learn keras tensorflow
建立数据科学环境
Visual Studio Code 和 Python 扩展为数据科学场景提供了一个出色的编辑器。通过与 Anaconda 的原生支持,Jupyter 笔记本的使用变得非常简单。在本节中,您将创建一个用于教程的工作区,创建一个包含教程所需数据科学模块的 Anaconda 环境,并创建一个用于创建机器学习模型的 Jupyter 笔记本。
-
首先为数据科学教程创建一个Anaconda环境。打开Anaconda命令提示符并运行
conda create -n myenv python=3.10 pandas jupyter seaborn scikit-learn keras tensorflow创建一个名为 myenv 的环境。有关创建和管理 Anaconda 环境的更多信息,请参阅 Anaconda 文档。 -
接下来,在一个方便的位置创建一个文件夹,作为 VS Code 教程的工作区,命名它
你好_ds输入:. -
在 VS Code 中打开项目文件夹,运行 VS Code 并使用 文件 > 打开文件夹 命令。由于是你创建的文件夹,你可以放心打开。
-
一旦 VS Code 启动,创建用于教程的 Jupyter 笔记本。打开命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 并选择 创建: 新的 Jupyter 笔记本.

注意:或者,从 VS Code 文件资源管理器中,您可以使用新建文件图标来创建一个名为 的 Notebook 文件
你好.ipynb输入:. -
将文件保存为
你好.ipynb使用 文件 > 另存为.... -
创建文件后,您应该在笔记本编辑器中看到打开的Jupyter notebook。有关原生Jupyter notebook支持的更多信息,您可以阅读Jupyter Notebooks主题。

-
现在选择 选择内核 在笔记本的右上角。

-
选择上面创建的Python环境来运行你的内核。

-
要从 VS Code 的集成终端管理你的环境,请用 (⌃` (Windows, Linux Ctrl+`)) 打开它。如果你的环境没有激活,你可以像在终端中一样激活它 (
conda 激活 myenv)。
准备数据
本教程使用了Titanic数据集,可在OpenML.org上获取,该数据集来源于Vanderbilt大学生物统计学系,网址为https://hbiostat.org/data。Titanic数据提供了关于泰坦尼克号乘客生存信息以及乘客的特征,如年龄和票价等级。利用这些数据,本教程将建立一个模型,以预测给定的乘客是否能在泰坦尼克号沉没时幸存下来。本节展示了如何在Jupyter notebook中加载和操作数据。
-
首先,从 hbiostat.org 下载泰坦尼克号数据,作为CSV文件(右上角的下载链接),命名为
titanic3.csv并将其保存到你好_ds在上一节中创建的文件夹。 -
如果你还没有在 VS Code 中打开该文件,请打开
你好_ds文件夹和Jupyter笔记本你好.ipynb),请转到文件 > 打开文件夹。 -
在你的Jupyter notebook中,首先导入pandas和numpy库,这两个库是用于数据操作的常见库,并将泰坦尼克号数据加载到pandasDataFrame中。为此,请将下面的代码复制到notebook的第一个单元格中。有关在VS Code中使用Jupyter notebook的更多指导,请参阅Working with Jupyter Notebooks文档。
导入 pandas 为 pd 导入 numpy 为 np data = pd.read_csv('titanic3.csv') -
现在,使用运行单元格图标或Shift+Enter快捷键来运行单元格。

-
单元格运行完成后,您可以使用变量浏览器和数据查看器查看加载的数据。首先选择笔记本顶部工具栏中的变量图标。

-
A JUPYTER: 变量 Windows将在 VS Code 的底部打开。它包含在您的运行内核中到目前为止定义的变量列表。

-
要查看之前加载的Pandas DataFrame中的数据,请选择左侧的数据显示图标
数据变量。
-
使用数据查看器来查看、排序和过滤数据行。在查看完数据后,将某些数据绘制成图表可以帮助可视化不同变量之间的关系。

或者,您可以使用其他扩展(如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 中的下一个单元格中添加以下代码并运行它以查看生成的图表。
导入 seaborn 为 sns 导入 matplotlib.pyplot 为 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=数据, ax=axs[4])
提示:要快速复制您的图表,您可以将鼠标悬停在图表的右上角,并点击出现的复制到剪贴板按钮。您还可以通过点击展开图像按钮来更好地查看图表的详细信息。

-
这些图表有助于了解生存和数据输入变量之间的某些关系,但也可以使用pandas来计算相关性。为此,所有用于相关性计算的变量必须是数值型,目前性别是以字符串形式存储的。要将这些字符串值转换为整数,请添加并运行以下代码。
data.replace({'male': 1, 'female': 0}, inplace=True) -
现在,您可以分析所有输入变量之间的相关性,以确定哪些特征是机器学习模型的最佳输入。值越接近1,该值与结果之间的相关性越高。使用以下代码来相关变量与生存之间的关系。
data.corr(numeric_only=True).abs()[["survived"]]
-
查看相关性结果,您会注意到一些变量,如性别,与生存有相当高的相关性,而其他变量,如亲属(sibsp 为兄弟姐妹或配偶,parch 为父母或子女),似乎与生存几乎没有相关性。
让我们假设 sibsp 和 parch 在影响生存率方面是相关的,并将它们组合成一个名为“relatives”的新列,以查看它们的组合是否与生存率有更高的相关性。为此,您将检查对于给定的乘客,sibsp 和 parch 的数量是否大于0,如果是,则可以说他们船上有一个亲属。
使用以下代码在数据集中创建一个名为的新变量和列
亲戚然后再次检查相关性。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库(因为它提供了一些有用的助手函数)来对数据集进行预处理,训练一个分类模型以确定在泰坦尼克号上是否能存活,然后使用该模型和测试数据来确定其准确性。
-
训练模型的常见第一步是将数据集分为训练数据和验证数据。这样可以让你使用部分数据来训练模型,并使用另一部分数据来测试模型。如果你使用所有数据来训练模型,就没有办法估计模型在尚未见过的数据上的实际表现。sklearn库的一个好处是它提供了一个专门的方法来将数据集分为训练数据和测试数据。
在笔记本中添加并运行以下代码以拆分数据。
从 sklearn.model_selection 导入 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。通过对所有变量进行归一化处理,您可以确保所有取值范围都是一样的。在新的代码单元格中使用以下代码来缩放输入值。
从 sklearn.preprocessing 导入 StandardScaler sc = StandardScaler() X_train = sc.fit_transform(x_train) X_test = sc.transform(x_test) -
有许多不同的机器学习算法可供您选择来建模数据。scikit-learn库还为其中的许多提供支持并提供了一个图表来帮助选择适合您场景的那个。目前,使用朴素贝叶斯算法,这是一个常见的分类问题算法。添加一个包含以下代码的单元格来创建和训练该算法。
从 sklearn.naive_bayes 导入 GaussianNB 模型 = GaussianNB() 模型.拟合(X_train, y_train) -
有了训练好的模型,现在你可以用保留下来的测试数据集来尝试模型。添加并运行以下代码来预测测试数据的结果并计算模型的准确率。
从 sklearn 导入 metrics predict_test = model.predict(X_test) 打印(metrics.accuracy_score(y_test, predict_test))
查看测试数据的结果,你会发现训练后的算法在预测生存率方面有约75%的成功率。
(可选)使用神经网络
神经网络是一种使用权重和激活函数的模型,模拟人类神经元的某些方面,以基于提供的输入确定结果。与之前你所看到的机器学习算法不同,神经网络是一种深度学习形式,你不需要事先知道你的问题集的理想算法。它可以用于许多不同的场景,分类就是其中之一。在本节中,你将使用Keras库与TensorFlow来构建神经网络,并探索它如何处理Titanic数据集。
-
首先,导入所需的库并创建模型。在这种情况下,您将使用Sequential神经网络,这是一种分层神经网络,其中多个层按顺序相互馈送。
从 keras.models 导入 Sequential 从 keras.layers 导入 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,因为您希望得到一个一维输出,表示乘客是否能存活。
- 中间层为了简单起见保持为5,尽管该值可能不同。
修正线性单元(relu)激活函数被用作前两层的良好通用激活函数,而对最后一层则需要使用Sigmoid激活函数,因为你想要的输出(乘客是否存活)需要在0-1范围内进行缩放(乘客存活的概率)。
你也可以通过这行代码查看你构建的模型的摘要:
model.summary()
-
一旦模型创建完成,就需要编译。作为其中的一部分,你需要定义将使用什么类型的优化器、如何计算损失以及应优化什么指标。在代码中添加以下内容以构建和训练模型。训练完成后,你会发现准确率约为61%。
注意:这一步可能需要几秒到几分钟不等,具体取决于您的机器。
model.compile(优化器="adam", 损失函数='二元交叉熵', 指标=['准确率']) model.fit(X_train, y_train, 批次大小=32, 轮数=50)
-
既然模型已经建立并训练完成,我们可以看看它在测试数据上的表现如何。
y_pred = np.rint(model.predict(X_test).flatten()) 打印(metrics.accuracy_score(y_test, y_pred))
类似于训练,你会发现现在在预测乘客生存情况时准确率达到了79%。使用这个简单的神经网络,结果比之前尝试的朴素贝叶斯分类器的75%准确率要好。
下一步
既然你已经熟悉了在Visual Studio Code中进行机器学习的基础知识,这里有一些其他微软资源和教程供你参考。
- 数据科学配置文件模板 - 创建一个新的配置文件,包含精选的扩展、设置和片段。
- 了解更多关于在 Visual Studio Code 中使用 Jupyter Notebooks 的信息 (视频).
- 开始使用 VS Code 中的 Azure Machine Learning,利用 Azure 的强大功能部署和优化您的模型。
- 在 Azure Open Data Sets 上找到更多数据进行探索。