DPCデータの分析とかやるブログ

DPCデータの分析なんかをテキトーにやってます。

scikit-learn 勉強ノート(1)

まえがきと目標

scikit-learnは最も有名なPython機械学習ライブラリです。
私も去年、「そろそろ機械学習をやるぞ!」と思い立って公式サイトを覗き、早々に諦めた覚えがあります。
だって恐ろしい数式が乱舞してますし、そもそも何を説明しているのかも分からないんですからね!

しかし、最近になって素晴らしい解説書が続いています。

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

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

特に「Pythonではじめる機械学習」は優れた入門書です。まだ読んでいる途中ですが、最初の数章を読むだけでライブラリを使い始めることが出来ます。
多くのPythonライブラリと違い、scikit-learnはそもそも使い始めるのにハードルが高い印象だったので、とても助かりました。

ちなみに、この勉強ノートでは

  • ライブラリを(お試し程度に)使えるようになること

を目標とし、数学的原理には踏み込みません。

基本準備

前提条件としてnumpyが必須です。import numpy as npでインポートしておきます。

データを用意し、分割する

なにはともあれデータを用意しましょう。
都合よく、頻用されるirisデータセットを読み込むための関数があります。

from sklearn.datasets import load_iris
iris = load_iris()

さて、load_iris()の返り値となるデータセットには、'target', ‘data’, ‘feature_names’, ‘target_names’, ‘DESCR’ の要素が含まれています。

  • target 各々のデータが何の品種だったかが数字で表されている。回答ラベル
  • data 花の萼片と花弁のサイズが記録されている。これを元にtargetを推測するのが練習問題
  • feature_names dataの各カラムに何の情報が入っているかの説明
  • target_names targetは数字で記録されているので、それに対応する品種名
  • DESCR このデータセットの解説

さて実際に学習に使うデータはdataで、回答ラベルはtargetです。まずはこの2つを、学習用とテスト用に分割してやらないといけません。
そんなことを手作業ではやってられないので、ちゃんと方法が用意されています。

from sklearn.model_selection import train_test_split
(旧バージョンのscikit-learnではfrom sklearn.cross_validation import train_test_split)

train_test_splitはデータと回答ラベルを引数に取り、それを学習用とテスト用に自動分割します。
慣例でデータはX_train, X_testに、回答ラベルはy_train,y_testに分割することとなっているようです。

X_train,X_test,y_train,y_test = train_test_split(
iris['data'],iris['target'],random_state=0)

これで4つの変数に学習用とテスト用データが保存されました。

モデルのインスタンスを作成する

from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier()

scikit-learnには様々なモデルが含まれています。モデルは特定のやり方でデータを読み込み、予測または分類を行います。
Classifierとなっていれば分類用のモデルですし、Regressorとなっていれば回帰用のモデルです。
今回例にしたランダムフォレストというモデルは、ClassifierとRegressorを両方持っています。
(つまりRandomForestRegressorもあります)

最初にすることはモデルのインスタンスを作成することで、まあ、forest = RandomForestClassifier()とあるように適当な変数に格納しておきます。
この時点ではデータを読み込みません。

モデルにデータを読み込ませて、予測や正答率を確かめる

モデルにデータを読み込ませるのは簡単です。.fitメソッドを使います。

forest.fit(X_train,y_train) 

これでforest上書きされて、学習データと回答ラベルから予測モデルを作ります。
X_trainはnumpyの多次元配列、y_trainはnumpyの一次元配列である必要があります。

最後に、予測と正答率を見てみましょう。

テストデータに対する予測をするには、

forest.predict(X_test)

とするだけで、予測したラベルを出してくれます。これを元に手作業で正解ラベルと比べてもいいのですが、もちろんもっと良い方法が用意されています。

forest.score(X_test,y_test)

で、モデルをテストデータに適用した場合の正答率を出してくれます。
今回は、まずIrisデータセットを使った分類問題をやってみました。いざやってみると、scikit-learnは本当に使いやすいライブラリですね。