ForecastFlow が Tableau Prep と連携できるようになります

ForecastFlow Python パッケージを開発中です. 第一弾として ForecastFlow へのデータのアップロードと, 推論機能の公開を予定しています. これらの機能を利用すると Tableau Prep から ForecastFlow を利用することができるようになります.

f:id:gri-blog:20191115101528p:plain

自動化の恩恵

これまでの ForecastFlow と Tableau Prep を用いた分析では ForecastFlow へのアップロード, 出力結果のダウンロードを毎回人手で行う必要があり, この部分がボトルネックになっていました. ForecastFlow と Tableau Prep が接続できるようになることでこれらの処理が自動化され, 本質的な作業に時間を割くことができるようになります.

手数が増える

人が付きっきりで面倒を見なくても良くなるので, 夜間に大量の推論を回すことも可能になります. 例えばいろいろなシナリオを用意して結果を比較する "What-If 分析" をたくさん試行することができます.

これまでよりずっと簡単

Tableau Prep のフローを作ってしまえばワンクリックで推論結果が得られます.

デモ

実際の利用方法を見てみましょう.

データはワインの品質を予測するオープンデータセットの Wine Quality Red を使用しました. UCI Machine Learning Repository: Wine Quality Data Set.

モデルの用意

ForecastFlow で予測モデルを作った後, プロジェクト ID とモデル ID を用意します. プロジェクト ID はプロジェクトを開いたときの URL の project/ 以降の文字列です. モデル ID も同様にモデルを開いたときの model 以降の文字列がモデル ID になります.

f:id:gri-blog:20191115112341p:plain
例えばこのプロジェクトのプロジェクトID は WBqYh17m10Uc7pD2FQ2m

TabPy サーバーの用意

Tableu Prep で Python を実行するために必要な TabPy サーバーを用意します. pip を使って tabpy と forecastflow (近日公開予定) をインストールしてから "tabpy" コマンドで TabPy サーバーを起動します.

Tableau Prep を TabPy サーバーに接続

Tableau Prep にデータを接続した後 "+" をクリックしてスクリプトの追加を選択します. 接続タイプに Tableau Python (TabPy) Server を選択し, IP アドレス, ポート番号を入力して接続します.

f:id:gri-blog:20191115113054p:plain
スクリプトの追加を選択

スクリプトの用意

ForecastFlow を実行するためのスクリプトを用意します. スクリプト内ではスキーマを返す get_output_schema 関数と実際の処理を行う関数 (今回は ff_predict という名前) を用意します. ForecastFlow の登録メールアドレス, パスワードと先ほど確認したプロジェクトID とモデル ID をスクリプトに書きます.

実際に使用したスクリプトを公開します. ForecastFlow Python パッケージリリース時にはもっと簡単なスクリプトになる予定です.

Tableau Prep で利用する

Tableau Prep 上で先程追加してスクリプトステップを選択して, スクリプトを開きます. 関数名にスクリプト内の関数名を書きます (今回の例では ff_predict).

実行してしばらく待つと結果が Tableau Prep に出力されます. ForecastFlow の予測はプライマリキーとそのカテゴリである確率を出力するので, 元データとプライマリキーで結合して利用します.

f:id:gri-blog:20191115120854p:plain
Tableau Prep 上の ForecastFlow 出力結果

f:id:gri-blog:20191115124213p:plain
結合してから CSV に出力したもの

結合すると上のような出力が得られます. 左側の列がワインのアルコール度数や酸性度などの入力特徴量で右側が ForecastFlow が予測したワインの品質が 3~8 である確率です.

実際の業務ではこの出力を使って確率の最も高いカテゴリを抽出してワインの品質予測としたり, 品質が高いと予測される特徴量の傾向を分析するなどの利用法が考えられます.

今後の予定

  • 12月の初めに今回紹介した ForecastFlow 推論の Tableau Prep 連携が利用できるようになります.
  • リリース後に詳しい手順を紹介します.

変更履歴

  • 2019年11月26日 名前の修正 Forecast Flow → ForecastFlow

gri.jp

セミナー講師としての心得

セミナー講師としての心得

データサイエンスの講師を務めはじめてから1年以上が経ちました。ここまで注力してきたこと、反省してきたことに基づいて、セミナー講師としての心得について思うことをまとめました。人間を、それも様々なタイプの人間を相手にする職です。そのため、成功マニュアルは存在するはずがなく、注意すべきことも実に多数多様です。その中でも今回は、以下の項目にフォーカスします。

1. 大切にされている感を与える
2. 「聴衆」ではなく「参加者」になっていただく
3. 「その場」と「お土産」の分別
4. 受講者が見たいキャラクタになりきる

1. 大切にされている感を与える

講師から見て大勢の受講者であるが、一人一人は、それなりの金額と大切な時間を割いて来ています。誰もがそれ相当の価値を得たい、つまり元を取りたいわけです。いただいた時間の範囲で全力を尽くすのは当たり前です。 私は、一人一人に、「特別扱いされている」「自分は主人公である」と感じさせたいです、レベル、背景、参加頻度 によらず。自分とこの人以外にいない空間を受講者の数だけ構築します。「あなたに伝わっているのか、あなたがどう思うか、私はとても気になります」を態度、目線、フォローの仕方で伝えること。

