VS Code でのデータ サイエンスのチュートリアル
このチュートリアルでは、Visual Studio Code と Microsoft Python 拡張機能、および一般的なデータ サイエンス ライブラリを使用して、基本的なデータ サイエンスのシナリオを検証する方法を示します。具体的には、タイタニック号の乗客データを使用して、データ サイエンス環境のセットアップ、データのインポートとクリーニング、タイタニック号での生存を予測するための機械学習モデルの作成、および生成されたモデルの精度評価の方法を学習します。
前提条件
このチュートリアルを完了するには、次のインストールが必要です。まだインストールしていない場合は、インストールしてください。
-
VS Code 用 Python 拡張機能 および Visual Studio Marketplace の 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
として保存します。 -
ファイルが作成されると、ノートブック エディターで開いている Jupyter Notebook が表示されます。ネイティブ Jupyter Notebook サポートの詳細については、「Jupyter Notebook」トピックを参照してください。
-
次に、ノートブックの右上にある [カーネルを選択] を選択します。
-
上記で作成した Python 環境を選択して、カーネルを実行します。
-
VS Code の統合ターミナルから環境を管理するには、(⌃` (Windows、Linux Ctrl+`)) でターミナルを開きます。環境がアクティブ化されていない場合は、ターミナルで行うのと同じようにアクティブ化できます (
conda activate myenv
)。
データの準備
このチュートリアルでは、タイタニック データセット (OpenML.org の OpenML.org で入手可能) を使用します。これは、バンダービルト大学の生物統計学部 (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 ライブラリ (データの操作によく使用される 2 つのライブラリ) をインポートし、タイタニック データを pandas の DataFrame にロードすることから始めます。これを行うには、次のコードをノートブックの最初のセルにコピーします。VS Code での Jupyter Notebook の操作に関するガイダンスについては、「Jupyter Notebook の操作」ドキュメントを参照してください。
import pandas as pd import numpy as np data = pd.read_csv('titanic3.csv')
-
次に、[セルの実行] アイコンまたは Shift+Enter ショートカットを使用してセルを実行します。
-
セルの実行が完了したら、変数エクスプローラーとデータ ビューアーを使用して、ロードされたデータを表示できます。まず、ノートブックの上部ツールバーにある [変数] アイコンを選択します。
-
[JUPYTER: 変数] ペインが VS Code の下部に開きます。これには、実行中のカーネルでこれまでに定義された変数のリストが含まれています。
-
以前にロードした Pandas DataFrame のデータを表示するには、
data
変数の左側にある [データ ビューアー] アイコンを選択します。 -
データ ビューアーを使用して、データの行を表示、並べ替え、フィルター処理します。データを確認した後、データのいくつかの側面をグラフ化して、異なる変数間の関係を視覚化すると役立つ場合があります。
または、Data Wrangler などの他の拡張機能によって提供されるデータ表示エクスペリエンスを使用することもできます。Data Wrangler 拡張機能は、データに関する洞察を示す豊富なユーザー インターフェイスを提供し、データ プロファイリング、品質チェック、変換などを実行するのに役立ちます。詳細については、ドキュメントの Data Wrangler 拡張機能を参照してください。
-
データをグラフ化する前に、データに問題がないことを確認する必要があります。タイタニック CSV ファイルを見ると、データが利用できないセルを識別するために疑問符 ("?") が使用されていることがわかります。
Pandas はこの値を DataFrame に読み込むことができますが、age のような列の結果は、データ型が数値データ型ではなく object に設定されることです。これはグラフ化には問題があります。
この問題は、疑問符を 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 は生存率に影響を与える方法で関連していると仮定し、それらを "親族" という名前の新しい列にグループ化して、それらの組み合わせが生存率との相関関係が高いかどうかを確認しましょう。これを行うには、特定の乗客の場合、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% の成功率を示したことがわかります。
(オプション) ニューラル ネットワークの使用
ニューラル ネットワークは、人間のニューロンの側面をモデル化する重みと活性化関数を使用して、提供された入力に基づいて結果を決定するモデルです。以前に検討した機械学習アルゴリズムとは異なり、ニューラル ネットワークは深層学習の一種であり、問題セットに最適なアルゴリズムを事前に知る必要はありません。さまざまなシナリオで使用でき、分類もその 1 つです。このセクションでは、Keras ライブラリと TensorFlow を使用してニューラル ネットワークを構築し、タイタニック データセットをどのように処理するかを検証します。
-
最初のステップは、必要なライブラリをインポートし、モデルを作成することです。この場合、Sequential ニューラル ネットワークを使用します。これは、複数のレイヤーが順番に相互にフィードする階層型ニューラル ネットワークです。
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'))
- 最初のレイヤーは、5 つの入力 (性別、乗船券の等級、年齢、親族、運賃) があるため、次元が 5 に設定されます。
- 最後のレイヤーは、乗客が生存するかどうかを示す 1 次元出力を必要とするため、1 を出力する必要があります。
- 中間レイヤーは、単純にするために 5 に保ちましたが、その値は異なっていてもかまいません。
最初の 2 つのレイヤーには適切な一般的な活性化関数として Rectified Linear Unit (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 Notebook の操作 (ビデオ) について詳しく学習します。
- VS Code 用 Azure Machine Learning を開始する ことで、Azure の力を利用してモデルをデプロイおよび最適化します。
- Azure Open Datasets で探索するデータをさらに見つけます。