光のカナダ留学blog

30歳で会社を退職。現在カナダ留学中です。

【レビュー】Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

スポンサーリンク

前回に引き続き、機械学習本のレビューになります。今回紹介するのは、オライリー・ジャパンの「Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎」という本です。

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

 

始めに読んでみた感想として、一度で全てを理解するのは難しいのは確かですが、その情報量から今後機械学習を進める上での参考書としてとても優れている本だと感じました。

本書で用いられているscikit-learnとは、機械学習分野において広く使われているオープンソースライブラリです。機械学習にあたってはデータの準備が一つの大きなハードルとなりますが、scikit-learnは様々なデータセットを提供してくれるので初学者でも簡単に機械学習に取り組むことができます。また様々な機械学習アルゴリズムが網羅的に含まれており、大学や産業界でも広く使われているライブラリになります。

それでは各章の内容について簡単に触れていきます。

1章 はじめに

機械学習の簡単な背景に始まり、本書で扱うscikit-learnのインストール方法やその他必要なライブラリの簡単な説明があります。

本書で扱うpython用ライブラリおよびツールは、sickit-learnのほかに

  • Jupyter Notebook(ブラウザ上でコードを実行するためのツール)
  • Numpy(数値計算や数学関数用ライブラリ)
  • SciPy(科学技術計算用ライブラリ)
  • matplotlib(グラフ描画ライブラリ)
  • pandas(データ解析ライブラリ)

等があり、いずれも機械学習において広く使われるライブラリです。

章の後半ではアイリスの花のデータ・セットを用いた、クラス分類を行いながらsicit-learnや各ライブラリの使い方、モデル構築(ここではk-最近接法)や評価の流れ等が実際のコードとともに学ぶことができます。

 

2章 教師あり学習

2章は教師あり学習について書かれています。教師あり学習では訓練セットで学習して(モデルを構築)、それを実際のテストデータのに適用して予測を行います。

本書では様々な教師あり機械学習アルゴリズムを実際のデータセットを用いて網羅的に学習することが出来ます。本書で扱われているアルゴリズムには以下のものがあります。

  • k-最近接法
  • 線形モデル(線形回帰、リッジ回帰、Lasso、ロジスティック回帰、線形サポートベクタマシン)
  • ナイーブベイズクラス分類機
  • 決定木
  • 決定木のアンサンブル法(ランダムフォレスト、勾配ブースティング回帰木)
  • カーネル法を用いたサポートベクタマシン(SVM)
  • ニューラルネットワーク(ディープラーニング)

上記のように様々な機械学習アルゴリズムを実際のコードやグラフ図とともに学べるので、とても理解がしやすいです。また現在流行りにニューラルネットワーク(ディープラーニング)についても取り上げられています。

 

3章 教師なし学習と前処理

教師なし学習は教師あり学習とは異なり、正解データが与えられない機械学習アルゴリズムです。したがって、アルゴリズムには入力データだけが与えられ、データから知識を抽出します。例としてはデータの次元削減、データを似たような要素から構成されるグループに分けるクラスタリングや、文書データの集合からのトピック抽出などがあります。

本書ではまず始めに教師なし学習を行なうためにデータの適切な前処理方法やスケール変換について学べます。

章の中盤では、Cancerデータセットや実際の顔データ、手書き数字データセット等を用いて、主成分分析(PCA)非負値行列因子分解(NMF)t-SENアルゴリズムなどを学びます。また章の後半は主にクラスタリングの話で、k-meansや凝集型クラスタリング、DBSCANが取り上げられています。

このように、2章、3章を読むことで機械学習の主要な学習アルゴリズムを抑えることができます。

 

4章 データの表現と特徴量エンジニアリング

4章はこれまでの学んできた機械学習モデルの性能に影響を及ぼすデータ表現や特徴量について学びます。これまでの話は全て連続値特徴量(浮動小数点数の配列)によるデータを仮定していましたが、実際にはそういったデータが得られない場合もあります。離散値特徴量(カテゴリ特徴量)は一般的に得られるデータタイプで、例えば製品のブランドや色、販売部門などがあってこれらの値は連続的に変化しません。

機械学習では正しく学習を行なうためにこうしたデータを適切な形に表現する必要があり、これを特徴量エンジニアリングと呼びます。

本書ではカテゴリ変数を表現する方法の一つとして、ワンホットエンコーディング(ダミー変数)が挙げられています。これはカテゴリ変数を0と1の値をもつ新しい特徴量で置き換える方法です。例えば果物という特徴量がリンゴ、みかん、バナナの3つの値をが持つとすると、

名前 リンゴ みかん バナナ
リンゴ 1 0 0
みかん 0 1 0
バナナ 0 0 1