講師が自分に理解してもらうために熱心でいることを感じると、不思議なことに「自分がどれだけ理解・出来るようになったのかを思わず講師に知らせたくなる」現象がおきます。例えば受講後に、「今日の内容のうちこの部分が今まで理解していたのと少し違うとわかった」「ここはもう少し知りたかったなあ〜」などを私のところに述べに来ると嬉しいです。

大学教授にたまにあるパターンですが、講師が椅子に座ったままで、受講者と目を合わせずに原稿を棒読みしているなどもってのほかです。体力が許す限り、講座が2時間でも8時間でも、必ずずっと皆の前で立ってアクティブに話をし、たまには皆の間に歩き回って、一人一人の目を見て話すようにすると良いです。ボディランゲージを適切なシーンで用いることも効果的です。

2. 「聴衆」ではなく「参加者」になっていただく

眠くなる大学の講義のような、つまり講師が一方的に話す講義が世の中に溢れているのは悲しいです。前節と関連して、受講者は自分が主人公として講義に熱中していただくためには「参加すること」が最低限です。普段の一対一の会話だと、相手が一方的に話をする会話というのはお説教のようで、ストレスを感じることがあります。セミナーでは長時間動けずに椅子に座りっぱなしなので、なおさら苦痛でしょう。

では、どうやって参加していただくのでしょうか?受講者に問いかけをするのです。手を上げなくても指名して誘い出します。その際に、教えたことを覚えているか、だけではなく、例えば以下のような ..... ・「このことについて、あなたはどう思いましたか?」 ・「これはどうしてだと思いますか?」 ・「こういう経験って今までありましたか?」 ・「この概念をご自身の言葉で教えてください」 「自分の言葉に変換して他人に教えることができるか」= 本当に理解 ですから。

他社のデータサイエンススクールで講師を行う際には、現場演習の後にチームになってお互いに教え合う時間をたっぷりとります。これは大変素晴らしい制度だと思います。まさに自分の言葉で理解したこと、疑問に思うこと、困ったことを他者に伝えるチャンスです。自発的に言葉にすることで初めて考えがまとまります。

「その場」と「お土産」の分別

対面での研修は、一期一会の真剣勝負の場です。1. その場・その時間でなければ伝えることのできないこと と 2. 持ち帰って欲しい良いお土産、この2つをきちんと区別して、それぞれを大切にすべきです。

1.に関しては、その場で懸命に伝えては反応を拾ってはまた伝える、のように受講者との場を共有します。

  1. に関しては、「良いお土産になる!」と喜ばれるようなテキストを作るのには心血を注ぎます。話さえインパクトがあれば、テキストなんかどうせ誰も帰ってから使わない、ということは私は嘘だと思います。「誰も」のところが嘘です。一人でもそのテキストに頼って帰ってから一生懸命復習してくれるのであれば、その人のために作る価値があります。情報量が多すぎてノイズだらけだとも読むのはしんどいし、少なすぎるともちろん使えないので、「テキストを理解すればそれだけでも十分に学べた」ものが目標です。充実したテキストは、話を省けて、よりインパクトのある部分に絞れるようになるという役割もあります。また、ハンズオン演習の場合、途中で追いつけなくなった時に一瞬でもテキストを見返せば元の軌道に戻れる可能性があります。

世の中には、貴重なノウハウが流される心配して講義のレジュメを配布しない場合もあるります。受講者は帰社後の社内報告が求められるのでこれは非常に困ります。何も配らない、あるいはは項目表のようなアジェンダだけ配らないというのは、受講者を愚弄すると等しいです。どうしても拡散を避けたい部分がであれば、その部分を配布レジュメからカットすれば良いではないでしょうか。

受講者が見たいキャラクタになりきる

セミナー講師は常時人に見られるサービスです。講師は一刻ともこれを忘れてはいけません。俳優やタレントと変わりありません。従って、壇上に立つ時から、もっといえば、参加者の目がある会場に入った瞬間から、受講者が喜べるような人物になりきることが義務です。当然ながらデータサイエンスの講師は知識を伝えることが最重要ですが、同じコンテンツでも講師が見て不快感や退屈さを持つ相手だと受け入れにくいでしょう。

これは講師としての個性を潰す、と言っているのではないです。むしろ自分のキャラを生かして、他で見たことのないような新鮮な雰囲気の講師を目指して、相手を楽しませるように活用したいです。セミナー以外の時の自分の良い点は何かを考えて、(例えば、「笑顔が輝かしい」「人の目を見て話す」「会話上手」「面白いネタを多く持つ」など)それらを講義の場で活かします。同時に、普段人と接する時に失敗しがちなこと(例えば、「声が小さい」「ボソボソ話してしまう」「話すのが早い」など)も考えて、それらを克服することが、プロとしての当たり前です。意識をもって克服することに注力すべきです。

私自身は、気恥ずかしいですが、自分の講義の動画と録音を通勤中に聴きながら、明瞭に話せなかったとか、姿勢が悪いとか、欠点をピックアップしては次回の前に「注意点チェックリスト」に追加するようにしています。

