scikit-learn 勉強ノート(1)
まえがきと目標
scikit-learnは最も有名なPythonの機械学習ライブラリです。
私も去年、「そろそろ機械学習をやるぞ!」と思い立って公式サイトを覗き、早々に諦めた覚えがあります。
だって恐ろしい数式が乱舞してますし、そもそも何を説明しているのかも分からないんですからね!
しかし、最近になって素晴らしい解説書が続いています。
Python機械学習プログラミング 達人データサイエンティストによる理論と実践 impress top gearシリーズ
- 作者: Sebastian Raschka,株式会社クイープ,福島真太朗
- 出版社/メーカー: インプレス
- 発売日: 2016/06/30
- メディア: Kindle版
- この商品を含むブログ (3件) を見る
Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
- 作者: Andreas C. Muller,Sarah Guido,中田秀基
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/05/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
特に「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は本当に使いやすいライブラリですね。