『Rによる機械学習 [第3版]』読書メモ

はじめに

セミリタイア・ミジンコのIPUSIRONです😀

IPUSIRONのプロフィールを見る

『Rによる機械学習 [第3版]』について

詳細は公式ページを参照ください。

挑戦した動機

統計ツールを1つでも使えたらやれることの幅が広がるかなと思い、挑戦することにしました。特にハッキングや暗号関係に活用できないかと画策しています。

第1章:機械学習入門

内容

  • 機械学習アルゴリズムの種類とその概要
  • Rによる機械学習

実験

Rの環境を構築する【P.27】

本ではRStudioを紹介しているが、私はRGui(64bit版)を用いることにしました。

第2章:データを管理し、理解する

内容

  • Rデータを管理するための基礎
  • Rのデータ構造のベースはベクトル
    • ベクトルを拡張したり組み合わせたりすることで、リストやデータフレームのような複雑なデータ型が得られる。
  • 数値の特徴量
    • 平均値と中央値
    • 散布度の計測…四分位数と五数要約
    • 数値の特徴量を可視化…箱ひげ図とヒストグラム
    • 一様分布と正規分布
    • 分散と標準偏差
  • 実験
    • 中古車の価格が含まれた現実のデータセットを分析する

実験

サンプルファイルのダウンロード【P.31】

ここからRによる実験が始まります。著者のGitHubからダウンロードしてきます。

外部のデータファイルのロード【P.45】

データファイルをロードする際に、書籍では次のようなコマンドを実行しています。

usedcars <- read.csv("usedcars.csv", stringsAsFactors = FALSE)

Rの環境から見て、インポートするファイルの場所が見えていなければエラーになるはずです。

そこで次のようにファイルをフルパスで指定します(これは私の環境のパスなので、各自読み替えてください)。

usedcars <- read.csv("C:\\Users\\owner\\OneDrive\\Desktop\\MLwR-master\\Machine Learning with R (3rd Ed.)\\Chapter02\\usedcars.csv", stringsAsFactors = FALSE)

このコマンドの実行後にエラーが出なければ成功です。

第3章:怠惰学習 ―最近傍法を使った分類

内容

  • k最近傍法を使った分類…何かを学習せず、単に訓練データを丸暗記する。そして、距離関数を使って、ラベル付けされていないテストデータを訓練データセットの最も類似するデータ(最近傍)と照合する。それらの最近傍のラベルをテストデータに割り当てる。
  • k最近傍法で使うデータの前処理…Zスコア標準化、エミーコーディング(one-hotエンコーディング)
  • 実験
    • k最近傍法を使って乳がんを診断する。

実験

第4章:確率論的学習 ―ナイーブベイズを使った分類

内容

  • ナイーブベイズを使った分類…新しいインスタンスが様々なクラスに所属する尤度を推定するために、確率の表を作成する。
  • ナイーブベイズ分類期はテキスト分類によく使われる。
  • 実験
    • スパムメッセージの分類タスクにナイーブベイズを利用する。

トラブル対策

因子に変換した結果がおかしい【P.102】

文字ベクトルであるtypeを因子に変換した結果が、書籍と一致しませんでした。調査の結果、ロードしたデータの一部が文字化けをしていました(Excelで開くと明確)。これを削ってロードし直したら、書籍と同じ結果が得られました。

実験

第5章:分割統治 ―決定木と分類ルールに基づく分類

内容

  • 貪欲なアルゴリズムン基づく分類法を2つ取り上げている。
    1. 決定木…分割統治戦略に基づいてフローチャートのような構造を作成する。
    2. 分類ルール学習器…分離統治閃絡に基づいてif-else文のようなルールを学習する。
  • C5.0…決定木アルゴリズムの1つ。細かい調整が可能。
  • 実験
    • C5.0アルゴリズムを使って融資が焦げ付くかどうかを予測する決定木を作成した。
    • IRとRIPPERの2つの分類ルール学習器を使って、毒キノコを識別するルールを作成した。

トラブル対策

C5.0関数の実行時に"C5.0 models require a factor outcome"というエラーが発生する 【P.137】

エラーメッセージの内容の通りに、因子を渡したら通りました。P.137、P.141、P.144にてこの対応が必要。

RWekaパッケージをロードしようとすると"No CurrentVersion entry in Software/JavaSoft registry!"エラーが発生する 【P.159】

library(RWeka)

rJavaパッケージをインストールしてみましたが、解決しませんでした。

