Django:教師あり機械学習を実装してみる「scikit-learn」

Django:教師あり機械学習を実装してみる「scikit-learn」

Django:教師あり機械学習を実装してみる「scikit-learn」

ECサイトのSEOワード評価にAIを使いたい意図があり触り始めたPythonです。
その過程で依頼いただいたサイト作成をDjangoで書いてみたりなどWEB側の操作を多々覚えてきましたが、今回はそもそもの目的の機械学習。
いきなり流入ワードとサジェストを評価させてなんて事はせず、子供の自由研究用データで遊んでみたいと思います。

Pythonの機械学習は【 TensorFlow × Keras 】という深層学習ライブラリの組み合わせが上級者向け【scikit-learn】が初級向けという括りになる様子。機械学習初体験なので今回は迷いなく【scikit-learn】で。

機械学習の入り口に立つために必要なこと

Djangoを利用して機械学習をするにあたり、最低限必要なことが2つあります。

  1. Pandasを(調べながらでも)それなり操作できること
  2. PresetClassを利用せず、View関数の作成にてサイト構築ができること

def~~でVeiwを書いていれば嫌でもpandasを扱っていると思うので、そういう方には機械学習の初手はとても簡単です。

まずは決定木を作るところまでを目的としてみる

本来的には決定木を作成するまでに様々なデータ処理が必要なのだそうです。

  • クリーンニング(外れ値を除外する ※外れ値:大きなまとまりの外にポツンと存在する例外。中央値と平均を遠ざける値)
  • 特徴量の選択(特徴量:分析すべきデータや対象物の特徴・特性を、定量的に表した数値)
  • 欠損値の処理(欠損値:特徴量のデータがそろっていないレコード。破棄したり平均値で穴埋め処理する)
  • 過学習対策(過学習:訓練誤差は小さいにもかかわらず、汎化誤差が小さくならない状態 ※汎化誤差=未知のデータを判定したときの誤差)
  • データ次元削除(次元の呪いを回避するための処理。※次元の呪い:データの次元数が大きくなり過ぎると組み合わせが飛躍的に多くなり、有限なサンプルデータでは十分な学習結果が得られなくなる)
  • クラスタリング(特徴の似たものをグループ化していくこと)

今回は機械学習構築の初体験なので、これらデータの前処理は飛ばします。まず体験してみようというやつです。
なので、作成した決定木に意味は求めません。
あくまでも『決定木を作ること』を目的として実装/実行していきます。

必要な道具を用意する(事前準備)

事前準備は3つ。このうちの1は決定木を作成するライブラリ。2~3は決定木を見るためのツールです。

  1. scikit-learnライブラリのインストール
  2. Graphvizのインストール(自分のPCへインストール)
  3. C:\Program Files\Graphviz\binへパスを通す ※インストール時にチェックを忘れた場合はシステム設定から追加操作

scikit-learnのインストール

Dockerの場合はコンテナビルド後の手間を減らすための requirements.txt への追加を忘れないように。
サーバー側の準備はこれだけでOKです。

Graphvizのインストール

Djangoをベースとして機械学習を行う場合、決定木のビジュアライズに難点があります。

決定木を描写してくれるツールが存在しない

scikit-learnの【tree.plot_tree】ではPython上では見えてもDjangoのTemplateへビジュアライズされた決定木を表示してくれません。そこら辺はおいおい詰めていく記事を書いていきたいと思いますが、今回は下の流れで決定木をビジュアライズします。

  1. tree.export_graphviz(model, feature_names = columns, out_file=’tree.dot’) で 決定木モデルをDOTデータに変換
  2. FTP(SFTP)経由でDATデータをデスクトップに移動
  3. コマンドツールにて dot -Tpng tree.dot -o tree.png を実行。※Graphivizで決定木をPNG画像化

決定木ってなに?

ここまで何度もワードが出てきていますが、決定木とは『与えられた事象を分析するルート』の事です。教師アリ機械学習では、条件と答えを与えることで「どんな条件の時にどうなるか」を機械が分類し決定木を作成してくれます。決定木
※左:娘の自由研究のデータ(四つ葉のクローバーが出来た週の気象データとできなかった時の気象データ)を学習させた結果。気象データを『特徴量』四つ葉が出来たか否かを『正解ラベル』として渡して作成してみた決定木。

scikit-learnにデータを解析してもらう手順

  1. views.pyに from sklearn import tree を加える
  2. 『特徴量』と『正解ラベル(答え)』をDataFrame型で用意する
  3. 未学習のモデルを用意する model = tree.DecisionTreeClassifier(max_depth = 5, random_state = 0)
  4. モデルに『特徴量』と『正解ラベル』を与えて学習実行 model.fit( 特徴量, 正解ラベル )

学習自体はこれだけで完了です。
なんて簡単な…。

 実際に書いたスクリプト

こんな感じで、機械学習に掛けるパーツより、データを成形するパーツの方がスクリプトは多くなります。

なので、Pandasやテーブルの扱いが機械学習の実装が出来るか否かの分岐点になると思います。

DOTデータのできる場所はどこか

上のScriptの27行目がDOT出力のパーツです。
最初 out_file=’tree.dot’ としていたのですが、データが生成された気配がなく困っていました。

  • out_file=’tree.dot’ :どこにも見当たらない。
  • out_file=’app/tree.dot’ :プロジェクト\アプリのディレクトリに保存される。

理屈上はプロジェクトの直下に生成されそうなのですが、できませんでした。
誰のデータか判断するためにも、アプリ/views.pyで出力指示をしていてもアプリディレクトリから記載するようにしましょう。

決定木のビジュアライズ

ここからはPC上での操作になります。
私のPCはWindowsなのでWIN10での操作です。

Graphvizをインストールする

こちらから自分のPCに最適なものを選びダウンロードします。
Graphvizを利用するためにはパスを通す必要があります。

インストール時の画面にてAdd~~PATHの箇所にチェックを入れるとシステム詳細設定を弄る必要なくパス追加まで自動で処理してくれふので、忘れずにチェックしましょう。

tree.dotファイルをダウンロードする

わかりやすくデスクトップに置いてみます。

コマンドプロントを開きtree.dotを保存したフォルダに移動

コマンドプロントを立ち上げるとUSERに移動しているのでデスクトップに移動します。

決定木をビジュアライズした画像データ生成

コマンドプロントでこれを打つだけです。
これでtree.pngという画像がデスクトップ上に生成されます。

まとめ

上のコードだけで、作成した決定木モデルに対して下のように指示すると四つ葉が出来るかを推定してくれます。

ただ、「さぁ、正解率は」となるとデータに前処理をしていないので、よろしくありません。
結局、入れた特徴量が結論に対して分散していると推測に誤が多くなるって事ですかね。
なので、機械学習自体は簡単に実装できるけど【どのデータで分析するか】の特徴量の選定が重要になってくるのだろうと思います。
※与えられたデータを登録することで、特徴量と正解ラベルの相関関係の特徴をつかむことは十分にできます。

面白い!しばらくこれで遊べそうです。