機械学習メモ – scikit-learnを動かしてみよう

機械学習メモ ソフトウェア

今回の話題

pythonの業界標準的な機械学習モジュール scikit-learn を動かしてみます.
こちらの環境は Python 3.X (3.6.9〜3.9.1) + scikit-learn 0.24.0 です.

scikit-learnのインストール

インストール方法はpythonの環境ないしパッケージ管理システム(pip,conda,aptなど)によって異なります.

  • pip install scikit-learn # python.org版の場合
  • conda install -c conda-forge scikit-learn # Anacondaの場合
  • sudo apt-get install python3-sklearn # Ubuntuの場合

少し補足.

  • pipの場合,pip install sklearn すると別物が入るようなのでご注意を.
  • Anacondaの場合,pip併用はシステム不整合の元になるので極力避けます.
  • Ubuntu 18.04の場合,aptのpython3まわりはやや古いので,当方ではget-pip.pyで新しいpipと追加のpython3モジュールを入れています.

コードと実行結果の例

手書き数字画像の認識(分類 classification)を試してみます.次のような画像を見分けます.

UCI手書き数字画像 (predictに使った最初の10例)

そしてコード例.テータセットを用意し,学習し,予測します.

from sklearn.svm import SVC as Model    # SVMベースの分類器                                                                                                                            
from sklearn.datasets import load_digits as Load    # UCI手書き数字画像 8x8画素 1797枚                                                                                                 
from sklearn.model_selection import train_test_split    # データを学習用と評価用に分割

# データを用意する - x:説明変数 y:目的変数 1:学習用 2:評価用
x,y = Load(return_X_y=True)
x1,x2,y1,y2 = train_test_split(x, y, train_size=0.75, random_state=777)

# 学習する - 分類器を生成しxとyの対応関係を学習
model = Model(random_state=777)
model.fit(x1, y1)

# 予測/評価する - 予測値や正答率などを算出
y3    = model.predict(x2)
score = model.score(x2, y2)
print('score=%.4f y_test=%s.. y_pred=%s..' % (score, y2[:10], y3[:10]))

そして実行結果.手元のPCでは所要1秒ほどで正答率98%,上の画像とも合いました.

$ python3 sample-1.py
score=0.9800 y_test=[5 6 6 2 4 1 7 3 4 3].. y_pred=[5 6 6 2 4 1 7 3 4 3]..

これで最小限の機械学習コードが動きました.
学習モデルデータセットのチョイス(1,2行目)を変えればとりあえずいろいろ試せます.あるいは自前のデータセット x, y があれば,そちらを試すと面白いかもしれません.

コードの説明

処理は次の3ステップです.自明のようですが,長いコードでは案外見失いがちかもしれません.

  1. 説明変数と目的変数のデータセットを用意する.(6-7行目)
  2. 説明変数と目的変数の対応関係を学習する.(10-11行目)
  3. 説明変数から目的変数を予測する.(14-15行目)

ステップ1で用意すべき x, y は次のようなarray-likeです.

  • x[i][j] = (レコード i の説明変数 j の値)
  • y[i] = (レコード i の目的変数の値)

今回のデータセット(2行目)で言えば,x[i][j] は画像i上の座標 (j%8, j/8) の画素値,y[i] は画像iに描かれた数字の正解値(0〜9),サイズは x: 1797\(\times\)64,y: 1797 です.

ステップ2,3では分類器のメソッドで学習や予測・評価をしています(11,14-15行目).
scikit-learnのインタフェースは統一/踏襲されており,別の学習モデルや別の機械学習モジュールも似た感じで使えたりします.fit() で学習,predict() で予測,など.

行ごとの詳しい説明.

  1. 学習モデルとして,今回は分類器の一種SVCを使います.迷ったら問題に適したものをチートシートから選択(図はクリッカブルです).
  2. お試し用データセットの中から,今回はUCI手書き数字画像を使います.
  3. データセットを学習用と評価用に分割するユーティリティを使います.
  4. データセットを読込みます.現実問題では概してここに至るまでが大変.
  5. データセットを学習用と評価用に分割します.比率3:1,再現性のため乱数のタネ指定.
  6. 学習モデルを作成します.再現性のため乱数のタネ指定,ハイパーパラメタ無調整.
  7. 説明変数と目的変数の対応関係を学習します.
  8. 説明変数から目的変数を予測してみます.
  9. 予測値の正答率を算出してみます.実力を測るなら未学習データで評価.

まとめ

scikit-learnのインストール方法と最小限のコード例を紹介しました.追ってもう少し詳しく見ていこうと思います.


Accutheraでは加速器・医療システム・機械学習・放射線シミュレーションなどの専門技術を軸に開発やコンサルティングを承っております。お困りの案件がございましたら、こちら からお気軽にお問合せください。

タイトルとURLをコピーしました