VS Codeのエージェントモードを拡張するには、を試してください!

VS Codeでのデータサイエンスチュートリアル

このチュートリアルでは、Visual Studio Code と Microsoft Python 拡張機能を一般的なデータサイエンスライブラリと組み合わせて使用し、基本的なデータサイエンスシナリオを探求する方法を説明します。具体的には、タイタニック号の乗客データを使用して、データサイエンス環境のセットアップ、データのインポートとクリーニング、タイタニック号での生存を予測するための機械学習モデルの作成、生成されたモデルの精度の評価方法を学びます。

前提条件

このチュートリアルを完了するには、以下のインストールが必要です。まだインストールしていない場合は、必ずインストールしてください。

  • Visual Studio Code

  • Visual Studio MarketplaceからVS Code用Python拡張機能VS Code用Jupyter拡張機能。拡張機能のインストールの詳細については、拡張機能マーケットプレイスを参照してください。どちらの拡張機能もMicrosoftによって公開されています。

  • 最新のPythonを含むMiniconda

    : フルバージョンのAnacondaディストリビューションが既にインストールされている場合は、Minicondaをインストールする必要はありません。あるいは、AnacondaまたはMinicondaを使用しない場合は、Python仮想環境を作成し、pipを使用してチュートリアルに必要なパッケージをインストールできます。この方法を選択する場合、以下のパッケージをインストールする必要があります: pandas、jupyter、seaborn、scikit-learn、keras、tensorflow。

データサイエンス環境のセットアップ

Visual Studio CodeとPython拡張機能は、データサイエンスのシナリオに優れたエディターを提供します。Jupyter NotebookのネイティブサポートとAnacondaの組み合わせにより、簡単に始めることができます。このセクションでは、チュートリアル用のワークスペースを作成し、チュートリアルに必要なデータサイエンスモジュールを含むAnaconda環境を作成し、機械学習モデルの作成に使用するJupyter Notebookを作成します。

  1. まず、データサイエンスチュートリアル用のAnaconda環境を作成します。Anacondaコマンドプロンプトを開き、conda create -n myenv python=3.10 pandas jupyter seaborn scikit-learn keras tensorflowを実行して、myenvという名前の環境を作成します。Anaconda環境の作成と管理に関する追加情報については、Anacondaドキュメントを参照してください。

  2. 次に、チュートリアル用のVS Codeワークスペースとして機能するフォルダーを都合の良い場所に作成し、hello_dsという名前を付けます。

  3. VS Codeを起動し、ファイル > フォルダーを開くコマンドを使用して、プロジェクトフォルダーをVS Codeで開きます。ご自身で作成したフォルダーなので、安心して開くことができます。

  4. VS Codeが起動したら、チュートリアルで使用するJupyter Notebookを作成します。コマンドパレットを開き(⇧⌘P (Windows, Linux Ctrl+Shift+P))、作成: 新しいJupyter Notebookを選択します。

    Creating a new Jupyter Notebook

    : または、VS Codeのファイルエクスプローラーから、新しいファイルアイコンを使用してhello.ipynbという名前のノートブックファイルを作成することもできます。

  5. ファイル > 名前を付けて保存...を使用して、ファイルをhello.ipynbとして保存します。

  6. ファイルが作成されると、ノートブックエディターに開いているJupyterノートブックが表示されるはずです。ネイティブJupyterノートブックサポートに関する追加情報については、Jupyter Notebooksのトピックを参照してください。

    Viewing a new Jupyter Notebook

  7. 次に、ノートブックの右上にあるカーネルを選択をクリックします。

    Selecting a Jupyter Notebook Kernel

  8. 上記で作成したPython環境を選択して、カーネルを実行します。

    Choose a kernel from created environment

  9. VS Codeの統合ターミナルから環境を管理するには、(⌃` (Windows, Linux Ctrl+`)) で開きます。環境がアクティブになっていない場合は、ターミナルでアクティブ化するのと同じようにアクティブ化できます (conda activate myenv)。

データの準備

