【超入門】Hivemallで機械学習 〜Treasure Dataでロジスティック回帰編〜

     - ビッグデータ ,  


こんにちは。俺やで。

ビッグデータとかデータサイエンティストとかいう言葉が未だブームですね。
(「データサイエンティスト」は下火か。)

ビッグデータ扱えるエンジニアも、
統計解析ができるアナリストも、
どっちもできるスーパーマンも世の中にはたくさんいますが、
ビッグデータも統計解析も扱えるインフラは多くはない現状です。

そこで!
この記事では、
ビッグデータに対応したHiveで使える機械学習ライブラリ、
「Hivemall」の使い方を学ぼうじゃないか!
という志をたくさん表現するべく書いています。

そして統計やるんだったら、
初歩的だけどおもしろいロジスティック回帰がいいだろうなと、
これを取り上げました!

ちなみにですが、
あくまで「Hivemallの使い方」に重きを置くので、
統計云々みたいな深い話は最低限しかしません。

あとTreasureDataで試させていただきました。
いつもお世話になります。

それでは、よろしくお願いします。

■1. ロジスティック回帰とは

①概要

「統計云々みたいな話は最低限しかしない」と言っといて、
いきなり統計の話です。恐縮です。

でもこれ説明しておかないとこの先意味ないので…

ロジスティック回帰とは、
いろんなパラメータでもって対象が「真」である確率を求める手法です。

広告業界ではCTR予測がいろんなところで例に出されますが、
もっとわかりやすいところで言うと、
「将来がんを患う確率」でしょうか。

がんになってしまう原因(=パラメータ)はいろいろです。
・年齢
・1日で吸うたばこの本数(=非喫煙者はゼロ)
・身内でがんになった人がいるかどうか(=遺伝的特性)(=本当に関係あるかどうかは知りません)
・運動習慣の有無
などなど。
患者さんからデータをとって、
”どのパラメータ”が”どの程度”がん疾患の原因として効いているのか把握することができます。
そうすれば今(たぶん)がんではない僕が、将来がんにかかる確率も求めることができるわけです。

医療研究で本当にロジスティック回帰が使われているかどうか知りませんが、
例えばこんなことができますよー、という認識で留めていただければ。

②数式

もうちょっとだけ統計の話(というか数学の話)します。
統計やるからには必須ですのでご勘弁ください。

ロジスティック回帰は次の数式になります!

図1
左辺のpが求めたい確率です。

n個のパラメータはそれぞれαという原因の重みをもつわけです。

(expは自然対数ですよ。一応)

グラフにするともっとわかりやすいです。

ロジット図

※値はテキトウです。

ロジスティック回帰はS字を描きます。

がんの話に戻すと、たばこの本数が増えれば増えるほど(横軸)、

がん疾患確率も高くなる(縦軸)、の図です。

※当然ですが縦軸は確率なので0~1、つまり0%〜100%の値をとります。

これは説明変数(パラメータ)がひとつの場合の図ですが、

これが複数の場合は各パラメータが確率に対して同じように作用しているんだと思ってください。

統計と数学の話は以上です!

■2.実践!Hivemall

①ここでやること。

R言語のサンプルデータ、irisでHivemallのロジスティック回帰を試してみます。

irisには3種類の花の、「がく(顎)」の長さと幅、「花弁」の長さと幅のデータが、全150レコード並んでいます。

具体的には次のようなデータ。

iris_data

【超入門】ということで、説明変数はひとつ。

花弁の幅でもって、その花が「virginica」である確率を求める回帰式を求めてみましょう。

つまりは次の数式のα0とα1を算出すればいいんです!

【超入門】Hivemallでロジスティック回帰_数式2

x1が「花弁の幅」になります。

②学習データの用意

学習させるためのデータの用意をします。

【超入門】Hivemallで機械学習_学習データ1

「label」にはその花が「virginica」であるかどうかのフラグ、
「features」はその花の花弁の幅が入っています。

