Skip to content

How to upload csv via ruby client

soshi51 edited this page Apr 18, 2013 · 8 revisions

はじめに

Bazilサービスでは以下のようなヘッダ付きcsvを使いトレーニングデータの登録をしています。

string,string,number,number
annotation,name,height,weight
男,太郎,180,80
女,花子,155,40
男,裕也,163,75

これに対し、RubyClientではJSONをベースにしたインターフェースになっています。 ここでは、BazilのCSVをRubyClient経由でBazilサービスにアップロードする簡単なサンプルスクリプトを紹介します。

Bazil用の形式のCSVなら、例となっているデータファイルに依存せず、アップロードが可能です。 モデルやコンフィグのIDや、元データの形式など、必要に応じて書き換えてご利用ください。

サンプルコード

#!/usr/bin/env ruby
# encoding: utf-8

require 'bazil'
require 'csv'
require 'json'

# https://github.com/pfi/bazil_ruby_client/wiki/How-to-use の「1. 準備」と「2. クライアントの作成」を参考にクライアントを作る
# client = Bazil::Client.new(ca_file: "/Users/soshi/Documents/2013.02/reuter_dataset/rootcacert.cer")
# MACの場合、グローバルサイン社の中間CA証明書が必要な場合もあります。
# https://edi.globalsign.com/repository/ の「ルート証明書」からダウンロード可能。
client = Bazil::Client.new()

# APIキーとシークレットキーは .bazil/api_keys を自動で読み込むが、プログラム上での指定も可能。
# client.set_api_keys('aaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbb')

# モデルIDとコンフィグIDからモデルを取得します。
# モデルIDとコンフィグIDはWebから確認できるほか、RubyClientからもアクセス可能なモデルの一覧を取得できます。 
# 詳しくは How-to-use の 「3. モデルの取得」をご覧ください。
model = client.model(1, 23)

# RubyのCSVライブラリを使ってCSVファイルを読み込みます。
# ここでは"name_demo.csv"をいう名前を使っています。
CSV::open('name_demo.csv', 'r') {|csv|
  # 先頭二行にヘッダ(型とラベル)
  types = csv.readline
  labels = csv.readline

  # 左1列はアノテーション(正解のラベル)
  annotation_type = types.shift
  annotation_label = labels.shift

  raise "header must have same # of columns" if types.size != labels.size
  raise "empty data" if types.size == 0

  # CSVのボディーの読み込み
  csv.each{|row|
    # アノテーション
    annotation = row.shift
    annotation = annotation.split(' ') if annotation

    raise "each row have same # of columns as header" if row.size != types.size

    # データ
    data = {}
    row.map.with_index{|value, index|
      case types[index]
      when 'string'
        data[labels[index]] = value.to_s
      when 'number'
        data[labels[index]] = value.to_f
      else
        raise "Unknown type '#{types[index]}'"
      end
    }

    # モデルに学習データを追加する
    model.train(annotation: annotation, data: data)

    # 同じ形式のCSVのデータからクエリを投げる
    # res = model.query(data)

    # model.trace の結果を取得する場合には、第一引数に "feature_weights" を指定する
    # res = model.trace("feature_weights", data)
  }
}

# 試しにクエリを投げてみる
res = model.query({'name' => '綾子', 'height' => 160, 'weight' => 50})

# 判定された結果
p res["classification_result"]
# => "女"

# それぞれの結果のスコア
p res["score"]
# =>{"男"=>-0.289951503277, "女"=>0.289951503277}
Clone this wiki locally