カテゴリー別アーカイブ: データ加工

ソードアート・オンラインを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のアウトプットはかなり妥当性の高いものではないかと思います。

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 #01

ML Studio Overview 1

ML Studioの画面を以下に示します。画面の左側に各種ビルディングブロックを格納したパレットがあり、中央部にビルディングブロックを並べるセクションがあります。ここにデータを提供するリーダーやモデリングを行うビルディングブロックなどを並べモデリングを行います。モデリングそのものの作法については次回以降に掲載します。ビルディングブロックはデータの加工からモデリングまで各種のツールが提供されており、Execute Python ScriptやExecute R Scriptといったスクリプト実行のビルディングブロックを使わなくてもコーディングレスでデータ加工を行ったり、モデリングを行うことが出来る環境にあります。特にClassificationはかなりのモデルが提供されています。また、著名なコンピュータヴィジョンのライブラリである、OpenCVの機能が一部提供され画像のロードを行うことも可能です。
ML Studio

Fig.1 ML Studio
Saved Datasets

Saved Datasetsにはサンプルとして、データセットが提供されています。データは需要、レビューから医療系まで色々とそろっており、各種モデルの検討に使ったり、トレーニングに用いることが出来ます。

Saved Datasets

Fig.2 Saved Datasets

ほかのビルディングブロックについては次のアーティクルで示します。

Azure Machine Learning #00

はじめに

Azure Machine LearningもGA (一般提供)を向かえ、注目を集めているようです。ここで、Azure Machine Learningとは何か、そして、どう使って行くかをまとめて行きたいと思います。Azure Machine Learningは洗練されたUIを持ち、ユーザインターフェイスとしてなら使用は容易です。しかし、機械学習の基本的なスキルなしに使うことは容易くはありません。この辺は機械学習の側面をかなり遮蔽しBAプラットフォームとしてレポーティングを含めまとめた、IBM Watson Analyticsとは根本的に異なるところです。

逆に言うと、IBM Watson Analyticsは機械学習の仕組みを遮蔽しているために、学習結果の理由を説明するのはかなり困難です。これは、同様に学習のアプローチを見せない、Google Predictive APIも同様です。その意味では説明可能であり、モデルの中身が見えるという面白い立ち位置にあります。これは、優劣というよりも考え方の違いかと思います。当たれば良い、そしてモデルの開発に時間をかけたくないというニーズもあれば、説明可能性が重要なこともあります。ただ、技術の使い分けを考えるときには重要なファクターです。

Azure Machine Learningとは

Azure Machine LearningはMicrosoft Azureの上に構築された機械学習のPaaSプラットフォームです。基本的にはアドホックに学習モデルを作成するためのML StudioとWeb APIとして学習や予測を動かすためのAPI群からなります。使用可能なモデルはMicrosoftが用意したプロプライエタリなモデルとR及びPythonが使用可能です。

ML Studioでのモデリングは有効グラフでビルディングブロックのデータフローを結線していく、SPSS Modelerや各種ETLツールで見かける形式を採用しています。この方式はデータフローが確認しやすくモデリングの仕組みを把握しやすい優れた方法です。PythonやRはビルディングブロックにスクリプトを記載する方法です。これは、R Analytics Flowと同様でスキルセットを活用しやすいと思います。

データは現時点においてはAzureのBLOB StorageもしくはSQL ServerのDBaaSであるSQL Databaseが利用できます。BLOB Storageにアウトプットすることで同じAzureのData Factoryをデータ加工プラットフォームとして活用できます。また、Machine LearningのアウトプットをBLOB Storageにして、ExcelやPower BIといったBIプラットフォームを活用し世間的な言い方ではBAプラットフォームの一部として活用できます。また、Web APIとして展開することで多くのツールからアクセス可能であると思います。

今回、GAを迎え、料金体系もプレビューのときとは一新しています。特徴は無料とStandardの2つに料金体系が分かれたことです。無料の側はWeb APIの利用に制限があり、また、モデリングの連続実行時間に時間制約があることデータサイズに上限があること、またSLAが保障されず、スケジューリングの優先順位が高くないこと、などの制約がありますがデータサイズは10GBとゆるく無料でもかなりのことができます。また、使用可能なモデルにも制約はありません。(2015/02/20 現在)

Excel PowerQuery/PowerPivotを利用する場合の推奨するタスクフロー

