-
Couldn't load subscription status.
- Fork 3
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}