上記のWebページを参考にすると、64bitのJavaが必要と書いてあります。すでにJavaをインストールされていると思っていましたが、一応下のサイトから最新のJavaを入手することにします。

私の環境はWindowsなので、"Windows Online"というリンクからJavaのオンライン用インストーラーをダウンロードしてから、実行しました。すでにインストール済みの古いJavaがあれば、それをアンインストールするように促されるかもしれません。

Javaのインストール後に、RWekaをロードしても同じエラーで解決しませんでした(RGuiは再起動しても同様)。

Javaのインストール先を調べるとどうやら"C:\Program Files (x86)\Java\jre1.8.0_281″でした。「Program Files (x86)」フォルダー内ということは32bit版がインストールされています。

そこで、Javaのサイトに戻り、"Windows Offline (64-bit)"リンクから64bit版のJavaのインストーラーをダウンロードしました(インストーラーにビット数を自動認識させない)。ファイル名は"jre-8u281-windows-x64.exe"であり、「x64」が含まれているので確実に64bit版です。

インストーラーを実行すると、"C:\Program Files\Java\jre1.8.0_281″が生成されてここにインストールされました。フォルダー的にも問題なさそうです。

RGuiを再起動してから、次のコマンドを実行したらエラーが返ってこなかったので、ロードの成功です。

library(RWeka)

その後書籍の通りにJRip関数を使っても問題ありませんでした。

> mushroom_JRip <- JRip(type ~ ., data = mushrooms)
> mushroom_JRip
JRIP rules:
===========

(odor = foul) => type=poisonous (2160.0/0.0)
(gill_size = narrow) and (gill_color = buff) => type=poisonous (1152.0/0.0)
(gill_size = narrow) and (odor = pungent) => type=poisonous (256.0/0.0)
(odor = creosote) => type=poisonous (192.0/0.0)
(spore_print_color = green) => type=poisonous (72.0/0.0)
(stalk_surface_below_ring = scaly) and (stalk_surface_above_ring = silky) => type=poisonous (68.0/0.0)
(habitat = leaves) and (cap_color = white) => type=poisonous (8.0/0.0)
(stalk_color_above_ring = yellow) => type=poisonous (8.0/0.0)
 => type=edible (4208.0/0.0)

Number of Rules : 9

> summary(mushroom_JRip)

=== Summary ===

Correctly Classified Instances        8124              100      %
Incorrectly Classified Instances         0                0      %
Kappa statistic                          1     
Mean absolute error                      0     
Root mean squared error                  0     
Relative absolute error                  0      %
Root relative squared error              0      %
Total Number of Instances             8124     

=== Confusion Matrix ===

    a    b   <-- classified as
 4208    0 |    a = edible
    0 3916 |    b = poisonous
> 

第6章:数値データを予測する ―回帰法

内容

  • 数値データをモデル化する2つの手法。
    1. 線形回帰…直線をデータに適合させる。
    2. 決定木…数値を予測する。回帰木とモデル木がある。
      • 回帰木…葉ノードに到達したインスタンスの平均値を使って数値を予測する。
      • モデル木…線形回帰と決定木の長所を兼ね備えたハイブリッド型。各葉ノードで回帰モデルを構築する。
  • 入力と出力の関係を明確に理解できるような機械学習の手法を取り上げている。
  • 実験
    • 回帰モデルを使ってスペースシャトルチャレンジャー号の悲劇の原因を調査する。
    • 線形回帰モデルを使って様々な人口グループの医療費を推定する。
    • 回帰木とモデル木を使ってワインの品質という主観的な問題を、計測可能な成分からモデル化した。
      • その過程で、回帰木が特徴量と数値の従属変数の関係を説明する単純な手段になることがわかった。
      • そして、より複雑な分だけモデル木の方が回帰木より性能がよいこともわかった。

実験例

第7章:ブラックボックス手法 ―ニューラルネットワークとサポートベクトルマシン

内容

  • ANN
  • SVM
  • 隠れノードが1つだけのニューラルネットワークは、線形回帰モデル(第6章)の一種として考えられる。
    • 各入力ノードと隠れノードの間の重みは回帰係数に似ており、バイアス項の重みは切片に似ている。
  • 実験
    • 人工ニューラルネットワークを使ってコンクリートの強度をモデル化する。
    • SVMを使って文字を認識する。

実験例

第8章:パターン検出 ―相関ルールを使ったバスケット分析

