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ノートブックが表示されるはずです。ネイティブJupyterノートブックサポートに関する追加情報については、Jupyter Notebooksのトピックを参照してください。
-
次に、ノートブックの右上にあるカーネルを選択をクリックします。
-
上記で作成したPython環境を選択して、カーネルを実行します。
-
VS Codeの統合ターミナルから環境を管理するには、(⌃` (Windows, Linux Ctrl+`)) で開きます。環境がアクティブになっていない場合は、ターミナルでアクティブ化するのと同じようにアクティブ化できます (
conda activate myenv
)。
データの準備
このチュートリアルでは、ヴァンダービルト大学生物統計学部が提供するhttps://hbiostat.org/data から入手したOpenML.org で入手可能なタイタニックデータセットを使用します。タイタニックデータは、タイタニック号の乗客の生存に関する情報と、年齢やチケットクラスなどの乗客に関する特徴を提供します。このデータを使用して、このチュートリアルでは、特定の乗客がタイタニック号の沈没から生き残ったかどうかを予測するモデルを構築します。このセクションでは、Jupyter Notebookでデータをロードおよび操作する方法を示します。
-
まず、hbiostat.org からタイタニックデータをCSVファイル (右上にあるダウンロードリンク) としてダウンロードし、
titanic3.csv
という名前で、前のセクションで作成したhello_ds
フォルダーに保存します。 -
まだVS Codeでファイルを開いていない場合は、ファイル > フォルダーを開くで
hello_ds
フォルダーとJupyterノートブック(hello.ipynb
)を開きます。 -
Jupyterノートブック内で、まずデータを操作するために使用される2つの一般的なライブラリであるpandasとnumpyライブラリをインポートし、Titanicデータをpandas DataFrameにロードします。これを行うには、以下のコードをノートブックの最初のセルにコピーします。VS CodeでJupyterノートブックを操作する方法の詳細については、Jupyterノートブックの操作ドキュメントを参照してください。
import pandas as pd import numpy as np data = pd.read_csv('titanic3.csv')
-
次に、セル実行アイコンまたはShift+Enterショートカットを使用してセルを実行します。
-
セルが実行を完了したら、変数エクスプローラーとデータビューアーを使用してロードされたデータを表示できます。まず、ノートブックの上部ツールバーにある変数アイコンを選択します。
-
VS Codeの下部にJUPYTER: 変数ペインが開きます。ここには、現在実行中のカーネルでこれまでに定義された変数のリストが含まれています。
-
以前にロードしたPandas DataFrameのデータを表示するには、
data
変数の左にあるデータビューアーアイコンを選択します。 -
データビューアーを使用して、データの行を表示、並べ替え、フィルター処理します。データをレビューした後、異なる変数間の関係を視覚化するために、そのいくつかの側面をグラフ化することが役立ちます。
または、Data Wranglerなどの他の拡張機能が提供するデータ表示エクスペリエンスを使用することもできます。Data Wrangler拡張機能は、データに関する洞察を表示し、データプロファイリング、品質チェック、変換などを実行するのに役立つ豊富なユーザーインターフェイスを提供します。ドキュメントでData Wrangler拡張機能について詳しく学ぶ。
-
データをグラフ化する前に、データに問題がないことを確認する必要があります。Titanicの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%であることがわかります。
(オプション)ニューラルネットワークを使用する
ニューラルネットワークは、人間のニューロンの側面をモデル化する重みと活性化関数を使用して、提供された入力に基づいて結果を決定するモデルです。以前に見た機械学習アルゴリズムとは異なり、ニューラルネットワークはディープラーニングの一種であり、問題設定に対する理想的なアルゴリズムを事前に知る必要はありません。さまざまなシナリオに使用でき、分類はその一つです。このセクションでは、TensorFlowとKerasライブラリを使用してニューラルネットワークを構築し、タイタニックデータセットをどのように処理するかを探ります。
-
最初のステップは、必要なライブラリをインポートし、モデルを作成することです。この場合、シーケンシャルニューラルネットワークを使用します。これは、複数のレイヤーがシーケンスで互いにフィードインする層状ニューラルネットワークです。
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でさらに探索するデータを見つけましょう。