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

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

前提条件

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

  • Visual Studio Code

  • Visual Studio Marketplace から VS Code 用 Python 拡張機能VS Code 用 Jupyter 拡張機能 をインストールしてください。拡張機能のインストールの詳細については、Extension Marketplace を参照してください。どちらの拡張機能も Microsoft が提供しています。

  • 最新の Python を含む Miniconda

    : すでに 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 拡張機能は、データサイエンスのシナリオに最適なエディタを提供します。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)) を開き、[Create: New Jupyter Notebook] (作成: 新しい Jupyter Notebook) を選択します。

    Creating a new Jupyter Notebook

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

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

  6. ファイルが作成されると、Notebook エディターで Jupyter Notebook が開かれます。ネイティブな Jupyter Notebook サポートの詳細については、Jupyter Notebooks のトピックをお読みください。

    Viewing a new Jupyter Notebook

  7. 次に、Notebook の右上にある [カーネルの選択] を選択します。

    Selecting a Jupyter Notebook Kernel

  8. 先ほど作成した Python 環境を選択してカーネルを実行します。

    Choose a kernel from created environment

  9. VS Code の統合ターミナルから環境を管理するには、(⌃` (Windows, Linux Ctrl+`)) を押してターミナルを開きます。環境が有効化されていない場合は、ターミナルで実行するのと同様に (conda activate myenv) を実行して有効化してください。

データの準備

このチュートリアルでは、OpenML.org で入手可能な タイタニック号のデータセット を使用します。これは、ヴァンダービルト大学生物統計学部門の https://hbiostat.org/data から取得されたものです。このデータには、タイタニック号の乗客の生存状況や、年齢やチケットクラスといった乗客の特性に関する情報が含まれています。このデータを使用して、タイタニック号の沈没で特定の乗客が生存したかどうかを予測するモデルを構築します。このセクションでは、Jupyter Notebook でデータを読み込み、操作する方法を説明します。

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

  2. まだ VS Code でファイルを開いていない場合は、[ファイル] > [フォルダーを開く] から hello_ds フォルダーと Jupyter Notebook (hello.ipynb) を開きます。

  3. Jupyter Notebook 内で、まずはデータの操作によく使われる pandasnumpy ライブラリをインポートし、タイタニック号のデータを pandas の DataFrame に読み込みます。これを行うには、以下のコードを Notebook の最初のセルにコピーしてください。VS Code での Jupyter Notebook の使用に関する詳細なガイダンスは、Working with Jupyter Notebooks のドキュメントを参照してください。

    import pandas as pd
    import numpy as np
    data = pd.read_csv('titanic3.csv')
    
  4. [セルの実行] アイコンをクリックするか、Shift+Enter ショートカットを使用してセルを実行します。

    Running a Jupyter notebook cell

  5. セルの実行が終わったら、[変数エクスプローラー] と [データビューアー] を使用して読み込んだデータを確認できます。まず、Notebook の上部ツールバーにある [変数] アイコンを選択します。

    Select Variables icon

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

    Variables pane

  7. 先ほど読み込んだ Pandas DataFrame を確認するには、data 変数の左側にある [データビューアー] アイコンを選択します。

    Select Data Viewer icon

  8. データビューアーを使用して、データの行を表示、並べ替え、フィルター処理します。データを確認したら、グラフを描画して変数間の関係を可視化すると便利です。

    Data viewer and variable explorer

    あるいは、Data Wrangler のような他の拡張機能が提供するデータ表示機能を使用することもできます。Data Wrangler 拡張機能は、データのインサイトを示すための豊富なユーザーインターフェイスを提供し、データのプロファイリング、品質チェック、変換などを支援します。詳細については、Data Wrangler 拡張機能のドキュメントを参照してください。

  9. データをグラフ化する前に、データに問題がないか確認する必要があります。タイタニック号の 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 属性を使用できます。

  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 は生存率に与える影響において関連していると仮定し、これらを「relatives」(親族) という新しい列にグループ化して、組み合わせることで生存率との相関が高まるかどうかを確認してみましょう。これを行うには、特定の乗客について 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. 親族の人数ではなく、親族がいたかどうかという観点で見ると、生存率との相関が高まっていることがわかります。この情報を得たので、相関の低い sibsp 列と parch 列、および NaN 値を含む行をデータセットから削除し、モデルの学習に使用できるデータセットを作成します。

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

    : age は直接的な相関は低かったのですが、他の入力と組み合わせることで相関を持つ可能性があると考えられるため、保持しました。

モデルの学習と評価

データセットの準備ができたので、モデルの作成を開始します。このセクションでは、scikit-learn ライブラリを使用して、データセットの前処理、タイタニック号の生存率を判定する分類モデルの学習、そしてそのモデルをテストデータに使用して精度を測定します。

  1. モデル学習の最初のステップとして、データセットを学習データと検証データに分割するのが一般的です。これにより、データの一部をモデルの学習に使用し、残りの一部をモデルのテストに使用できます。もしすべてのデータを学習に使用してしまうと、モデルがまだ見ていないデータに対してどれだけうまく機能するかを評価する方法がなくなってしまいます。scikit-learn ライブラリの利点は、データセットを学習データとテストデータに分割するための専用メソッドが提供されていることです。

    Notebook に以下のコードを追加し、セルを実行してデータを分割します。

    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% であることがわかります。

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

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

  1. 最初のステップは、必要なライブラリをインポートし、モデルを作成することです。ここでは、複数のレイヤーが順番に接続されている Sequential ニューラルネットワークを使用します。

    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'))
    
    • 最初のレイヤーの次元は 5 に設定されます。これは、性別、pclass、年齢、親族、運賃という 5 つの入力があるためです。
    • 最後のレイヤーは、乗客が生存したかどうかを示す 1 次元の出力を必要とするため、1 を出力しなければなりません。
    • 中間のレイヤーはシンプルにするために 5 にしましたが、この値は変更可能です。

    Rectified Linear Unit (relu) 活性化関数は最初の 2 つのレイヤーの汎用的な活性化関数として適しており、最後のレイヤーにはシグモイド活性化関数が必要です。これは、出力 (生存するかどうか) を 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 のリソースやチュートリアルもぜひ確認してみてください。

© . This site is unofficial and not affiliated with Microsoft.