内容

  • 相関ルール
  • 教師なし学習プロセスである相関ルール学習器…どのようなパターンを探しているのかに関する知識をあらかじめ与えなくても、大規模なDBから知識を抽出できる。
    • ただし、大量の情報を小さく管理しやすい結果セットに絞り込むには、それなりの作業量が必要になる。
  • アプリオリアルゴリズム…興味度の最小値(しきい値)を設定し、それらの基準を満たす相関だけを報告することで情報を絞り込む。
  • アイテムセットやルールの支持度…どれくらいの頻度でデータに出現するのかを表す。
    • support(X)=count(X)/N
  • ルールの確信度…予測性能(正解率)を表す。
    • conidence(X→Y)=support(X, Y)/support(X)
  • アプリオリ原則「頻繁に出現するアイテムセットのサブセットはすべて避難員出現するはずである」
  • 実験
    • 相関ルールを使って頻繁に購入される商品を特定する。

実験

第9章:テストのグループを特定する ―k-means法

内容

  • クラスタリング…教師なし学習法の一種。データをクラスタ(似たようなアイテムから成るグループのこと)に自動的に分割する。
    • 「クラスタ内のアイテムは互いによく似ていなければならないが、クラス外のアイテムとは大きく違っていなければならない」という原則に従う。
    • 全体的に見て、多種多様なデータをずっと少ない数の典型的なグループに分類できる場合は、常にクラスタリングが役立つ。
    • クラスタリングにより、意思決定に役立つ意味のあるデータ構造が得られる。このデータ構造は、複雑性が軽減され、関係についてのパターンの手掛かりを与えてくれる。
  • k-means法…古典的に理解しやすいクラスタリングアルゴリズム。
    • kとnの値が極端に小さくない限り、インスタンスのあらゆる組み合わせを使って最適なクラスタを計算するのは現実的に不可能である。そこで、k-means法はヒューリスティックスを使って局所最適解を突き止める。
    • k最近傍法と同様に、k-mens法は特徴量の値を多次元の特徴量空間の座標として扱う。
  • ボロノイ図…他のクラスタの中心点よりも特定のクラスタの中心点に近い領域。
  • エルボー法…kを様々な値にしたときにクラスタ内の同質性または異質性がどのように変化するのかを評価する手法。
  • 欠損値のダミーコーディング
  • 欠損値の補完
  • Zスコア標準化…各特徴量の値の範囲を同じにするため。
  • 実験
    • k-means法を使ってマーケティングセグメントを特定する。

実験

第10章:モデルの性能を評価する

内容

  • 混合行列…正解値と一致するかどうかに基づいて予測値を分類する表。
  • 2×2の混合行列
    • 真陽性(TP)…関心の対象であるクラスとして正しく分類された。
    • 真陰性(TN)…関心の対象ではないクラスとして正しく分類された。
    • 偽陽性(FP)…関心の対象であるクラスとして誤分類された。
    • 偽陰性(FN)…関心の対象ではないクラスとして誤分類された。
  • 予測正解率(Acc)…性能指標の1つ。
    • Acc=(TP+TN)/(TP+TN+FP+FN)
  • 誤分類率(Err)…ご分類されたインスタンスの割合。
    • Err=1-Acc
  • k統計量…正しい予測が偶然によるものである確率を使って正解率を調整する。
    • クラスが極端に不均衡なデータセットにおいて重要な性能指標。
  • モデルの感度と特異度
  • 混合率と再現率
  • F値
  • ROC曲線
  • ホールドアウト法…データを訓練データセットとテストデータセットに分割する手法。
  • ブートストラップ法
  • 実験
    • 第4章のSMSスパムのデータを引き続き用いて、モデルの性能を評価する。

第11章:モデルの性能を改善する

内容

  • パラメーターチューニング
  • メタ学習
  • ブートストラップ集約
  • ブースティング
  • ランダムフォレスト
  • 実験
    • 第5章のデータを引き続き用いて、モデルの性能を改善化を試す。

第12章:機械学習の専門的なトピック

内容

  • データマンジング(データラングリング)
  • Webスクレイピング
  • オンラインデータとオンラインサービスの操作
  • 問題領域固有のデータを操作する。
  • ネットワーク分析
  • 並列コンピューティング
  • 分散コンピューティング
  • 最適化した学習アルゴリズムをデプロイする。
  • TensorFlow
  • Keras
  • ノーフリーランチ定理

おわりに

機械学習とRのどちらも初心者の私でもなんとか2週間で通読できました。
事前に基礎知識を持つ方であれば、もっと効率的に学習できると思います。