IBM Developer Japan Webサイトは2021年3月15日をもって終了となり、日本語コンテンツの一部は、オープンソースとして、提供予定です。 URLはこちら

Python と scikit-learn を使用して分類アルゴリズムについて学ぶ

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

はじめに

このチュートリアルでは、分類に基づく機械学習の問題を解決する方法の基礎を説明し、現在とりわけよく使われている分類アルゴリズムをいくつか抜粋して比較します。

セットアップ

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

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

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

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

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

概要

予測する対象の特徴に値のカテゴリーが含まれている場合、それは「分類」に基づく機械学習の問題ということになります。値のカテゴリーのそれぞれが予測値を分類するクラスとみなされることから、分類という名が付けられています。

このチュートリアルで使用するデータ・セットには、オンライン取引プラットフォームの顧客に関する情報が含まれています。このデータ・セットに基づいて、所定の顧客が契約を解除する可能性を「高」、「中」、「低」に分類します。 モデルを作成する前に必要となるさまざまな前処理のステップについては、前のチュートリアルで説明したので今回は省略します。このチュートリアルでは各種の分類アルゴリズムを詳しく調べた後、各アルゴリズムを同じデータ・セットに適用して比較します。

頻度の分布

データ・ポイント

分類アルゴリズムとそれぞれの比較

前述のとおり、予測する対象の特徴に値のカテゴリーが含まれている場合、それは分類に基づく機械学習の問題ということになります。値のカテゴリーのそれぞれが予測値を分類するクラスとみなされます。分類アルゴリズムには、次のものがあります。

  • 単純ベイズ
  • ロジスティック回帰
  • k 近傍法
  • (カーネル法) SVM
  • 決定木
  • アンサンブル学習

単純ベイズ

単純ベイズではベイズの定理を適用して、所定のデータ・ポイントが特定のクラスに属する確率を計算します。関連する特定の複数の値の確率を基に、イベント A を前提としてイベント B が発生する確率が次の式で計算されます。

P(B|A) = (P(A|B) * P(B) / P(A))

この定理が単純とみなされるわけは、入力される特徴の間に依存関係はないと前提しているためです。この前提が当てはまらない場合や単純な前提であっても、スパム・フィルターなどの特定の使用ケースでは単純ベイズ・アルゴリズムがかなりのパフォーマンスを発揮することが実証されています。

以下のコード・スニペットは、scikit-learn のライブラリーを使用して単純ベイズ・モデルを作成し、予測する例を示しています。

単純ベイズのコード

予測の出力リストを分析すると、このモデルの精度が 69% であることがわかります。実際の値と予測値を比較するグラフも示します。

2 次元で表した単純ベイズ

単純ベイズ CM

ロジスティック回帰

ロジスティック回帰は、線形回帰アルゴリズムを拡張したものです。線形回帰アルゴリズムの詳細については、「Python と scikit-learn を使用して回帰アルゴリズムについて学ぶ」を参照してください。ロジスティック回帰アルゴリズムでは、実際の連続値を予測するのではなく、所定の結果となる確率を予測します。そのために、線形回帰の結果に「ロジスティック機能」を適用します。ロジスティック関数は「シグモイド関数」とも呼ばれています。この関数によって、0 から 1 までの範囲の値が出力されます。出力されたこの値に基づいて、使用ケースに依存する境界線を選択します。確率値がこの境界線の上にあるデータ・ポイントは、1 で表されたクラスに分類されます。確率値がこの境界線の下にあるデータ・ポイントは、0 で表されたクラスに分類されます。

以下のコード・スニペットは、scikit-learn のライブラリーを使用してロジスティック回帰モデルを作成し、予測する例を示しています。

ロジスティック回帰のコード

予測の出力リストを分析すると、このモデルの精度が 92% であることがわかります。実際の値と予測値を比較するグラフも示します。

2 次元で表したロジスティック回帰

ロジスティック回帰 CM

k 近傍法

k 近傍法 (KNN) の背後にある概念は、所定のデータ・ポイントは、距離という点でそのデータ・ポイントと共通するデータ・ポイントの数が最も多いクラスに属するとみなされるというものです。このアルゴリズムでは、予測するデータ・ポイントの最近傍にあるポイント群の k 値が考慮されます。これらの k ポイントは、この時点ですでに特定のクラスに属しています。考慮対象のデータ・ポイントは、これらの k ポイントのうち最も多くのポイントが属するクラスに属するとされます。ポイント間の距離を計算するには、いくつかの手法があります。最もよく使われている計算式は、ユークリッド距離です。

以下のコード・スニペットは、scikit-learn のライブラリーを使用して KNN モデルを作成し、予測する例を示しています。

k 近傍法のコード

予測の出力リストを分析すると、このモデルの精度が 89% であることがわかります。実際の値と予測値を比較するグラフも示します。

2 次元で表した k 近傍法

k 近傍法 CM

サポート・ベクトル・マシン

サポート・ベクトル・マシン (SVM) は、入力されたトレーニング・データに基づいて、クラス間の最適な境界線を出力します。この境界線は、多次元環境では「超平面」と呼ばれます。SVM はこの分離超平面を導き出すために、別のクラスにかなり近いところにある外れ値を考慮します。この超平面を使用してモデルを作成した後は、予測対象の新しいポイントで、その値が超平面の上または下のどちらに位置するかがチェックされます。

