楽屋

連載:ターミナルとシェルスクリプト入門(2)

DATUM STUDIOの村上です。

この連載では、「ターミナルやシェルスクリプト怖い!わからない!」と思っている人に、「ターミナルやシェルスクリプトの便利さ」を伝えていきたいと思います。

前回は、「ターミナルやシェルスクリプトの特徴」をおはなししました。ターミナルやシェルスクリプトのようなキャラクタユーザインタフェース(CUI)では、すべての命令が文字列で表現されるため、初心者にはとっつきにくい一方で、命令をテキストファイルに保存しておき、簡単に繰り返し実行する事ができるというおはなしをしました。

今回は、SVMのライブラリであるlibsvmを例にとり、実際にwindowsのターミナルである、コマンド・プロンプトを使ってみたいと思います。

 事前準備

libsvmのサイトから実行ファイルをダウンロードして解凍し、C:直下に解凍したディレクトリ(フォルダ)を配置してください。また、サンプルデータ から、a1aとa1a.tというファイルをダウンロードして、C:\libsvm-3.22\dataに保存してください。(libsvmの更新によってバージョン番号が変わると思いますが、適宜変更してください。)

準備が完了すると、以下のようになるはずです。

LIVSVMの使い方

libsvmの使い方は、以下のとおりです。

  • 学習データを正規化する
  • 学習データを利用し、交差検定によってパラメータを決定する
  • 決定したパラメータでモデルを作成する
  • 正規化したテストデータを入力し、予測を行う

※学習データ:モデルを作成するために使うデータ。教師データ、訓練データ、トレーニングデータ等とも言う。※テストデータ:実際に識別や予測を行いたいデータ。

それぞれについて簡単に解説します。

学習データを正規化する

ここでの正規化は、各説明変数の値が指定した値の範囲内に収まるようにすることです。これは、最大値と最小値の差が大きい説明変数と小さい説明変数を対等に扱うためです。

学習データを利用し、交差検定によってパラメータを決定する

前項でも述べたとおり、SVMは学習パラメータをチューニングすることによって真価を発揮します。チューニングするためには何らかの指標が必要となります。交差検定は、「学習データの一部を取り出しテストデータとし、残りを学習データとして学習させたときの精度を出す」という作業を何回か繰り返し、モデルの精度を検証する手法です。

SVMはパラメータが多く、所謂グリッドサーチによるパラメータチューニングが必須です。

シェルスクリプトは、パラメータチューニングでもその価値を発揮できます。

決定したパラメータでモデルを作成する

学習データを利用してモデルを作成します。

テストデータを入力し、予測を行う

作成したモデルに正規化したテストデータを入力し、識別や回帰などの予測を行います。

テストデータは、学習データの尺度で正規化する必要があります。

LIBSVMを使ってみる ~ 交差検定まで

ターミナルの起動

ショートカットキー[windows + r]をキーボードで打ち込み「ファイル名を指定して実行」ウィンドウを出し、”cmd”と入力して[OK]ボタンを押します。

実行すると、あの憎き黒い画面が出てくると思います。

打倒コマンド・プロンプトを目指し、進めていきます!

学習データを正規化する

まず、学習データを正規化し、出力結果とその時のパラメータを保存するコマンドを実行します。以下のコマンドをコピーし、コマンド・プロンプトに貼り付けてください。(注意:ctrl+vでは貼り付けできません。右クリックから貼り付けを選んで貼り付けてください。)

早速長いコマンドですが、意味合いとしては

  1. “C:\libsvm-3.22\windows\svm-scale.exe”というアプリケーションを利用して、
  2. “C:\libsvm-3.22\data\a1a”を正規化し、
  3. 正規化した結果を“C:\libsvm-3.22\data\a1a.scaled”に保存します。
  4. このときに、scaleに使用したパラメータを“C:\libsvm-3.22\data\a1a.scaleparam”に保存します。

というコマンドです。

Enterを押して実行し、完了したらファイルエクスプローラーを覗いてみてください。C:\libsvm-3.22\dataに”a1a.scaled”と”a1a.scaleparam”というファイルが作成されれば成功です!

尚、”If feature values are non-negative and sparse, use -l 0 rather than the default -l -1″というワーニングが出るのは正常です。

学習データを利用し、交差検定によってパラメータを決定する

次に、正規化した学習データを利用し、交差検定を行います。以下のコマンドをコピーし、コマンド・プロンプトに貼り付けてください。(注意:ctrl+vでは貼り付けできません。右クリックから貼り付けを選んで貼り付けてください。)

さっきのコマンドよりはちょっと短くなりました。意味合いとしては

  1. “C:\libsvm-3.22\windows\svm-train.exe”というアプリケーションを利用して、
  2. “C:\libsvm-3.22\data\a1a.scaled”を学習データとして、
  3. 8分割の交差検定を行います。

というコマンドです。

実行結果は以下のようになると思います。

Cross Validation Accuracy = 83.1153%とあります。83%の精度があるということですね。まずまずです!

さて、交差検定は分割数を上げれば上げるほど検定の精度が上がります。

では、16分割の交差検定を行うにはどうすればよいでしょうか?馬鹿にするなと言われそうですね。そうです、-v 8となっている部分を-v 16とすれば16分割の交差検定が実行できます。

では、SVMのパラメータを指定するには? SVMを利用するにあたっては、costとgammaを指定したいですね。

ちょっとどう指定していいか分からないときは、以下のコマンドを叩いてみましょう。

すると、以下の出力が得られると思います。

-gでgamma、-cでcost、-vで交差検定の実行とその分割数が指定できると書いてありますね!

では、この説明に従ってコマンドを考えてみましょう。

交差検定のパラメータを指定する時は、半角スペースを空けて“-v”と打ち、また半角スペースを空けて分割数を指定していました。ならば、gammaを指定したい時は、その後ろに半角スペースを空けて“-g”と打ち、また半角スペースを空けてgammaの値を指定すれば恐らく実行できるはず…!

ということで、gammaを0.1に設定したい時は、以下のコマンドになります。

このように、設定したいパラメータを自由に増減できるのもシェルスクリプトの利点です。文字列での指定なので、変更も手早くできます。ちなみに、コマンド入力中に上下キーを押すと履歴が表示できるので活用してみてくださいね。

では、gammaを0.01、costを10に設定したい時は、どのようなコマンドになるでしょうか? これは次回までの宿題とします。今までの流れをよく読めばきっとできると思います!できた方は、パラメータを色々変更して遊んでみてください。

次回予告

次回は、実際にモデルを作成し、テストデータの予測をしたいと思います!