作成者別アーカイブ: gorn

Azure ML上のRにおける状態空間法でのアクセス解析

3月の.NETラボ勉強会で『Azure ML上のRにおける状態空間法でのアクセス解析』のタイトルでLTに登壇しました。

 

ソードアート・オンラインをword2vecする

ソードアート・オンライン (Web版)をword2vecしてみました。これをmecabを用いて分かち書きします。分かち書きしたものをgensimに与えて、word2vecでモデルを作成してみました。

モデリングのコードは以下のとおりです。基本的にあんちべさんの『自然言語処理の最新手法”word2vec”で艦これ加賀さんから乳を引いてみる』と同じです。

import codecs
from gensim.models import word2vec
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus('SAO1.wakati')
model = word2vec.Word2Vec(sentences, size=200)

原作でキリトの対するヒースクリフについてアウトプットを見てみました。

ランク 類似度
1 自分 0.797701954842
2 茅場 0.772888898849
3 姿 0.766229510307
4 意思 0.732955038548
5 0.720785975456

茅場はヒースクリフの正体でありセットで出てくるので類似度が高いのは妥当です。自分は恐らく、1巻がキリト目線だからでしょう。キリトの前に立ちはだかるのがヒースクリフであり、キリト自身意識しているため高い類似度を示したものと思います。紅は恐らくヒースクリフがKoBの団長であるためでしょう。

この結果を見る限り、word2vecのアウトプットはかなり妥当性の高いものではないかと思います。

AzureMLでfitdistrplusを使った確率分布の推定

ここでは確率分布の種類は既知のものとして、データから確率分布のパラメータの推定を行う過程を紹介する。Azure MLでは当該機能は機能セットとしては提供していないため、Rで実装されているfitdistrplusを用いて行う。
サンプルデータとしてパラメータが既知の分布を基づいて乱数を生成し、その乱数をデータとしてパラメータの推定を行う。この場合のML StudioでのExperimentを下記図に示す。

Experiment for Estimation Parameters

Experiment for Estimation Parameters

Figure 1は2つのRスクリプトで構成されている。このスクリプトを下記Source 1およびSource 2に示す。Source 1はサンプルデータの生成を行うスクリプトで、Source 2がデータに基づき分布の推定を行うスクリプトである。

maml.mapOutputPortおよび、maml.mapInputPortはAzure MLのRにおける固有の関数でデータの受け渡しを行う関数である。アウトプットされたグラフィックスは既定で特定の割り当てがなされるので特に実装を行わなくてもPNGフォーマットで取得することができる。出力結果を以下のEstimate Resultに示す。

# Create Data Set
data.set
Source 1: Data Generate
# Load required packages
library(fitdistrplus)

# load data frame
data.set
Source 2: Parameter Estimation
Estimate Result

Estimate Result


データサイエンティスト養成読本 R活用編

いささか、旧聞にはなるが上記、書籍を書いておきます。基本的には前に刊行されたムックの続きでRなどにフォーカスしたムックです。R活用編となってはいますが、商業書籍では珍しいJuliaの入門記事やRを.NET環境から利用するR.NETの記事など割と面白いものになっています。特にR.NETを含めた.NETのライブラリ群の配布は現在はNuGetであることは.NETの開発者の諸兄には自明なのですが、意外と気づかない向きもありますので書いておきます。

さて、私の目的はJuliaの入門記事であったわけですが、文法の解説に関しては割りとしっかり書かれているように思われます。とはいえ、ムックの一セクションなので食い足りないのも確かです。書籍ベースだと後は洋書の”Seven More Languages in Seven Weeks: Languages That Are Shaping the Future”と先に書評を書いた、同人誌の実例で学ぶJulia言語入門 v0.3.3/v0.4.0-dev 対応版あたり。

PowerQueryでRemember the milkからタスク一覧を抽出する (拡張)

先ほどのPowerQueryのクエリを拡張して他のカラムも取り込んで見ました。タグや期日なども取り込めるようにしてのでサンプルとしてより実用的になったと思います。