PowerQuery/PowerPivotは機能が多いため、いくつかの側面では機能重複を起こしている面がある。たとえば、PowerPivot単体でもデータのインポートが行える。また、PowerQueryもTable.Pivotを使って集計することが出来る。従って、一つのタスクを実行するにしても複数のフローが考えられる。しかし、現実的な分析を行うにはある程度、推奨できるタスクフローが定義できる。本稿では以下のタスクフローを推奨する。このフローはExcel 2013以降でPowerQuery、PowerPivotを使う場合を想定している。

  • Power Queryでデータを取得する
  • 分析に必要な加工をPower Queryで行う
  • Power Pivotにデータモデルを出力する
  • Power Pivotで集計を行い可視化する
  • このタスクフローではPower QueryをETLツールとして活用し、加工されたデータをPower Pivotで集計し可視化するというフレームワークをとっている。Power Pivotは内部的に列指向のデータベースを持っているため集計に適するが、一方でデータ加工を行うには式で定義できる制約があるためPower Queryには機能性・生産性で及ばない。従って、Power Pivotで集計のパフォーマンスを稼ぎ、データ加工はPower Queryで柔軟にというのがもっとも現実的と思われる。

    そのため、ETLツールとしてはPower Queryを活用する。また、本稿ではアドホックな分析を前提とするが、集計をある程度規格化する場合には、SQL Server Analytics Services (SSAS)で集計の仕方を配布することも検討してほしい。

    Excel PowerQueryでテーブルを結合する

    使っているExcelが2010以降でボリュームライセンスのExcelや単独のアプリケーションでの購入や企業用のOffice 365の購読の場合にはPowerBIに含まれるPowerQueryが使用できる。PowerQueryは多様な機能を持っているがテーブルの結合はデータ加工時には多用するため解説する。

    テーブル同士を結合するPowerQueryの関数はTable.Joinである。この関数は以下のような文法になっている。
    Table.Join(<テーブル1>,<結合に使用する列名1>,<テーブル2>,<結合に使用する列名2>[,<結合の方法>])
    結合の方法はJoinKind列挙型で以下のいずれかを取る。

    • TableKind.Inner
    • TableKind.LeftOuter
    • TableKind.RightOuter
    • TableKind.FullOuter
    • TableKind.LeftAnti
    • TableKind.RightAnti

    恐らく多用するのは内部結合 TableKind.Inner、外部結合 TableKind.LeftOuterの2つだろう。基本的にはSQLのJoinと変わらないがPowerQueryの場合には当然ながら各種のデータソースを混合して結合できるところにメリットがある。

    SQL Serverで週番号を出す

    データ加工ではその特性上、週番号がほしいことがあります。特に週単位に集計したい場合には。

    SQL ServerではDATEPART関数でwwを指定することで週番号をとることができます。例えば以下のような使い方ができます。

    SELECT DATEPART(WW,CONVERT(DATE,'2011/1/7'))

    この場合には2週目になりますので、週番号として2が返ってきます。また、週初めとして起算する最初の曜日は以下の形で指定します。

    SET DATEFIRST <曜日>

    曜日は1~7をとり、7は日曜日となります。また、DATEFIRSTの既定値は7となります。

    Windows PowerShellでデータ加工する

    このアーティクルは以前、公開したものの改訂版になります。

    データを分析する場合、重要な工程にデータ加工があります。データ加工によって分析しやすい形にすることで、身も蓋もありませんが特別な統計的アプローチに凝るよりも精度に良い影響を与えることは少なくありません。一般にデータ加工においてコンパイルの必要な言語を使うことは少なく、またスクリプトによって自動化を進める必要もあります。

    Windows PowerShellはADO.NETによるDB接続やDecimalでの演算、正規表現などデータ加工に必要なツールを一通り備えていると考えています。また、Windows Server 2008以降ではWindows PowerShellはWidows OSに標準で含まれているためソフトウェアのインストールに煩雑な手続きが必要な現場でも使えるのではないかという考えもあります。  データ加工で考えられる代表的なタスクを纏めてみます。

    ADO.NETを参照する
    [System.Reflection.Assembly]::LoadWithPartialName(“System.Data”)
    SQL Serverに接続する
    $conn = New-Object System.Data.SqlClient.SqlConnection <接続文字列> $conn.Open()
    SQL文を実行する
    $sqlcmd = $conn.CreateCommand() $sqlcmd.CommandText = “SELECT 1” $r = $sqlcmd.ExecuteScalar()
    先頭一文字を取りだす正規表現オブジェクトを生成する
    $re = New-Object System.Text.RegularExpressions.Regex “(.)(.*)”
    CSVファイルを読みだすためにTextFieldParserを生成する
    [System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.VisualBasic”) $tfp = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser <ファイル名>

    ちなみに、Windows PowerShellにはコレクションを繰り返す方法にForEach-Objectとforeach文があるが、データ加工にはForEach-Objectの方が適すると思われる。これは、コレクションが展開されてそれを繰り返すかイテレータで逐次取得するかが絡んでいるがこれについてはいずれ検証したい。