少し話が逸れますが、講師が「自信満々」に話すのは必ずしも良いことか、について賛否両論です。ビジネス系の色が濃いセミナーだと、参加者は基本的に成功者の話を聞きに来ると思われます。一般的なビギナー向けのデータサイエンスのセミナーの場合は、私はどちらかというと比較的低姿勢でいながら受講者に親近感を感じさせたいです。「自分も受講後に勉強を頑張れば、せめて基礎的なことを他者に蛍雪できるくらいの基礎知識を入手できるのだ」というモチベーションを与えるためです。私は、自分は2年とちょっと前に転職してきた時には「データサイエンス」という分野が存在することさえ知らなかったとか、実は色々な専門書をきっちり読んだのではなく、ウェブ上の技術ブログから面白いと思ったことを実装して見たりして勉強してきたとか、の話をします。ただそれは過剰に謙る出はなく、堂々としながらも、親近感を感じさせる事実を提供するのです。

階級別データサイエンティストに求められるスキル

データサイエンティストのスキルレベルの定義

データサイエンティスト協会(DS協会)に設置されているスキル定義委員会では、 データサイエンティストに求められるスキルセットとそのスキルレベルを具体的に定義する活動に取り組んでおられます。 スキルレベルの定義の初版は2014年に発表され、2017年に第二版が公開されました。 データサイエンスはだいぶ世間に浸透してきたとはいえ、まだ細かなニュアンスまでは伝わっていないと感じることが多いので、 引き続き応援していきたいと思っています。

DS協会のスキルレベル定義書では、データサイエンティストを以下のように階級別に分けて、それぞれの階級で求められるスキル感を明示しています。

1. 見習いレベル
2. 独り立ちレベル
3. 棟梁レベル
4. 業界代表レベル

この記事では、日頃の業務を通して感じる各階級のスキルレベルを抽象的に書きます

スキル定義委員会の目的は「具体的にデータサイエンティストを定義する」ことにあります。 その分、当委員会が発表する内容は情報の粒度が細かく、また、専門用語もそれなりに登場するのもあって、 データサイエンスのビギナーが体系的に理解するのはハードルが高いように感じます。

そこで、この記事では日頃の案件やコミュニティ活動を通して気付いたことを抽象化し、 各階級のスキルレベルを説明してみたいと思います。 抽象化することで詳細は握りつぶしますが、全体の見通しは良くなると思います。

見習いレベルと独り立ちレベルの違い

データサイエンス業務の遂行には、ビジネス・数学・計算機の3つの分野の幅広い知識が求められます。 見習いレベルは、まだ正確な知識や効率的に作業を進めるノウハウが身についていない状態にあります。

見習いレベルの人がやりがちなのは、ゴールからの逆算ができずに闇雲に分析っぽい作業を延々としてしまうパターンです。 あまりデータ分析に明るくない方が見ると、難易度の高い大変な分析作業をしているように感じることもあるでしょうが、 ある程度の経験がある方からすると、見習い分析官の教育的な側面を無視するならば、何の価値もない無駄な作業を沢山しているように感じると思います。

一方、独り立ちレベルにある分析官は、見習いレベルの時に繰り返した手痛い失敗を活かし、ゴールになるべく最短経路で向かうマインドができています。 独り立ちレベルと見習いレベルの分析官の動き方を観察すると、その違いは情報のインプットの差にあると感じます。

・ 独り立ちレベルは実際に作業を進める前に、
  過去の類似案件のまとまった質・量の情報収集を高速に行い、分析してから作業を進める
・ 見習いレベルは与えられた情報のみを鵜呑みにし、ただ漫然と作業を進める

独り立ちレベルにランクアップできる分析官は、自分の専門領域のみならず様々な分野に興味関心が強く、日頃から熱心に世界の新しい情報を取り入れているようです。 その日々の積み重ねが正確な知識やノウハウの獲得につながっています。

独り立ちレベルと棟梁レベルの違い

独り立ちレベルと棟梁レベルの違いは、分析結果のアウトプットの質に差があるように感じています。

・ 独り立ちレベルの分析官は、「正しい」ことを伝えることに集中している
・ 棟梁レベルの分析官は、「役に立つ」ことを伝えることに集中している

これは、解決できる課題の価値の大きさに直結します。

価値の大きな課題とは、例えば「この会社をより良くしてほしい」や「この社会をより良くしてほしい」など、 抽象度が高い課題であることが多く、正しさを定義することがもはや不可能になってきます。

独り立ちレベルの分析官は、難易度や抽象度の高い要望を受けた時に、なぜそのプロジェクトが難しいかをアウトプットすることに終始してしまうので、 そこで歩みを止めてしまいます。

棟梁レベルにある分析官は、様々な角度から物事を見ることに長けており、課題設定を作り変えることがとても上手だと感じます。 AIのもつ可能性が(再)発見されたことで、マシーンとヒトの分業構造が急激に変化している現代では、 現実課題をAIが解きやすいように課題設計できる能力は非常に求められています。

棟梁レベルにランクアップできる分析官には、案件や他者とのコミュニケーションを円滑に進められる特徴がありますが、 専門的なサイエンスの知識の深さはもちろん、顧客目線・相手目線・客観目線で考えて行動するマインドが根付いていることが大きな要因のようです。