このように1つの特徴量(果物)を3つの特徴量(リンゴ、みかん、バナナ)の0-1表現にエンコードします。こうすることでカテゴリ変数を連続量として扱うことができるようになります。

他にもビニング離散化といった特徴量を分割したり、交互作用特徴量多項式特徴量といった新しい特徴量を加える方法についても説明されています。

章の最後には、汎化性能を向上させるために特徴量の数を減らす手法として、単変量統計、モデルベース選択、反復選択の3つが説明されています。

 

5章 モデルの評価と改良

本章では教師あり学習でのモデル評価とパラメータの選択について詳しく述べられています。汎化性能を向上させる手法の1つとして、データを分割して訓練及びテストを行なう交差検証があります。

例えばk分割交差検証では、データを1-5に分割して、最初のモデルは1をテストセット、2-5を訓練セットとして用います。次のモデルでは2をテストセット、1,3-5を訓練セットとして用います。このように繰り返すことで、5つの精度が手に入ることになります。この方法だと全てのデータが一度ずつテストセットとして用いられることになりデータ分割の偏りをキャンセルできるので、より正確な汎化性能を図れることになります。

本書ではより信頼できる層化k分割検証シャッフル分割交差検証、密接に関係するグループがある場合に用いられるグループ付き交差検証についても説明がされています。

パラメータのチューニング方法としてはパラメータの全ての組み合わせを試してみるグリッドサーチが説明されています。先に述べた交差検証と組み合わせることで、より汎化性能を良くすることができます。

章の最後はモデルの選択やパラメータのチューニングの際の評価基準とスコアリングについて書かれています。クラス分類性能の精度による評価、回帰性能のR2による評価以外にも、学習モデルの性能を図る手法は多く存在します。実際には、そのアプリケーションの目的、すなわちビジネス評価基準を考えることが重要であると述べられています。

例えば2クラス分類の評価結果を表現する混同行列がその1つです。

TN FP
FN TP

それぞれ真陰性(True Negative)、偽陽性(False Positive)、偽陰性(False Negative)、真陽性(Ture Positive)を表します。

  • 真陰性(TN):陰性クラスを陰性と予測
  • 偽陽性(FP):陰性クラスを陽性と予測
  • 偽陽性(FN):陽性クラスを陰性と予測
  • 真陽性(TP):陽性クラスを陽性と予測

そしてこれらの評価結果をまとめる式としては下記があります。

精度 = (TP + TN) / (TP + TN + FP + FN)
適合率 = TP / (TP + FP)
再現率 = TP / (TP + FN)
f-値 = 2 × (適合率 × 再現率) / (適合率 + 再現率)

例えば、適合率は製薬会社が臨床結果の有効性を正確に予測したい場合(FPが小さくなるモデル)、再現率は癌診断などで陽性を陽性だと判断したい場合(FNが小さくなるモデル)に用いられます。

本書では上記の2クラス分類のほかにも、多クラス分類も取り上げられています。

 

6章 アルゴリズムチェーンとパイプライン

機械学習ワークフローの複数の処理ステップを一つなぎにまとめるPipelineクラスの説明になります。ただ、私自身しっかり理解できたわけではないので、今回は割愛させてください。

 

7章 テキストデータの処理

テキスト処理もしくは自然言語処理の基本について、映画レビューのクラス分類アプリケーションを例に説明がされています。テキストデータはここまで述べてきた連続値特徴量やカテゴリ特徴量とは異なる、独自の前処理が必要です。

本書ではBag of Words(BoW)ストップワードtf-idf(term frequency-inverse document frequency)によるデータの前処理及びスケール変換について説明されています。

  • Bag of Words:現れる単語(トークン)の数を数える
  • ストップワード:頻度の高い単語を捨てる(he、also、the等)
  • tf-idf:特定の文書にだけ頻繁に現れる単語に大きな重みを与える(多数の文書に現れる単語にはあまり重みを与えない)

他にもBoWで2〜3の連続した単語をトークンとした手法(n-グラム)や、語幹処理、見出し語化などがあります。

最後にテキストデータによく用いられる技術の1つとして、トピックモデリングの解説があります。映画レビューのデータセットにLDA(Latent Dirichlet Allocation)という成分分析手法を適用して解析を行っています。

なお本書にはword2vecライブラリやリカレントニューラルネットワーク(RNN)による自然言語処理は載っていません。そういった手法を学びたい方は別の書籍を読んで見ると良いでしょう。

 

まとめ

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎のレビューをしてみました。機械学習のアルゴリズムやモデルの評価手法、また特徴量エンジニアリング等についても網羅的に学ぶことができます。サブタイトルにもある通り本書は基礎的な位置付けとなっていますが、今後機械学習をより深く勉強していく上では欠かせない内容となるかと思います。私自身全てを理解できたわけではないので、今後も本書を参考に勉強していきたいと思います。

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