Python と scikit-learn を使用して初の機械学習モデルを作成してテストする

このチュートリアルは開発者向けのラーニング・パス「機械学習を始める」を構成するコンテンツです。

はじめに

このチュートリアルに沿って、分類モデルを作成して実行する一連の流れを最初から最後まで実際に経験してください。チュートリアルでは次のステップについて説明します。

  • データを探索する
  • データを前処理する
  • データをトレーニング用とテスト用に分割する
  • 分類モデルを作成する
  • パイプラインを使用してすべてのステップを組み立てる
  • モデルをトレーニングする
  • モデルで予測を行う
  • モデルのパフォーマンスを評価し、視覚化する

セットアップ

このチュートリアルには、Python で作成された Jupyter ノートブックが付属しています。このノートブックは、無料のトライアル・アカウントによって IBM Cloud 上で Watson Studio を使用して実行できます。

  1. 登録またはログインします。

  2. 空のプロジェクトを作成します。

    • Create a project (プロジェクトを作成)」または「New project (新規プロジェクト)」をクリックします。
    • Create an empty project (空のプロジェクトを作成)」を選択します。
    • プロジェクトに名前を付けます。
    • Object Storage サービスの既存のインスタンスを選択するか、新しいインスタンスを作成します。
    • Create (作成)」をクリックします。
  3. ノートブックを追加します。

    • +Add to project (プロジェクトに追加)」をクリックします。
    • Notebook (ノートブック)」をクリックします。
    • From URL (URL から)」をクリックします。
    • Name (名前)」にノートブックの名前を入力します。
    • Select runtim (ランタイムを選択)」で、「Default Python 3.6 Free (デフォルト Python 3.6 無料版)」を選択します。
    • Notebook URL (ノートブックの URL)」として「https://raw.githubusercontent.com/IBM/ml-learning-path-assets/master/notebooks/classification_start_to_end_with_scikit_learn.ipynb」と入力します。
    • Create Notebook (ノートブックを作成)」をクリックします。
  4. ノートブックを実行します。

    開いた状態のノートブックで、「Run (実行)」をクリックしてセルを 1 つずつ実行します。チュートリアルでは以降、ノートブックの順序に従って説明を進めます。

ノートブックのセットアップが完了したので、オンライン取引プラットフォームの顧客に関する情報が含まれたデータセットを使用して、顧客が解約するかどうかを予測する分類モデルの開発に取り掛かりましょう。

データを探索する

実際の機械学習を始める前に行っておかなければならないステップがいくつかあります。まず、データ・サイエンティストは予測処理を実行する際に使用するデータの品質を分析する必要があります。データの表現にバイアスが反映されていると、公平性に欠けるモデルになってしまいます。データを分析するには複数の方法があります。このチュートリアルではデータ探索の概要を把握できるだけの最小限の探索を行った後、このトピックの中核的なテーマに移ります。

データセットについて

このチュートリアルで使用するデータセットには、オンライン取引プラットフォームの顧客に関する情報が含まれています。このデータセットに基づいて、所定の顧客が契約を解約する可能性を「高」、「中」、「低」に分類します。これにより、分類モデルを作成する方法を最初から最後まで学ぶのに適した例になっています。予測が分類されるクラスには、高、中、低の 3 つがあります。データセットをもう少し詳しく見ていきましょう。

データは .csv ファイルの形式で使用できるようになっています。このファイルを、pandas ライブラリーを使用してインポートします。インポートしたデータから統計情報を取得して視覚化するには、numpy と matplotlib を使用します。

データのロード

まず、数行のコードを実行して、各列のデータ型とエントリー数を把握します。

データ型

性別の列のエントリー数は、他の列と一致していません (下の図を参照)。この不一致については、データの前処理ステップで対処します。

データのカウント

matplotlib を使用して基本的な棒グラフを描画し、このグラフから、データが出力クラス間でどのように分布されているかを把握します。分布に偏りがあり、代表的なデータではないと判断したら、この時点でトレーニングとテストに使用する追加のデータを収集します。

チャーンのグラフ

データの視覚化

データを前処理する

機械学習モデルの作成プロセスでは、データの前処理が重要なステップとなります。それは、周到に用意された十分なデータに対してモデルをトレーニングしなければ、パフォーマンスに優れたモデルにならないためです。したがって、モデルの作成プロセスでは、このステップにかなりの時間を費すことになります。

このチュートリアルでは、機械学習でよく行われている、さまざまなデータ前処理のステップのいくつかに目を向けます。scikit-learn に用意されているすべての前処理手法を網羅したリストについては、scikit-learn data preprocessing のページを参照してください。

まず始めに、出力を予測するという点で何の価値もない列を識別します。こうした列には簡単に見つけられるものもありますが、通常は価値のない列の大半を識別するために、主題専門家が前処理に関与します。価値のない列を削除すると、モデルの次元を減らすことができます。

列の破棄

前処理に適用する方法は、列ごとにカスタマイズする必要があります。Sklearn が提供している ColumnTransformer というライブラリーを使用すると、パイプラインによって一連の前処理方法を選択的に列に適用できます。