このチュートリアルでは、ヴァンダービルト大学生物統計学部が提供するhttps://hbiostat.org/data から入手したOpenML.org で入手可能なタイタニックデータセットを使用します。タイタニックデータは、タイタニック号の乗客の生存に関する情報と、年齢やチケットクラスなどの乗客に関する特徴を提供します。このデータを使用して、このチュートリアルでは、特定の乗客がタイタニック号の沈没から生き残ったかどうかを予測するモデルを構築します。このセクションでは、Jupyter Notebookでデータをロードおよび操作する方法を示します。

  1. まず、hbiostat.org からタイタニックデータをCSVファイル (右上にあるダウンロードリンク) としてダウンロードし、titanic3.csvという名前で、前のセクションで作成したhello_dsフォルダーに保存します。

  2. まだVS Codeでファイルを開いていない場合は、ファイル > フォルダーを開くhello_dsフォルダーとJupyterノートブック(hello.ipynb)を開きます。

  3. Jupyterノートブック内で、まずデータを操作するために使用される2つの一般的なライブラリであるpandasnumpyライブラリをインポートし、Titanicデータをpandas DataFrameにロードします。これを行うには、以下のコードをノートブックの最初のセルにコピーします。VS CodeでJupyterノートブックを操作する方法の詳細については、Jupyterノートブックの操作ドキュメントを参照してください。

    import pandas as pd
    import numpy as np
    data = pd.read_csv('titanic3.csv')
    
  4. 次に、セル実行アイコンまたはShift+Enterショートカットを使用してセルを実行します。

    Running a Jupyter notebook cell

  5. セルが実行を完了したら、変数エクスプローラーとデータビューアーを使用してロードされたデータを表示できます。まず、ノートブックの上部ツールバーにある変数アイコンを選択します。

    Select Variables icon

  6. VS Codeの下部にJUPYTER: 変数ペインが開きます。ここには、現在実行中のカーネルでこれまでに定義された変数のリストが含まれています。

    Variables pane

  7. 以前にロードしたPandas DataFrameのデータを表示するには、data変数の左にあるデータビューアーアイコンを選択します。

    Select Data Viewer icon

  8. データビューアーを使用して、データの行を表示、並べ替え、フィルター処理します。データをレビューした後、異なる変数間の関係を視覚化するために、そのいくつかの側面をグラフ化することが役立ちます。

    Data viewer and variable explorer

    または、Data Wranglerなどの他の拡張機能が提供するデータ表示エクスペリエンスを使用することもできます。Data Wrangler拡張機能は、データに関する洞察を表示し、データプロファイリング、品質チェック、変換などを実行するのに役立つ豊富なユーザーインターフェイスを提供します。ドキュメントでData Wrangler拡張機能について詳しく学ぶ

  9. データをグラフ化する前に、データに問題がないことを確認する必要があります。TitanicのCSVファイルを見ると、データが利用できないセルを特定するために疑問符 ("?") が使用されていることに気づくでしょう。

    PandasはこれをDataFrameに読み込むことができますが、ageのような列の場合、そのデータ型が数値データ型ではなくobjectに設定されてしまい、グラフ化する上で問題となります。

    この問題は、疑問符をpandasが理解できる欠損値に置き換えることで修正できます。ノートブックの次のセルに以下のコードを追加して、agefare列の疑問符をnumpy NaN値に置き換えます。値を置き換えた後、列のデータ型も更新する必要があることに注意してください。

    ヒント: 新しいセルを追加するには、既存のセルの左下にあるセル挿入アイコンを使用できます。または、Escキーを押してコマンドモードに入り、その後にBキーを押すこともできます。

    data.replace('?', np.nan, inplace= True)
    data = data.astype({"age": np.float64, "fare": np.float64})
    

    : 列に使用されているデータ型を確認する必要がある場合は、DataFrame dtypes属性を使用できます。

  10. データが整ったので、seabornmatplotlibを使用して、データセットの特定の列が生存率にどのように関連しているかを視覚化できます。以下のコードをノートブックの次のセルに追加して実行し、生成されたプロットを確認してください。

    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])
    

    Graphing the titanic data

    ヒント: グラフを素早くコピーするには、グラフの右上隅にカーソルを合わせると表示されるクリップボードにコピーボタンをクリックします。また、画像を拡大ボタンをクリックすると、グラフの詳細をより詳しく見ることができます。

    Plot Viewer Buttons

  11. これらのグラフは、生存とデータの入力変数との関係の一部を見るのに役立ちますが、pandasを使用して相関関係を計算することも可能です。そのためには、相関計算に使用されるすべての変数を数値にする必要があり、現在、性別は文字列として保存されています。これらの文字列値を整数に変換するには、以下のコードを追加して実行します。

    data.replace({'male': 1, 'female': 0}, inplace=True)
    
  12. これで、すべての入力変数間の相関を分析し、機械学習モデルへの最適な入力となる特徴を特定できます。値が1に近いほど、値と結果の相関が高くなります。以下のコードを使用して、すべての変数と生存の関係を相関させます。

    data.corr(numeric_only=True).abs()[["survived"]]
    

    Determining the correlation between input variables and survival

  13. 相関結果を見ると、性別のように生存とかなり高い相関がある変数もあれば、親族(sibsp = 兄弟または配偶者、parch = 親または子供)のようにほとんど相関がない変数もあることに気づくでしょう。

    sibspparch は生存率に影響を与える方法で関連していると仮定し、それらを「親族」という新しい列にグループ化して、それらの組み合わせが生存率とより高い相関があるかどうかを確認してみましょう。これを行うには、特定の乗客について、sibspparch の数が 0 より大きいかどうかを確認し、もしそうであれば、彼らは船上に親族がいたと言えます。

    以下のコードを使用して、データセットにrelativesという新しい変数と列を作成し、もう一度相関を確認してください。

    data['relatives'] = data.apply (lambda row: int((row['sibsp'] + row['parch']) > 0), axis=1)
    data.corr(numeric_only=True).abs()[["survived"]]
    

    Determining the correlation between having relatives and survival

  14. 実際に、親族の数ではなく、親族がいたかどうかという観点から見ると、生存との相関が高いことがわかります。この情報があれば、値の低いsibspparchの列、およびNaN値を持つ行をデータセットから削除して、モデルのトレーニングに使用できるデータセットを得ることができます。

    data = data[['sex', 'pclass','age','relatives','fare','survived']].dropna()
    

    : 年齢は直接的な相関が低かったものの、他の入力と組み合わせることで相関がある可能性が妥当と判断されたため保持されました。