「1:」という書き方で、さらに配列に入れていますが、これがHivemallの書式です。

この「1」は1番目の特徴(=説明変数)だということを表しています。

話の本筋から逸れてしまいますが、説明変数を複数使いたいときは、こんな感じです。

【超入門】Hivemallで機械学習_学習データ2

とあるレコードが1番目の値を持っていない場合、
何も書かなくてもOKっぽいです。
(その場合、nullとして処理されるのか0として処理されるのか…検証不十分です。すみません。)

何にせよ、これで学習データの準備完了です。

③ロジスティック回帰

ここでやっとHivemallの登場です。

さっき用意したテーブルを「iris」という名前にした想定で、次のクエリを投げましょう!

SELECT
  A.feature,
  CAST(AVG(A.weight) AS FLOAT) AS weight
FROM (
  SELECT logress(addBias(features) ,CAST(label AS FLOAT)) AS(feature, weight)
  FROM iris
) A
GROUP BY A.feature

addBiasはおまじないと思ってください。
(addBiasを指定しないとα0が常にゼロになってしまう)

logress関数が、Hivemallによるロジスティック回帰のミソです。

logressで引数にとったfeaturesとlabelがそれぞれ説明変数と目的変数として認識され、

ロジスティック回帰のパラメータを返してくれます。

このクエリを投げると、
こんな結果が返ってきます。。
【超入門】Hivemallで機械学習_クエリ結果1

はい。ほぼ終わりです。

さきほど次の数式のα0,α1を求めればいいと書きました。

【超入門】Hivemallでロジスティック回帰_数式2

その答えがここに!

α0が「-0.497〜」、α1が「1.416〜」になるんです!

例えばx1=0.1を代入するとp=0.41(=41%)、x1=1.4を代入するとp=0.82(=82%)になります。

つまり、花弁の幅が長ければ長いほど、その花が「virginica」である確率が高いわけですね!

なお説明変数を複数使った場合は、次のような結果が返ってきます。

【超入門】Hivemallで機械学習_クエリ結果2

α2(=2番目の説明変数として定義したもののパラメータ)の値がくっついてくるわけですね。

あとは予測したいデータに関して、これらの数式をあてはめてやれば、

そいつがどのくらいの確率で「真」なのか数字が出ます!

※ロジスティック回帰においてはsigmoidという関数を使うべしです。説明は割愛します。

データさえ作ってしまえば、あとは簡単なクエリで統計が使えるHivemall。

チャンスがあれば是非使ってみてください。

■追記 〜Hivemallを使う際の注意点〜

irisを使ったロジスティック回帰について解説しましたが、

R言語を使って単純にロジスティック回帰をすると、結果が全然違います。

というかHivemallの精度はirisを使う限りにおいては、めちゃくちゃ精度が低いです。

なぜなら、Hivemallのロジスティック回帰は、

Logistic Regression using Stochastic Gradient Descent

であって、普通のロジスティック回帰(Logistic Regression)ではないからです。

using Stochastic Gradient Descent が余計なわけですね。

詳細は割愛しますが、

要は「ビッグデータ用」のロジスティック回帰なんです。

「ビッグなデータを全部処理してると計算量が膨大になるから、

計算量減らすためにちょっとズルしますよ、

そのかわりちょっと精度落ちますよ」、

というのが「using Stochastic Gradient Descent」が言わんとするところです。

でもデータが大きければ多少ズルしても精度は大きく落ちません。

一方でirisは150行しかない、いわば「スモールデータ」。

ズルしたらいかん量なんですね。

 

データ選び間違えました。

 

また次回がんばります。

次記事:「HivemallでMinhash!〜似てる記事を探し出そう。〜」


DACエンジニア採用情報

  関連記事

image1
トレジャーデータの新機能「Data Connector」でクライアントレスなビッグデータ連携を実現する