業界代表レベルと棟梁レベルの違い

業界代表レベルと棟梁レベルの違いは、外部に発信するアウトプットの量に差があるように感じます。

・ 棟梁レベルの分析官が他者に対してアウトプットする場は、主に案件を通したミーティングや報告会のみ
・ 業界代表レベルの分析官は、カンファレンスやシンポジウム、インターネットなどで積極的にアウトプットする

この活動量の差は、その分析官が中心のコミュニティが生成されるかどうかに直結します。 コミュニティには社会をガラッと変えるようなポテンシャルも秘めているため、 一人の分析官が与える影響が業界・社会単位に拡大していきます。

業界代表レベルにランクアップできる分析官は、業界を横断して幅広く分析しており、組織の運営能力も非常に長けているようです。 コミュニティのマネジメントが上手で、メンバ間に相互作用が発生するような働きかけや仕組み作りに多くの試行錯誤をしている印象です。

まとめ

まとめると、次のようになります。

1. 見習いレベルの分析官は発展途上
2. 独り立ちレベルの分析官は正確な知識やノウハウを身につけている
3. 棟梁レベルの分析官はビジネスに大きく貢献できる
4. 業界代表レベルの分析官は社会にインパクトを与えられる

DS協会のスキルレベルも概ね上記のような役割を果たす上で必要な項目を詳細化しているように思います。 数学の知識や計算処理スキルなどの専門的なスキルセットに目を向ける前に、 まずは各階級のデータサイエンティストに求められる大まかな役割を把握し、少しずつ整理していくのがオススメです。

あなたは何と呼んでますか?機械学習で頻出の関数・指標の枠組みについて

機械学習には用語がいっぱい

機械学習モデルの役割は、未知のデータに対する予測精度を最大化するように、既知のデータを利用してモデル内部のパラメータを最適化することです。 最適化するためには、理想と現実の距離を図るための指標や関数が必要です。 機械学習は最適化のお化けみたいなモデルも扱うので、関数も指標もたくさん出現し、ごちゃごちゃしてきます。

また、データサイエンス界隈は本質的に学際分野で、数学やら物理学やらコンピュータサイエンスやら経済学やら、 それぞれの分野での慣習的な呼び方があるので、色々な分野出身の人と会話していると、さらに混乱してきます。 GRIにも様々なバックグランドの人がいるので、たまに誤解する時があります。 議論の文脈を考えれば大方は伝えたいことは理解できるのですが、最近は統一感が欲しくなってきました。

このページに個人的な呼び方をまとめます

特に人によって色々な呼び方がされてると感じる項目に関して扱います。 フィードバックを頂いたりして随時アップデートする予定ですが、現時点での個人的な呼び方を整理しておこうと思います。

TL;DR

  • 最適化したい最終的な関数は目的関数(Objective Function)
  • 目的関数はコスト関数(Cost Function)正則化項(Regularization Term)に分解できる
  • コスト関数はデータ点ごとの誤差を表す損失関数をデータ全体に適用したもの
  • 識別モデルでいうAccuracyなどの指標、回帰モデルでいうR2などの指標は評価指標(Metrics)
  • 決定木のジニ不純度や情報利得は分割基準(Criteria)

目的関数とコスト関数と損失関数

それぞれの定義を、線形回帰モデルを例にして示します。 正則化項が付加された線形回帰モデルでは、最適化したい関数は以下のように記述します。

 J(\theta) = \sum_{n=1}^Nl_n(\theta) + L(\theta)

ここで、 \thetaはモデル内部のパラメータ(線形回帰係数)、 l_n(\theta)はn番目の正解データと予測値との距離を表す関数、 L(\theta)過学習を防ぐためにペナルティを課す正則化項を表します。

上式でいうとそれぞれ、

  • 目的関数:  J(\theta)
  • コスト関数:  \sum_{n=1}^Nl_n(\theta)
  • 損失関数:  l_n(\theta)

にカテゴライズされます。人によって特にバラつくのは以下のようなパターンです。

  • コスト関数と正則化項をまとめてコスト関数と定義
  • コスト関数と損失関数を同じものと定義(両方まとめて損失関数など)

ふわっとした議論の場合には気にならないのですが、モデルの性能が思ったより悪かった時など厳密に議論し始めると途端にミスコミュニケーションが発生するので、 少なくとも社内では各関数の言葉の定義に統一感を出したいと思っています。

評価指標

評価指標はモデルの精度をざっくりと直感的に示すのに利用されます。

識別モデルの場合では、

  • Accuracy
  • Precision
  • Recall
  • F1

が挙げられます。各指標ごとに、例えばAccuracyは正解率などの和名もありますが、その和名はどれも直感的にピンと来ないので、評価指標は英名を利用推奨派です。

また、回帰モデルの場合では、

  • R2
  • MSE
  • MAE

などが挙げられます。MSEなどは場合によってコスト関数にもなるので、どちらの文脈で使っているかがきちんと伝わると良いと思います。

【番外編】分割基準