let
    Source = Web.Contents("< source uri >"),
    Document = Xml.Document(Source),
    Entries = Table.SelectRows(Document{0}[Value], each ([Name] = "entry")),
    Rows = Table.ToRows(Entries),
    ProjectedEntries = List.Transform(Rows, (x) => x{2}),
    P = List.Transform(ProjectedEntries, (x) => Table.SelectRows(x, each (([Name] = "id") or ([Name] = "updated") or ([Name] = "title") or ([Name] = "content")))),
    R = Table.FromList(List.Transform(P, (x) => Table.Range(Table.PromoteHeaders(Table.Transpose(x)),1,1)), Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    S = Table.ExpandTableColumn(R, "Column1", {"updated", "id", "title", "content"}, {"updated", "id", "title", "content"}),
    SX = Table.AddColumn(S, "additional", each Table.PromoteHeaders(Table.Transpose(Table.FromRecords(List.Transform([content]{0}[Value][Value],(x) => [Name = Text.Trim(Text.Replace(x[Value]{0},":","")),Value = x[Value]{1}]))))),
    SY = Table.ExpandTableColumn(SX, "additional", {"Due", "Priority", "Time estimate", "Tags", "Location", "Postponed"}, {"additional.Due", "additional.Priority", "additional.Time estimate", "additional.Tags", "additional.Location", "additional.Postponed"}),
    S1 = Table.RenameColumns(SY,{{"updated", "更新日時"},{"title", "タスク"},{"id", "ID"},{"additional.Due", "期日"},{"additional.Priority", "優先度"},{"additional.Tags", "タグ"}}),
    S2 = Table.RemoveColumns(Table.ReorderColumns(S1,{"更新日時", "タスク", "期日", "優先度", "タグ", "ID"}),{"content","additional.Time estimate","additional.Location","additional.Postponed"})
    
in
    S2

PowerQueryでRemember the milkのRSSからタスク一覧を抽出する

PowerQueryでRemember the milkのフィードを加工してタスク一覧を抽出するクエリを書いてみました。データ加工のサンプルとして最適なので公開します。フィードのURIのみ変更してあります。

let
    Source = Web.Contents(< feed address >),
    Document = Xml.Document(Source),
    Entries = Table.SelectRows(Document{0}[Value], each ([Name] = "entry")),
    Rows = Table.ToRows(Entries),
    ProjectedEntries = List.Transform(Rows, (x) => x{2}),
    P = List.Transform(ProjectedEntries, (x) => Table.SelectRows(x, each (([Name] = "id") or ([Name] = "updated") or ([Name] = "title") or ([Name] = "content")))),
    R = Table.FromList(List.Transform(P, (x) => Table.Range(Table.PromoteHeaders(Table.Transpose(x)),1,1)), Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    S = Table.ExpandTableColumn(R, "Column1", {"updated", "id", "title", "content"}, {"updated", "id", "title", "content"}),
    S0 = Table.AddColumn(S, "filtered content", each [content]),
    S1 = Table.RenameColumns(S,{{"updated", "更新日時"},{"title", "タスク"},{"id", "ID"}}),
    S2 = Table.RemoveColumns(Table.ReorderColumns(S1,{"更新日時", "タスク", "content", "ID"}),{"content"})
    
in
    S2

線形回帰

データ分析者にとっては当たり前以前のモデルではありますが、Azure Machine Learningなどによってはじめて、機械学習に興味を持った諸氏もおられると思いますので、ざくっと。

線形回帰は目的変数Yと説明変数X_n及びランダム項\epsilonを以下のモデル式で表現します。
Y=\beta _0 + \beta _1 X_1+\beta _2 X_2+ \cdots \beta _n X_n + \epsilon

線形回帰のメリットは回帰係数 \betaという形で、各説明変数の目的変数への影響がわかりやすいため、解釈しやすく実ビジネスに適用しやすいことです。逆に言えば、その解釈の容易性ゆえに実ビジネスの複雑な動きはきちんと表現されえないことも多いということでもあります。解釈の容易性とモデルの当たり具合はトレードオフの関係にあり、精緻なモデルほど式の複雑さゆえに解釈しずらくなることが多いです。

さて、線形回帰を解くということは、この各回帰係数 \betaを求めるということです。そして、その上でランダム項であるランダム項\epsilonが小さくなるようにするということです。Azure Machine LearningのLinear Regressionはこれらを求める機能が入っています。数学的にこれらを求める手法は割愛します。実ビジネスの環境下では解釈の容易性ゆえに、この系譜である一般化線形回帰、ロジスティック回帰という形で最も登場頻度の多い分析手法の一つであるといえます。

Rで指数表記 (Scientific Notification)を抑止する

Rで指数表記されるのを抑止するには、変数に対してformat(variable, scientific = FALSE)を実行します。例えば、データフレーム中の特定の変数X1について指数表記を抑止するには以下のようなコードとなります。

df$X1 <- format(df$X1, scirntific = FALSE)

Rと他のプログラム間でデータを移動させるとき、プログラムによっては指数表記を解釈できない場合があります。特にCSVでデータをエクスポートする場合にありえるかと思います。