トレジャーデータは、スキーマレスな大量のデータ(ビッグデータ)をパブリッククラウド上に保管して集計や抽出をするためのサービスなのですが、他システムからの連携データをトレジャーデータのテーブルに格納するまでが一苦労でした。 他システムとの外部連携を行う場合、一般的にローカルサーバー内のストレージを外部 …

chain
PyStanによるはじめてのマルコフ連鎖モンテカルロ法

はじめに こんにちは。システム開発部の中村です。 社内で行っている『データ解析のための統計モデリング入門』(所謂緑本)の輪読会に参加した所、 大変わかりやすい本だったものの、Macユーザには悲しい事に実装サンプルがWinBUGSだったため、 9章の一般化線形モデルのベイズ推定によるアプローチをPyt …

gasserverless
GoogleAppsScriptとTreasureData REST APIを使ってサーバレスにTwitterのデータを取得

またまたTreasureDataネタです。 ただ、今回はクエリ系のネタではなく、GoogleAppsScriptとTreasureDataのREST APIを使ってTwitterのデータをTreasureDataに入れてみたので、その方法を紹介したいと思います。 はじめに ログデータだけではなく、公 …

l_077
fastavroとjqでAVRO形式のファイルからデータを取得しよう

AVRO形式のファイルを取り扱いたい AVROとはApacheプロジェクトのひとつとして開発されているデータ交換形式です。 コンパクトなバイナリで高速なシリアライズ・デシリアライズが行えるため、サーバーログなどに利用されています。 弊社内での一部システムのログデータにも利用されているのですが、専用の …

PPG_anteli-kunatokei_TP_V
Treasure Dataで大規模なマスタデータを扱う際にはtimeカラムインデックスを活用しよう

DACではTreasure Dataを利用して各種データの蓄積や集計を行っています。Treasure Dataは時系列のデータを扱うのに特にすぐれたアーキテクチャなのですが、セグメントIDとユーザーIDの組み合わせといった大量のマスタデータを利用した計算にも利用することもできます。そのような場合にt …

sqlカクテル
【入門編】TreasureDataでサイトのアクセス解析をしてみた~第2弾!~

今回もやります、集計クエリ解説シリーズ第2弾!! 前回は、Webログからセッション単位のデータを作成するだけでした。 第2弾では作成したテーブルを元に、より実践的なアクセス解析、サイト分析で使えるHiveQLについて、実際に使用したクエリとともに解説していきたいと思います。 今回やったこと 利用した …

toadstool
【Hivemall入門】RandomForestで毒キノコ推定モデルを作る

こんにちは。俺やで。 今回も前回から間が空いてしましたが、ビッグデータに対応したHiveで使える機械学習ライブラリ、 Hivemallの使い方について、書かせていただければと思います。 なお今回はQiitaのTreasure Data / Advent Calender 2015の12/3日分として …

11396380473_26f323b1e4_z
Google BigQuery / Tableauを使ってみた

TableauからGoogle BigQueryへ接続してみました。 弊社で利用しているTreasureDataからデータ出力してBigQueryへロード、Tableauから接続まで実際に行った手順について記載します。 TreasureDataからAmazonS3へデータ出力 まず、データが蓄積され …

no image
Treasure Dataで長期間の集計

プラットフォーム・ワン T氏です。プラットフォーム・ワンでは、DSPのMarketOneとSSPのYIELD ONE提供しています。 MarketOneやYIELD ONEのログを調査する場合にTreasure Dataを使うことがあります。Treasure Dataでは大量のデータに対してHive …

logomono-tableau-software-mono
Tableau 9.2で郵便番号の特性を地図で可視化してみる

Tableau 9.2から郵便番号地図が表示可能に 弊社ではデータ分析ツールのTableauを利用しています。オーディエンスデータの重複を分析したり、デモグラフィック属性を表示したりするなどデータの可視化に役立ちますTableauでは9.2から日本の郵便番号を用いて地図を可視化できるようになりました …