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
という名前のノートブックファイルを作成することもできます。 -
ファイル > 名前を付けて保存... を使用して、ファイルを
hello.ipynb
として保存します。 -
ファイルが作成されたら、ノートブックエディターで開いている Jupyter Notebook が表示されるはずです。ネイティブの Jupyter Notebook サポートに関する追加情報については、「Jupyter Notebook を使用する」トピックを参照してください。
-
次に、ノートブックの右上にある **カーネルの選択** を選択します。
-
上記で作成した Python 環境を選択して、カーネルを実行します。
-
VS Code の統合ターミナルから環境を管理するには、(⌃` (Windows, Linux Ctrl+`)) で開きます。環境がアクティブ化されていない場合は、ターミナルで行うのと同様にアクティブ化できます (
conda activate myenv
)。
データの準備
このチュートリアルでは、OpenML.org で入手可能な Titanic データセットを使用します。これは、バンダービルト大学生物統計学部 (https://hbiostat.org/data) から入手したものです。タイタニック号のデータは、乗客の生存に関する情報と、年齢やチケットクラスなどの乗客の特性を提供します。このデータを使用して、チュートリアルでは、特定の乗客がタイタニック号の沈没から生き残ったかどうかを予測するモデルを確立します。このセクションでは、Jupyter Notebook でデータをロードおよび操作する方法を示します。
-
まず、hbiostat.org から
titanic3.csv
という名前の CSV ファイルとしてタイタニックデータをダウンロードし (ダウンロードリンクは右上)、前のセクションで作成したhello_ds
フォルダーに保存します。 -
まだ VS Code でファイルを開いていない場合は、**ファイル** > **フォルダーを開く** に移動して、
hello_ds
フォルダーと Jupyter Notebook (hello.ipynb
) を開きます。 -
Jupyter Notebook 内で、まずデータを操作するために使用される一般的なライブラリである pandas と numpy をインポートし、タイタニックデータを pandas の DataFrame にロードします。これを行うには、以下のコードをノートブックの最初のセルにコピーします。VS Code で Jupyter Notebook を操作する方法の詳細については、「Jupyter Notebook を使用する」ドキュメントを参照してください。
import pandas as pd import numpy as np data = pd.read_csv('titanic3.csv')
-
次に、セル実行アイコンまたは Shift+Enter ショートカットを使用してセルを実行します。
-
セルが実行を完了したら、変数エクスプローラーとデータビューアーを使用してロードされたデータを表示できます。まず、ノートブックの上部ツールバーにある**変数**アイコンを選択します。
-
VS Code の下部に **JUPYTER: VARIABLES** ペインが開きます。ここには、実行中のカーネルでこれまでに定義された変数のリストが含まれています。
-
以前にロードされた Pandas DataFrame のデータを表示するには、
data
変数の左にあるデータビューアーアイコンを選択します。 -
データビューアーを使用して、データの行を表示、並べ替え、フィルター処理します。データをレビューした後、異なる変数間の関係を視覚化するために、そのいくつかの側面をグラフ化すると役立つ場合があります。
または、Data Wrangler のような他の拡張機能が提供するデータ表示エクスペリエンスを使用することもできます。Data Wrangler 拡張機能は、データに関する洞察を示す豊富なユーザーインターフェイスを提供し、データのプロファイリング、品質チェック、変換などを実行するのに役立ちます。ドキュメントで Data Wrangler 拡張機能の詳細を確認してください。
-
データをグラフ化する前に、データに問題がないことを確認する必要があります。タイタニック号の CSV ファイルを見ると、データが利用できないセルを識別するために疑問符 ("?") が使用されていることに気づくでしょう。
Pandas はこの値を DataFrame に読み込むことができますが、**年齢**のような列の結果として、そのデータ型が数値データ型ではなく**オブジェクト**に設定されてしまい、グラフ化する上で問題となります。
この問題は、疑問符を pandas が理解できる欠損値に置き換えることで修正できます。以下のコードをノートブックの次のセルに追加して、**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 を使用して、データセットの特定の列が生存率にどのように関連しているかを確認できます。以下のコードをノートブックの次のセルに追加し、実行して生成されたプロットを確認してください。
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 は生存率に影響を与える方法で関連していると仮定し、それらを「relatives」という新しい列にグループ化して、それらの組み合わせが生存率により高い相関があるかどうかを確認してみましょう。これを行うには、特定の乗客について、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 ライブラリの利点は、データセットをトレーニングデータとテストデータに分割するためのメソッドを特別に提供していることです。
以下のコードを含むセルをノートブックに追加して実行し、データを分割します。
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()
-
モデルを定義したら、次のステップはニューラルネットワークの層を追加することです。ここでは、シンプルに 3 つの層のみを使用します。以下のコードを追加して、ニューラルネットワークの層を作成します。
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'))
- 最初の層は、性別、pclass、年齢、親族、運賃という 5 つの入力があるため、次元を 5 に設定します。
- 乗客が生存するかどうかを示す 1 次元の出力を望むため、最後の層は 1 を出力する必要があります。
- 中間層は、簡潔にするために 5 に維持しましたが、この値は異なることも可能です。
最初の 2 つの層には、汎用的な活性化関数として ReLU (整流線形ユニット) 活性化関数が使用され、最後の層にはシグモイド活性化関数が必要です。これは、望む出力 (乗客が生存するかどうか) が 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 Notebook の操作 (ビデオ) について詳しく学びましょう。
- VS Code 用 Azure Machine Learning の使用を開始して、Azure の機能を使用してモデルをデプロイおよび最適化します。
- Azure Open Data Sets で、さらに探索するデータを見つけてください。