GRIでは決定木ベースのモデルを利用することが多いので、決定木モデル特有の話題も書いておきます。 決定木は、ノードと呼ばれる単位にデータを分割し、葉と呼ばれる終端ノードで識別あるいは回帰モデルを走らせます。 データをうまく分割してやらないと、モデルの性能は期待できません。 「うまい分割のされ方」の指標として、識別モデルでは

  • Gini不純度
  • 情報利得

回帰モデルでは

などがよく利用されます。 これらの指標のことをメトリクスと呼ぶ人もいると思いますが、その場合はモデルの性能を示す評価指標と同じ名称になる可能性があるので、 「分割基準」「基準」「Criteria」などの言葉の方が間違いがないと考えています。

最後に

データサイエンスは色々な分野の人と議論できるので、とても楽しいです。 ただ、言葉の揺らぎも大きいなと感じます(マーケティング的な使われ方も含めて)。 正確な議論する時はお互い共通認識を持った言葉がベースになるので、みんな納得できる尤もらしい呼び方を模索していきたいです。

Jupyter notebookからGCPのBigQueryにアクセスしてPandasのDataFrameに読み込む方法

構造化された大量のデータをいつでも分析に使える形で持っておきたい!というケースでよく使うのが、Google Cloud Platform(GCP)のBigQuery(以下BQ)です。 標準SQL文と互換性があるので、普段からRDBを扱っている人にも無理なく使えると思います。*1

一方で、普段からPythonで開発しているばあい、Jupyter notebookから直接BQのデータを取得してからPandas等で加工するケースも多くあるかと思います。

JupyterからGCPリソースにアクセスするとなると認証などが厄介なのですが、

  • 認証ライブラリpydata-google-auth

を利用することで簡単にデータを取得できるようになるほか、

  • PythonGCPクライアント google-cloud-bigquery
  • Pandasの拡張ライブラリ Pandas-gbq

のいずれかを使うことで、PandasのDataFrameにも直接読み込むことができます。


pydata-google-authによる認証キーの発行

概要

まず、BigQueryに限らずクラウド上のアクセスするためには、通常認証キーが必要になります。 このキーをファイル形式で発行する方法もありますが、 外部への流出を気を付けなくてはいけませんし、 notebook上で開発するだけなら少々手間ですしリスクもあります。

そこで登場するのが、pydata-google-authというライブラリです。 これを使うと、ブラウザ上で簡単に認証を行うことができ、 さらにキーもnotebook上の変数として持つことができます。

方法

以下のようにnotebookのセルに打ち込んで実行してみてください。

import pydata_google_auth
credentials = pydata_google_auth.get_user_credentials(
    ['https://www.googleapis.com/auth/bigquery'],
)

すると、新たなブラウザが立ち上がり、自分のGoogleアカウント選択を求められます。 画面の指示に従っていけば認証キーが発行され、 変数credentialsの中に格納されます。

これを以下のGCPクライアントに渡すことで、選択したアカウントで許可されたリソースにアクセスできるようになります。


データ取得方法① GCPクライアントを使用する

概要

BQに限らず、GCPのリソースに対してはPythonから操作するためのSDK(Software Development Kit)が存在します。

サービスごとにライブラリが分かれていますが、BQの場合google-cloud-bigqueryを使います。

基本的には文字列でqueryを書いて、APIに引き渡す形になります。

方法

例えば、特定のテーブルから10行だけ取り出すqueryをBQに投げます。

from google.cloud import bigquery 

client = bigquery.Client(project='<project_id>', credentials=credentials)
query = 'SELECT * FROM <data set名>.<table名> LIMIT 10'
df_result = client.query(query).to_dataframe()

これだけです。 query実行後に.to_dataframe()メソッドを用いることで、PandasのDataFrameとして出力するところまでできてしまいます。

最初の行でアクセスしたいリソースを所持するGCP Projectを指定していますが、 この際に先ほど取得した認証キーcredentialsを入れているのが分かります。


データ取得方法② Pandasの拡張ライブラリを使用する

概要

GCPクライアントは、BQのみならずGCSなど他のGCPリソース向けのものも用意されています。 そういう意味で上記の方法は標準的なものと言えますが、 BQについてはPandasの拡張ライブラリを使って直接DataFrameに読み込む方法もあります。

方法

まず前提として、Pandas-gbqをインストールしておきます。

pip install pandas-gbq

そのうえで通常通りPandasをimportすると、read_gbq()メソッドが使えるようになります。 引数にはファイル名を指定する代わりに、

  • query文字列
  • project_id
  • credentialオブジェクト

などを入れます。

import pandas as pd

project_id = '<project_id>'
query = 'SELECT * FROM <data set名>.<table名> LIMIT 10'

df = pd.read_gbq(query, project_id, dialect='standard', credentials=credentials)

ここでも、先ほどpydata-google-authから取得したcredentialsオブジェクトを使います。

まとめ

pydata-google-authを使えば自身の持つGoogleアカウント情報と紐づいた認証キーをオブジェクトとして簡単に取得でき、 それをGCPクライアントやPandas拡張ライブラリに食わせるだけで簡単にBQのデータをDataFrameとして持つことができます。

今回はデータの取得だけしか解説しませんでしたが、データの挿入、テーブルの作成・削除などあらゆる操作を(権限がある限り)Pythonから行うことができます。

