とある三流プログラマーの覚書

機械学習、自然言語処理を中心にIT系の話題を書いていく予定です

実践機械学習システム2章

はじめに

『実践機械学習システム』のお勉強、第2章です。

scikit-learnのインストールに非常に苦労しました。

環境構築については、前回の記事で。

2章の内容

2章はクラス分類(classification)の話です。

可視化や理解のしやすい小さなデータセットを使って、クラス分類の基本的な手法を学びます。

前半はアイリスデータセット(アヤメの品種分類データ)で、閾値を使った分類モデルを作ります。

モデルの評価を行うために、ホールドアウトデータを用いて、交差検定を行います。

後半は小麦の種のデータセットを使って、最近傍法で分類モデルを作成します。

特徴エンジニアリングとデータの正規化の重要性が紹介されています。

分類モデルの評価

訓練データを用いて、モデルの評価を行うと、正解率が高くてあたりまえなので、「新しいデータに対しての汎用的な能力(汎化能力)」で評価します。

汎化能力の評価を行うためには、訓練に使用していないデータを評価に使う必要があります。

そのため、あらかじめ訓練データから一部のデータをテスト用に取り除いて(ホールドアウトデータ)、モデルの作成と評価を行います。

K個に分割した、訓練データのうち、K-1個をモデルの作成に利用して、残りのデータを評価に利用することで、すべてのデータを使って汎化能力を評価するのが、交差検定です。

# 訓練データを10分割して交差検定
error = 0.0
for fold in range(10):
    # 全部Trueのnp配列を作る
    training = np.ones(len(features), bool)
    # 対象のみFalseにする
    training[fold::10] = 0
    # テスト用のインデックスを作る
    testing = ~training
    # 訓練データでモデルを作成
    model = learn_model(features[training], labels[training])
    # モデルをテストデータで評価
    test_error = accuracy(features[testing], labels[testing], model)
    error += test_error

error /= 10.0

特徴エンジニアリング

良い特徴量といのは、重要なことには過敏に反応するが重要でないことには反応を示さないものです。

特徴エンジニアリングとは、良い特徴量を設計あるいは選択することです。

アルゴリズムよりも、特徴エンジニアリングの方が、モデルの性能に大きな影響を及ぼすことが多いらしいです。