モデルの訓練と評価

データセットの準備ができたので、いよいよモデルの作成を開始します。このセクションでは、scikit-learnライブラリ(いくつかの便利なヘルパー関数を提供しているため)を使用して、データセットの前処理を行い、タイタニック号での生存可能性を判断する分類モデルを訓練し、そのモデルをテストデータで評価して精度を決定します。

  1. モデルを訓練するための一般的な最初のステップは、データセットを訓練データと検証データに分割することです。これにより、データの一部をモデルの訓練に、データの一部をモデルのテストに使用できます。すべてのデータを使ってモデルを訓練した場合、モデルがまだ見ていないデータに対してどれだけうまく機能するかを推定する方法がありません。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)
    
  2. 次に、すべての特徴が等しく扱われるように入力を正規化します。たとえば、データセット内では、年齢の値は約0-100の範囲ですが、性別は1または0しかありません。すべての変数を正規化することで、値の範囲がすべて同じになるようにできます。新しいコードセルで次のコードを使用して、入力値をスケーリングします。

    from sklearn.preprocessing import StandardScaler
    sc = StandardScaler()
    X_train = sc.fit_transform(x_train)
    X_test = sc.transform(x_test)
    
  3. データをモデル化するために選択できる機械学習アルゴリズムは数多くあります。scikit-learnライブラリは、それらの多くと、シナリオに適したものを選択するのに役立つチャートもサポートしています。今回は、分類問題で一般的なアルゴリズムであるナイーブベイズアルゴリズムを使用します。以下のコードを含むセルを追加し、アルゴリズムを作成して訓練します。

    from sklearn.naive_bayes import GaussianNB
    model = GaussianNB()
    model.fit(X_train, y_train)
    
  4. 訓練済みのモデルがあれば、訓練から除外しておいたテストデータセットに対して試すことができます。以下のコードを追加して実行し、テストデータの出力を予測し、モデルの精度を計算します。

    from sklearn import metrics
    predict_test = model.predict(X_test)
    print(metrics.accuracy_score(y_test, predict_test))
    

    Running the trained model against test data

    テストデータの結果を見ると、訓練されたアルゴリズムの生存推定成功率は約75%であることがわかります。

(オプション)ニューラルネットワークを使用する

ニューラルネットワークは、人間のニューロンの側面をモデル化する重みと活性化関数を使用して、提供された入力に基づいて結果を決定するモデルです。以前に見た機械学習アルゴリズムとは異なり、ニューラルネットワークはディープラーニングの一種であり、問題設定に対する理想的なアルゴリズムを事前に知る必要はありません。さまざまなシナリオに使用でき、分類はその一つです。このセクションでは、TensorFlowKerasライブラリを使用してニューラルネットワークを構築し、タイタニックデータセットをどのように処理するかを探ります。

  1. 最初のステップは、必要なライブラリをインポートし、モデルを作成することです。この場合、シーケンシャルニューラルネットワークを使用します。これは、複数のレイヤーがシーケンスで互いにフィードインする層状ニューラルネットワークです。

    from keras.models import Sequential
    from keras.layers import Dense
    
    model = Sequential()
    
  2. モデルを定義したら、次のステップはニューラルネットワークのレイヤーを追加することです。ここでは、シンプルにするために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()
    

    Viewing a summary of the sequential neural network

  3. モデルが作成されたら、コンパイルする必要があります。これには、使用するオプティマイザのタイプ、損失の計算方法、最適化すべきメトリックを定義する必要があります。以下のコードを追加して、モデルを構築およびトレーニングします。トレーニング後、精度が約61%になることに気づくでしょう。

    : このステップの実行には、お使いのマシンによって数秒から数分かかる場合があります。

    model.compile(optimizer="adam", loss='binary_crossentropy', metrics=['accuracy'])
    model.fit(X_train, y_train, batch_size=32, epochs=50)
    

    Build and train the neural network

  4. モデルが構築され、訓練されたので、テストデータに対してどのように機能するかを確認できます。

    y_pred = np.rint(model.predict(X_test).flatten())
    print(metrics.accuracy_score(y_test, y_pred))
    

    Evaluate the neural network

    トレーニングと同様に、乗客の生存予測において79%の精度を達成していることがわかります。このシンプルなニューラルネットワークを使用すると、以前に試したナイーブベイズ分類器の75%の精度よりも良い結果が得られました。

次のステップ

Visual Studio Codeでの機械学習の基本に慣れたところで、他にもチェックすべきMicrosoftのリソースとチュートリアルをいくつか紹介します。