詳しくは下記の公式ドキュメントを参照してください。

参考

*1:ただし、予期せぬ大量アクセスによるBigQuery破産にはご注意!

Tableau PrepとR連携

Tableau Prep and R Integration

Tableau PrepとRが連携できると聞いて、ドキュメントを探したのですが、上手く見つからなかったのでベータ版のテストスクリプトを参考に設定してみました 特に実用性のあるテスト内容ではないですが、動作確認用です

事前準備

  1. Tableau Prep 2019.3以上をインストール
  2. Rをインストール(RStudioをインストールしておいた方が良い)
  3. R or RStudioでRServeライブラリをダウンロード
  4. R or RStudioでRServeを起動

RServeの起動

事前準備3までが終わっている前提で、下記のコマンドでRは外部からの受付を可能にします

library("Rserve")
Rserve()

シナリオ

数値データの(X列とY列)があるCSVファイル(test.csv)をPrepで読み込み、RにてX列とY列を加算してZ列を含んだデータフレームをPrepに戻す処理

f:id:gri-blog:20190919130250j:plain

Rスクリプトを書いておく

シナリオを満たすために、Rのコマンドファイル(futest.R)を作っておきます ここでは、こんなコマンドを書いてます

getOutputSchema <- function() { 
  return (data.frame( 
    x = prep_int(), 
    y = prep_int(), 
    z = prep_int())); 
} 

plus <- function(df){ 
  out <- df$x + df$y 
  return(data.frame(x=df$x, y=df$y, z=out)) 
} 

getOutputSchemaはRからの出力のスキーマとしてdata.frameをx, y, zを全てint型で返す感じです。 また、plusはprepからデータをdfとしてRで読み込み、xとyの列を足したものをoutというベクトルで持ち、データフレームでx, y, zで返す感じです。

PrepでRスクリプトを読み込む

f:id:gri-blog:20190919130943j:plain

Prepでtest.csvファイルを読み込み、+ボタンから「スクリプトの追加」を押します

f:id:gri-blog:20190919131108j:plain

何もしていない状態なので、戻り値としてのxとyは何も見えない状態

f:id:gri-blog:20190919131307j:plain

Rserveサーバに接続ボタンを押して、サーバーやポートの情報を記述して、サインインのボタンを押します Tableau Desktopのように接続テストボタンがないので、Tableau Desktopでテスト接続をしておくのおすすめです

f:id:gri-blog:20190919131551j:plain

「参照」ボタンからfutest.Rファイルを選択して、関数にplusと記述します すると計算がいきなり走り、z列とともに計算結果が表示されます

Tableau Prep and Python連携の例

lovedata.main.jp

www.tableau.com

vizpainter.com

人工知能の社会への波及効果に関する徒然なる考え

今回は、ディープラーニングを中心とした人工知能の現在と未来に関して書いてみました。技術中心の仕事に携わっているとどうしても分析手法やアルゴリズムばっかり考えています。ところで近頃、機械学習の研修を提供していく中で、営業担当・ビジネス企画担当の方々から、人工知能全般の枠組みやトレンドの解説を求められる頻度が高まってきています。そこで自ら調査した内容及び考えの整理も兼ねて、人工知能が社会にもたらすインパクトや世の中の代表的な疑問を中心に綴ってみました。最新動向を意識してディープラーニングに重みを置いた内容になります。

人工知能の枠組み

はじめに、基本に立ち返って、人工知能機械学習ディープラーニング(以下 DL)の関係性を整理しましょう。普段「データ分析」や「機械学習」の用語をよく使うけれど、曖昧性を伴う「人工知能」という用語を使用する機会が殆どないです。「人工知能」に厳密な定義はおそらくないです。専門家の間でも定義に食い違いがあり、東大の松尾豊准教授の 「人工的に作られた人間のような知能、ないしそれをつくる技術」に似た文言が多い一方、個人的に、阪大の浅田稔教授の「知能の定義が明確ではないので、人工知能を明確に定義できない」に感心しました。 広く人工知能と呼ばれるものを実現するための手法はルールベースと機械学習の2つに分類できます。前者はエキスパートシステム的な手法で、「条件Zが成立する中で情報Aが入ってきたときに、動作Bをさせる」のようなプログラムを人間が大量に予め作っておき、コンピュータは教え込まれたそれらのプログラムに従って答えを導きます。後者の機械学習はコンピュータが自ら大量のデータから知識を整理しルールを学習してモデルを作ります。この場合は「情報A入ってきたときには、正解はBだ」といったAとBのセットを大量にコンピュータに与えます。