データセットを扱う際に共通して問題となるのは、欠損値です。scikit-learn には、欠損値のコンテキスト内で該当する別の値で欠損値を置き換えるメソッドが用意されています。このチュートリアルでは Sklearn が提供している SimpleImputer クラスを使用して、値が欠落している列を、最も頻繁に出現する値で補完しました。

機械学習アルゴリズムは文字列よりも数値を扱うときのほうがパフォーマンスを発揮します。そのため、カテゴリー・データが含まれる列を識別して、数値型の列に変換する必要もあります。そのために、Sklearn が提供している OneHotEncoder クラスを使用しています。OneHotEncoder の概念は、カテゴリーごとに、そのカテゴリーを表す 2 項変数を作成するというものです。この方法により、数値をカテゴリーに割り当てるだけだと生じる可能性の順序関係を排除します。基本的には、複数のクラス値が含まれる単一の列を、クラスの 2 進値が含まれる複数の列に変換します。

カテゴリー列

データセットに含まれる数値列を識別し、そのそれぞれに StandardScaler を適用します。こうすると、各値が列の平均値で減算されてから標準偏差値で除算されます。

数値列

前述のとおり、列によって必要となる前処理は異なります。このことから、ColumnTransformer を使用して、所定の前処理を適用する必要がある列のグループをキューに入れます。理想的には、この列変換器はパイプライン内でモデルがトレーニングされる直前に実行されます。けれども、データがどのようになるかを把握するために、このチュートリアルではデータを変換して一時変数内に格納しました。

列変換器

機械学習アルゴリズムは単純なテキストを扱うことができません。そのためデータをテキストから数値に変換する必要があります。それには、各文字列 (クラス) に数値のラベルを割り当てます。例えば、顧客チャーンのデータセットに含まれる CHURNRISK 出力ラベルを高、中、低に分類し、それぞれ 0、1、2 の値を割り当てます。この作業には、Sklearn が提供している LabelEncoder クラスを使用しています。

LabelTransformer

以上が、データセットに適用される、よく使われている前処理ステップの抜粋です。データ前処理の詳細については、 記事「Data preprocessing in detail」を参照してください。

データをトレーニング用とテスト用に分割する

データの前処理が完了したら、次のステップとして、データをモデルの作成とトレーニングに使用する部分と、作成されたモデルのテストと評価に使用する部分に分割します。データをどれくらいの割合でトレーニング用とテスト用に分割すべきかについては理論が分かれていますが、このチュートリアルではデータの 98% をトレーニングに使用し、2% をテストに使用しています。

テスト用とトレーニング用の分割

分類モデルを作成する

よく使われていて、高い精度を達成することが実証されている分類モデルはいくつかあります。このチュートリアルでは、Sklearn が提供しているライブラリーを初期化して、ランダム・フォレスト分類子を適用しました。このラーニング・パスに含まれるチュートリアル「Python と scikit-learn を使用して分類アルゴリズムを学ぶ」で、各種の分類モデルについて詳しく説明し、モデルを比較しています。ここではランダム・フォレストの仕組みについての説明は省略して、初の機械学習モデルの作成を続けます。

モデルの初期化

パイプラインを使用してすべてのステップを組み立てる

このラーニング・パスではパイプラインを使用します。機械学習フローに沿ってデータ処理を設計するには、パイプラインが便利な方法になります。パイプラインを使用するという考え方については、チュートリアル「Python と scikit-learn を使用して分類アルゴリズムについて学ぶ」で詳しく説明しています。次のサンプル・コードは、sklearn を使用してパイプラインを使用する方法を示しています。

パイプラインの作成

モデルをトレーニングする

モデルを作成する際の最後のステップは、モデリングと呼ばれます。このステップでは、基本的に、機械学習アルゴリズムのトレーニングを行います。データの分割ステップで分割したデータの 98% を使用して、前のステップで初期化されたモデルをトレーニングします。

モデルのトレーニング

モデルで予測を行う

モデルのトレーニングが完了した後は、モデルを分析に使用できます。このステップでは、モデルのテスト用に取っておいた 2% のデータを使用して予測処理を実行します。次の図に示されているように、出力なしで目隠ししたデータを渡します。予測された出力を収集し、実際の結果に照らし合わせて評価します。これが、次のステップで行うことです。

モデルのテスト

モデルのパフォーマンスを評価し、視覚化する

予測のステップで取得した予測結果を、期待される実際の結果に比較します。さまざまな評価指標を生成して、モデルのパフォーマンスを計算します。

2D 比較 CM の比較

まとめ

評価で満足できるスコアを取得するまでは、ハイパーパラメーターと呼ばれるものを調整しながら、データの前処理から評価までのステップを繰り返します。

モデルの比較

このチュートリアルでは、基本的な機械学習の分類モデルを開発しました。このチュートリアルは開発者向けのラーニング・パス「機械学習を始める」を構成するコンテンツです。ラーニング・パスの次のチュートリアル「Python と scikit-learn を使用して回帰アルゴリズムを学ぶ」では、各アルゴリズムが予測結果に至るまでの仕組みを詳しく探ります。