ポイントの分布に明確な違いがなければ、2 次元空間内でもクラス間の境界線を確立するのは難しいことです。データ・ポイントを表現する特徴が 1 つだけではない場合も、境界線の確率は複雑なプロセスになります。データを線形分離不可能な多次元空間では、それよりも高次元の空間にデータをマッピングして分離を確立します。この高次元へのマッピングは、「カーネル関数」を適用することで行われます。カーネル関数にはいくつかのタイプがあります。そのうち最もよく使われているのは、多項式とガウス型放射基底関数 (RBF) です。この分離面が導出された後、データは元の次元にマッピングされます。この時点で、予測は、このデータ・ポイントが分離面の内側または外側にあるかを調べるだけのことになります。

以下のコード・スニペットは、scikit-learn のライブラリーを使用して SVM モデルを作成し、予測する例を示しています。この例では、超平面を生成するためにカーネル値を「rbf」に設定しています。

サポート・ベクトル・マシンのコード

予測の出力リストを分析すると、このモデルの精度が 95% であることがわかります。実際の値と予測値を比較するグラフも示します。 2 次元で表したサポート・ベクトル・マシン

SVM CM

決定木

決定木ベースのモデルでは、トレーニング・データを使用して、出力を予測するために使用する一連のルールを導き出します。例えば、ある個人が今日テニスをするかどうかを識別するという問題があるとします。トレーニング・データに含まれる値に応じて、モデルは決定木を形成します。生成されるモデルは、次のルールに従う決定木を構築することが考えられます。

  1. 最初に、見通し列をチェックします。曇りの見通しであれば、出掛けることはありません。
  2. 一方、晴れて湿度の高い日になるという見通しでも、出掛けません。
  3. 晴れて通常の日になる見通しであれば、出掛けます。
  4. 雨が降って風が強くなるという見通しの場合、テニスには行きません。
  5. 雨が降って風は強くないという見通しであれば、出掛けます。

アンサンブル学習

アンサンブル学習とは、複数のアルゴリズムを組み合わせてパフォーマンスに優れたモデルを生成するタイプの機械学習アルゴリズムを指します。2 つ以上のアルゴリズムを繰り返し適用してモデルを生成する場合は、「同種アンサンブル」アルゴリズムと呼ばれます。異なる複数のアルゴリズムを組み合わせる場合は、「異種アンサンブル」アルゴリズムと呼ばれます。このセクションでは、決定木ベースのモデルをランダム・フォレストと勾配ブースティング木に結合してモデルの精度を高める方法を見ていきます。

ランダム・フォレスト

決定木アルゴリズムは、出力の予測に貢献しない列を排除する際に効果を発揮します。場合によっては、木を逆に辿ることで、どのように予測が引き出されたかを確認することもできます。ただし、木が大きく解釈しにくいと、このアルゴリズムが単独で効果を上げることはありません。通常、このようなモデルは「弱モデル」と呼ばれます。モデルのパフォーマンスを改善するには、トレーニング・データのサブセットから生成した複数の決定木の平均を取るという方法があります。この手法が、「ランダム・フォレスト」分離と呼ばれるものです。

以下のコード・スニペットは、scikit-learn のライブラリーを使用してランダム・フォレスト・モデルを作成し、予測する例を示しています。

ランダム・フォレストのコード

予測の出力リストを分析すると、このモデルの精度が 91% であることがわかります。実際の値と予測値を比較するグラフも示します。

2 次元で表したランダム・フォレスト

ランダム・フォレスト CM

勾配ブースティング木

勾配ブースティング木もアンサンブル学習のタイプです。このタイプのアンサンブル学習は、ブースティングという手法をベースとしています。ブースティングでは、あるモデルをトレーニングし、その出力に基づいて次のモデルをトレーニングするといった具合にモデルのトレーニングを繰り返します。

勾配ブースティング木の中で、前のモデルによるエラー (「誤差」とも呼ばれます) を計算します。この誤差をトレーニング・データとしてトレーニングする別のモデルを定義します。これによって生成されるモデルは、前のモデルと誤差に対してトレーニングされたモデルを合わせたものになります。このプロセスが、誤差が収束されるまで繰り返されます。勾配ブースティング木はランダム・フォレスト・モデルよりもパフォーマンスに優れていますが、順次構築されていくため、計算コストがかかります。この問題を克服するために使用されているのは、XGBoost という具体的な実装です。XGBoost についての詳しい説明はこのチュートリアルの対象外ですが、チュートリアル「Train XGboost models within Watson Machine Learning Accelerator」で詳細を確認できます。

まとめ

このチュートリアルでは、複数の分類アルゴリズムを同じデータ・セットに適用して予測を行いました。このチュートリアルで取り上げたアルゴリズムは以下のとおりです。

  • 単純ベイズ
  • ロジスティック回帰
  • k 近傍法
  • SVM (カーネル)
  • 決定木
  • アンサンブル学習

アルゴリズムによって精度のスコアは異なりますが、あるアルゴリズムが他のアルゴリズムに比べて常に勝っているというわけではありません。他よりも常にパフォーマンスが優れている分類アルゴリズムもありますが、通常、モデルのパフォーマンスは使用ケースによって影響されます。精度を高めるために、各アルゴリズム内でさまざまな方法で調整できるハイパーパラメーターもあります。以下の棒グラフでは、このチュートリアルで取り上げたすべての分類アルゴリズムを実際の値に対して比較しています。

すべてのアルゴリズムの比較

概して、中央値の予測は精度が低くなっています。その理由の 1 つとして、中央値のエントリー数は最大値と最小値よりも大幅に少ないことが考えられます。中央値の数を増やすか、複数のデータ模造手法を適用して、さらにテストすることができます。

このチュートリアルは開発者向けのラーニング・パス「機械学習を始める」を構成するコンテンツです。ラーニング・パスの次のチュートリアル「Python と scikit-learn を使用してクラスタリング・アルゴリズムについて学ぶ」では、教師なし学習を使用してデータのグループと例外を検出します。