では、DLはどこに位置するでしょうか?DLは機械学習の1種です。機械学習のうちの関数系モデルであるニューラルネットワークに属します(図1)。学習データが大量に使用可能かつ特徴量が均一な構造である条件のもとで高い精度を期待できるのが特徴です。従来の機械学習手法では、物事を分類する着眼点(=特徴量)を人間が与え、それらを軸にしてモデルを訓練させます。データサイエンティストの労力の大部分を占める特徴量の設計を依然として人間が行わなければいけないのがどこか皮肉に感じますね。DLの登場により、コンピュータは自ら特徴量をデータから見出せるようになりました。この「特徴表現の獲得」の峠を越えたことによって、これまでに積み重ねてきた人工知能の研究成果(ビッグデータ処理、ロボッティックス、言語処理など)が今までになく強いインパクトを社会に与えるようになりました。 最新の人工知能活用シーンを知る上では、とりわけDLの進歩を追うことは重要ですが、決してDLが機械学習手法のヒエラルキーの頂上にそびえ立っているわけではないです。このことをまず理解しておきましょう。例えば、同じ教師あり学習でも、決定木系モデルとDLの使い分けが明確です。決定木系モデルは、購買履歴などtabularデータを扱うのが得意です。特徴量設計の自由度が高く、予測問題・分類問題に相当幅広く使われます。また、処理過程を解釈しやすく、他人へ結果を説明がしやすいので施策に有用です。一方で、DLは画像・音声など複雑な特徴を有する非構造データを大量に扱う場合に威力を発揮します。一方で判断の根拠が不透明、つまり「ブラックボックス化」が難点です。理解は二の次でとにかく自動化と高い精度を叩き出したい場合にDLが採用されやすいです。

f:id:gri-blog:20190908191526p:plain
図1: 機械学習ディープラーニング

ディープラーニングの現在地と行先

DLの研究は数十年前から発足し、2000年に入ってから注目を浴び始め、そして近年は画像認識など特定の知的作業で人間の精度を超える地点まで到達しました。人工知能の実用レベル、適用の幅・可能性が膨らんだ背景には次のようなテクノロジーの進化があります。

  • インターネットやIoTの普及、ネットワークの低コスト化・高速化とともに、人工知能の材料となるビッグデータが生み出され、収集と蓄積がしやすくなりました。

  • ビッグデータの収納と分析するインフラが整備されてきました。例えば、GPUにより大量な並列積和演算のおかげで、ほぼ一番最初に画像認識に成功を納めた畳み込みニューラルネットワークAlexNetの学習時間は40日から6日に短縮されます。

  • アルゴリズム(計算の手法や手順)、つまり人工知能の「賢さ」が飛躍的に向上しました。

以下では人工知能の最先端を行くDLの進化を数段階で言及していきます:

  1. DLの活用例として最も広く知られているのは画像認識です。画像の特徴量は人間の直観では理解しづらく、DL以外の機械学習モデルに学習させるのも難しいです。DLの手法の1つである畳み込みニューラルネットワーク(CNN)で画像認識を行う場合、ある層で処理した結果を次の層への入力をするようにして階層的な処理を行います。浅い層では画像の小領域の明暗など具体的な特徴を、もっと中段ではエッジや形を、深い層では顔などの複雑な抽象的な特徴まで見出せるようになります。単独の層での処理は簡単な結果しか導き出せないけれど、処理を重ねるにつれて複雑な判断をできるようになります。画像認識精度の劇的な向上により、日常的に恩恵を受けている顔認識や手書き文字認識などの技術が実現され、自動運転アシスト技術、パーソナライズ広告、レントゲン・CTを元にした自動診断も期待されています。

  2. DLが次に目指すのはマルチモーダル化です。静止画像だけではなく、動画を含む時系列データ、音声、圧力などの複合的な観測データを組み合わせて処理できることです。人間の感情を認知し定型の相槌を打つペッパーが現存する一例です。もう一つの例は画像キャプションの自動生成であり、これにCNNとRNNを使い合わせたNeural Image Captionという技術が活躍します。RNNは過去の情報を記憶しその影響を次の動きに反映させる再帰的なネットワークで、自然言語処理や時系列データなど連続性のあるデータに使用されます。

  3. その次にあるのは、自分の行動とその結果を結びつけて抽象化する力、更に、連続的な試行錯誤を通じて現実世界から特徴を抽出する力です。これらを元に、プランニング、高度な状況認識、環境の変化(例外)に対するロバストさが期待されます。自動運転を例にとると、標識の認識や障害物検出などの個別のアシスト技術だけでは実用化に不十分であり、特に難しいと言われる周辺環境の認識、通行ルートを決めるpath planなど多方面のテクノロジーを組み合わせて初めて実現されます。物流におけるラストワンマイルをドローンやロボットでカバーする場合も同様です。 抽象化や因果関係を取り入れると「手を強く握ると痛いと言われる」や「コップを強くたたき付けると割れる」や「この表現を使うと相手が喜ぶ」のように人間らしい繊細な行動ができます。そうすると、医療・介護などの対人ロボットなど、「モノ」から「ヒト」へ実用化の対象が拡大されます。

  4. 次の課題は、ここまで述べてきた高度な概念に、記号とも解釈できる言語を結びつけること、およびその言語を通じて知識を自動的に吸収することです。自動翻訳が実用化されると、翻訳の資格取得や大学での外国語の勉強の重要度が下がり、他の学問に注力する余裕が現れます。旅行先ではガイドなしに安心に歩き回れます。言葉の壁が消えると企業の海外展開などグローバル化が進みます。そして、言語を通じて知識を自動的に吸収できれば、いよいよ人間への高度な補助を務めることが可能です。

社会へのインパク

人工知能の過去の潮流は、学術的な研究の進展、クイズ番組や将棋・囲碁に勝利するといった次元から、今では日常生活やビジネスシーンにも押し寄せてきています。ここまで飛躍的に発達した人工知能によって人間が征服されないのか、と脅かされているように感じる人もいます。人工知能の実用化は社会、産業、個人に顕著な変化をもたらすのはもう疑いの余地がないでしょう。ただ、人類を滅ぼすとかの次元違いの話ではなく、人工知能が人間の知能、創造性を引き立てる存在であるのが正しい考え方です。学習と判断というプロセスを初めて人間の組織から切り離した独立なものとして捉え、それを必要とするところに自由に配置可能になります。それによって人間の生き方や個性がより重視されるより生産的で効率的な社会の仕組みが実現されます。

ついでに、人間と機械学習のそれぞれの強みも整理しましょう。機械と人間の能力は全く異質であり、特定の基準で優劣を決めてはいけません。機械の強みは、作業の正確性・規則性、論理性(← チェスなどの知的作業に強い)、集中力、主観・感情・先入観に左右されない点です。人間の強みの根本にあるのは「直観」です。必ずしも推理・論理を通過することなく、積み重ねてきた学習や経験を通して物事の本質を捉え、柔軟な意思決定を行います。

残る職業・消える職業

もう一つよく聞く疑問は、色々な職業が消えるのではないか、です。人工知能の発達に伴い消えてしまう職業もあれば、依然として残る仕事もあります。消える職業に代わって新しい仕事が必ず生まれます。大昔からでも耕作は昔全て人手で行われていたのが、そのうち人間は耕作機器を活用・作る仕事に専念するようになりました。

残る職業は大きく分けて2つあると考えられています。1つは「過去事例の数が乏しく、難しい判断を伴う仕事」、例えば経営者や新規事業開発者です。この場合は、積み上げてきた少々異なる経験を転移して学習すること、多方面からの情報を加味した上で物事を判断することが必要です。もう一つは、「人間に接するインターフェースが重要視される仕事」です。人間は同じ人間と接した方が快く感じる、もしくは説得されやすいサービス、例えばセラピスト、リハビリ専門家、カウンセラーなどは当面は機械に置き換えられる確率が比較的低いでしょう。弁護士の仕事において、情報を整理し過去事例を調査する上で人工知能の効率を活かせるが、家庭裁判など情緒的な要素が強いものだと、機械に「法廷で勝つ確率は20%」と告げられるよりも、弁護士の顔を見て会話した方が納得しやすいでしょう。現在はデータの収集や分析のスキルを身につけることが重要視されているが、それらもいずれ自動化すると、長いスパンで見るとむしろ人間対人間に特化した仕事の方が最後には価値が高くなるのでしょうか?一方で、ルーティング化しやすい単純な事務作業は人工知能に置き換えられやすいです。既に部分的に人工知能が導入されているものもあります。

ちなみにOxford大学の論文”The Future of Employment: How Susceptible are Jobs to Computerisation” では、702個の職業を「手先の器用さ」「芸術的な能力」「交渉力」「説得力」など9つの軸で分解し、その中で消える職業の上位に、電話販売員、不動産登記の審査・調査、コンピュータを使ったデータの収集・加工・分析、銀行の窓口係、荷物の発想係、スポーツの審判が含まれています。一方で、残る職業の乗員には、レクリエーション療法士、危機管理責任者、ソーシャルワーカー、聴覚訓練士で、心理学者、小学校教師などが含まれます。結局社会全体で見た時に、人間が果たすべき役割と、コンピュータが果たすべき役割の区別を意識しながら両者を連携させることが理想ではないでしょうか。

最後に…

前段で議論した人工知能の技術が全て達するのは2030年頃と見込まれていますが、これはあくまでもR&Dのスピードです。社会に抵抗なく浸透させるまでには様々な障壁と不確定性を伴います。例えば、医療や防犯などは支持を得られやすい分野ではある一方、普及までにプライバシーや判断における責任などの問題を解決する必要があります。自動翻訳の精度向上によって言葉の壁がなくなれば、世界情勢に必ずしも良い影響が出るとは限りません。相手が我が国の言葉を努力して学んで片言でも話してくれるのは大変喜ばれることが、国際的な前職で実感しました。その喜びを機械学習の利便性で置き換えられません。

人工知能技術を日本の社会に浸透させる上での課題として、ビッグデータの利用に関して警戒心が非常に強いこと、ビッグデータ人工知能の活用に関する法的体制の整備が遅れていること、日本特有の「ものづくり優先の思想」、そして人材の不足です。人材不足にアプローチしたく、GRIで研修教育事業が発足していますビッグデータを活用しようとする企業を料理店に例えるならば、ビジネスの成果は料理、データは素材、企画力はメニュー、データ活用人材はシェフに例えられます。優秀なシェフと魅力的なメニューと上質な素材が揃って初めて料理店が繁盛します。国内ではデータサイエンスを社会実装できる人材が著しく不足しており、その育成も進んでいません。これはシェフのいない料理店を経営すると同じくらい無謀です。米国や中国がAI研究開発の世界的な拠点となりつつ中で、日本のデータ人材不足をこのまま放置しては危険です。したがって、今こそデータ人材の育成が急がれる時代と思われます。