セミナー「ディープラニング活用の理想と現実」を聞いてきた

JDLAのコミュニティー枠で、参加できることになったので話を聞いてきた。概要は「セミナー「ディープラーニング活用の理想と現実」を参照。

ディープラーニング国内35事例を一気に紹介

ディープラーニング活用の教科書」にまとめられた35事例を動画を交えて紹介。ディープラーニングが汎用目的技術となるか?と〆ていた。

ディープラーニング活用の教科書

ディープラーニング活用の教科書

(事例講演)AIを活用したタクシー需要予測モデル

新人ドライバーは客がいるエリアを知らないし、ベテランドライバーは土地勘がないところは避けてしまうからどちらにしても効率化の余地があるのではないかという問題にアプローチした講演。Docomoが持っているモバイルの位置情報から推定する人口分布やタクシーの乗車情報について傾向分析。天候などのデータも加え、そこからStacked Denoising Autoencoderでモデルを作成。誤差2割までを「予測できた」と判定し、多変量解析での結果と合わせて93%程度の精度を実現したそうだ。訓練データは半年分、検証データは2週間分。乗車率、売上の向上が確認できたらしい。合わせてシェアリング自転車の再配置レコメンデーションを行ったとのこと。

ディープラーニング活用の障壁と解決

FiNCの事業紹介後、講演者3人で対談。

時系列解析でおおよそOKな予測はできるが、ディープラーニングを用いしっかりチューニングしてさらに(数%)精度を上げる。たかが数%だとしても母数が大きいので影響は非常に大きい。ただし、魔法ではないので何でもできるわけではない。

FiNCはアプリを利用してもらわないと必要なデータが集まらない。このため土台となるアプリの開発に割いた時間は多いとのこと。データセットアノテーションの作成は大変でインターネットで集まる画像はきれいにまとまってることが多くユーザーがアプリ利用時にとる画像との差が大きく使えないことがある。姿勢判定のデータはFiNCが展開してるジムで収集した。料理のカテゴリ選定は大まかに決めてから少しずつ細かくしていった。検索上位200件みたいな決め方をすると細分化するときにまた作り直しになるので手間がかかり続ける。

どのレくらいの完成度で世の中に出すかは、AIタクシーの場合は実証実験で収益性の確認を行ってから。プロジェクト期間はトライアルにこぎつくまでに1年、さらにそこから1年半。NTTドコモの中では早い方らしい。FiNCではアプリを作ってから社内で評価、(あまり怒らず理解のある)βユーザーに公開していった。データ収集が命なので、中途半端なものを出して利用者が減るとモデルを育てられなくなる恐れがある。姿勢アプリは半年、食事アプリについては競合も多く1年かかっている。アプリストアの評価やTwitterの反応は大事にしていて、「優しいユーザー」はCRMでこそっと教えてくれることもある。期待値の調整は非常に大事で、ユーザーを怒らせない出し方は重要。タクシードライバーの中にはAIに対してネガティブな反応を持つ方もいて、協力してくれるドライバーの存在は大事。

開発チームの体制は、AIタクシーの場合は研究者とビジネス面・個人情報リスク等でのサポートメンバーの2チーム体制。少員数で、コミュニケーションコストを小さくし、開発スピード向上に寄与。FiNCも似ていて、JDLAのG検定とE資格満たない感じ。AI関連エンジニアは1プロジェクトに一人はつける。ビジネス面でDL適用分野識別できる人材は非常に貴重。ROI計測でき、予算感覚をもち、予見をまとめられる人。そういった面で技術者と会話できる人がないと技術者がスキルアップする時間がなくなってしまう。技術者からビジネスサイドに移る人はいるが希少。だからG受けて知識をつけてほしい、らしい。

GCIデータサイエンス講座 Chapter3 メモ

統計解析の種類

統計解析とは、データを客観的に分析し、そのデータに含まれる傾向を明らかにすること。大きく分けて記述統計と推論統計別れる

記述統計

集めたデータの特徴を掴んだりわかりやすく分類したり見やすくしたりする方法。

推論統計

集めたデータから推論する方法。部分的なデータしか無いものから活率分布に基づいたモデルを用いて精密な解析をし、全体を推論して統計を求める。

サンプルデータ観察

http://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip

student_data_math = pd.read_csv("student-mat.csv", sep=";")
student_data_math.head() # 先頭をのぞく
?pd.read_csv # 引数確認
student_data_math.info() # すべての列の情報などをチェック

student.txtにデータ属性説明あり

量的データと質的データ

量的データ

四則演算可能な連続値で表現されるデータ、比率に意味がある。

質的データ

四則演算適用不可で不連続なデータ、状態を表現するために利用される。順位、カテゴリ

・性別を軸にして年齢の平均値

student_data_math.groupby('sex')['age'].mean()

・性別を軸にしてアルコール摂取量の比較(男性の方が多く飲む?)

student_data_math.groupby('sex')['Dalc'].mean()
student_data_math.groupby('sex')['Walc'].mean()

記述統計

ヒストグラム

ある属性に着目して、その中のそれぞれの値が一体どのくらいあるかを観察する

plt.hist(student_data_math['absense'])
plt.ylabel('count')
plt.xlabel('absense')
plt.grid(True)

-> 0-10が多く一方 70以上も見て取れる(右に歪みのある分布)

平均値、中央値、最瀕値

student_data_math['absense'].mean()    # 平均値
student_data_math['absense'].median() # 中央値
student_data_math['absense'].mode()    # 最瀕値

平均値:\overline{x}=\frac{1}{n}\sum_{i=1}^{n}x_i

分散と標準偏差

分散:\sigma^{2}=\frac{1}{n}\sum_{i=1}^{n}(x_i-\overline{x})^{2}

sutudent_data_math['absense'].var()

標準偏差\sigma=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(x_i-\overline{x})^{2}}

student_data_math['absense'].std()

標準偏差は単位の次元が実際のデータと同じなのでばらつきが具合がわかる

要約統計量とパーセンタイル値

student_data_math['absense'].describe()

pandasで読み込んだDataFrameのdescribe()でこれまでの統計量をまとめて確認可(データ数、平均値、標準偏差、最小値、25, 50, 75パーセンタイル値、最大値)。50パーセンタイル値は中央値と同等。25パーセンタイル値は第1四分位点、75パーセンタイル値は第3四分位点という。

四分位範囲

75%タイル - 25%タイルの差

student_data_math['absense'].describe(6) - student_data_math['absense'].desceibe(4)

箱ひげ図

plot.boxplot(student_data_math['G1']) # 第1期の成績箱ひげ図
plt.grid(True)

箱状底が第3四分位点、箱下底が第1四分位点、箱真ん中の線が中央値、ひげ上端が最大値、ひげ下端が最小値。外れ値(異常値)は省かれて描画される。

変動係数

student_data_math['absense'].std() / student_data_math['absense'].mean()

標準偏差を平均値で割った値: \displaystyle CV=\frac{\sigma}{\overline{x}} 異なる値同士の比較でもすケーズに依存せずに比較できるようになる(日経平均の偏差とドル円の偏差を直接比べても意味がない)。属性名指定(上記例だと['absense'])をなくすと全属性について変動係数を計算できる。

散布図と相関係数

散布図

ある属性をX軸、ある属性をY軸にとってプロット

plt.plot(student_data_math['G1'], student_data_math['G3'], 'o')
plt.ylabel('G3 grade')
plt.xlabel('G1 grade')
plt.grid(True)

共分散

\displaystyle S=\frac{1}{n}\sum_{i=1}^{n}(x_i-\overline{x})(y_i-\overline{y}) 2組の対応するデータ間での 平均からの偏差 の積に関する平均値。2変数以上の分散を考えるときに使う。各変数のスケールや単位に依存。

np.cov(student_data_math['G1'], student_data_math['G3'])  # 共分散行列

相関係数

共分散のようなスケールの影響をうけずに2つの変数の関係を数値化するのが相関係数。共分散をそれぞれの標準偏差で割ったもの。 \displaystyle r=\frac{\sum_{i=1}^{n}(x_i-\overline{x})(y_i-\overline{y})}{d_x d_y},

d_x=\sqrt{\sum_{i=1}^{n}(x_i-\overline{x})},

d_y=\sqrt{\sum_{i=1}^{n}(y_i-\overline{y})}

[-1, 1]の値を取り、1近ければ近いほど正の相関、−1に近ければ近いほど負の相関、0に近い場合は無相関という。

sp.stats.pearsonr(student_data_math['G1'], student_data_math['G3'])  # scipyのピアソン関数
np.corrcoef([student_data_math['G1'], student_data_math['G3'])  # 相関行列

因果関係は表現できず、これを把握したい場合は実験計画法というアプローチを用いる。

すべての変数のヒストグラムや散布図を書く

seabornパッケージのpairplotを使う。

sns.pairplot(student_data_math[['Dalc', 'Walc', 'G1', 'G3']])
plt.grid(True)
#週末にアルコールを飲む人の1期目の成績の平均
student_data_math.groupby('Walc')['G1'].mean()

今後機械学習のライブラリ等を使ってかんたんに機械学習の計算ができることが紹介されるが、このような基本的な統計量を見ていくことも大事。

練習問題

student_por.csvの要約統計量表示 student_data_mathとstudent_data_porの所定キー(on)でのマージ・suffixを指定してmath, porを区別する マージ済みデータに対してヒストグラム表示、人毎にmath, porの比較

単回帰分析

写経も兼ねてnotebookへ移行 Chair_for_Global_Consumer_Intelligence_Data_Science_Online_Course/Chapter3_note.ipynb at master · ihiroky/Chair_for_Global_Consumer_Intelligence_Data_Science_Online_Course · GitHub

ローレンツ曲線あってる?

Specialization Completion Challenge

f:id:ihiroky:20181114084931p:image

 

先日、[Coursera Google CloudのSpecialization](https://www.coursera.org/courses?query=google%20cloud%20platform) の一講座を修了した。その修了証へのリンクを所定のサイトに貼り付けておくとGoogle CloudのTシャツもらえるというキャンペーンをやっていた。で、リンク貼っておいたら今朝方案内が来ていたので申し込み。アメリカから発送されるとのことだけどいつ到着するのかしら。

ニューラルネットワークの特徴表現学習をTensorFlow Playgroundで垣間みる

ニューラルネットワークが特徴を学習する様子が、Machine Learning with TensorFlow on Google Cloud Platform Specializationで紹介されていた。

まずは入力x1, x2を用いて直線で分類する。 f:id:ihiroky:20181113223316p:plain

円形のデータセットに対して入力x1, x2を用いると直線では分類できない f:id:ihiroky:20181113223429p:plain

ここで、入力をx1 * x1, x2 * x2に変更してみると、円を描けるようになるので分類できるようになる。これは特徴を事前に設計しておく例。 f:id:ihiroky:20181113224434p:plain

でもニューラルネットワークを用いると事前に特徴を設計しなくともそれ自体が特徴を学習し分類できるようになる。特徴表現学習の例。 f:id:ihiroky:20181113225536p:plain

同じようにうずまき型のデータセットに対してもニューロンと層をガッツリ増やせば時間はかかるが分類できるようになることが視覚的に理解できる。トイプロブレムだけど特徴表現学習を垣間見れる面白いサンプルだと思う。

GCIデータサイエンス講座 Chapter2 メモ

科学計算、データ加工、グラフ描画ライブラリの使い方の基礎

  • Numpy:基本的な配列処理や数値計算をするライブラリ。高度で複雑な計算ができるほか、Pythonの通常の計算に比べて処理速度が速い。さまざまなところで使われており、データ分析で使うのに基本中の基本とも言えるライブラリ
  • Scipy:Numpyをさらに機能強化するライブラリ。統計や信号計算ができる
  • Pandas: データフレーム形式で様々なデータを加工するためのライブラリ
  • Matplotlib: データをグラフ化するためのライブラリ

ライブラリの読み込み

モジュール、機能を import, from で利用できるようにする

マジックコマンド:Jupyter Notebookからライブラリの設定を行える機能。 標準のマジックコマンド(ビルドインマジックコマンド)は %quickref を実行すると表示される。

Numpyの基礎

配列

データ型(int, uint, float, bool)。データ型を調べるには 変数.dtype

. まで打ってタブキーを押すと補完が聞くので便利

配列の次元(変数.ndim)、要素数(変数.size)

配列に対してスカラ値加減乗除累乗等を行うと要素全体に適用される

ソート:変数.sort()(昇順。変数が指す配列の要素がソートされる(順序変更される))。降順は 変数[::-1].sort()

最大:.max()、最小:.min()、合計:.sum()、積み上げ:.cumsum()( np.array([1,2,3]).cumsum() => array([1, 3, 6]))、積み上げ割合:.cumsum() / .sum()

乱数

シード、種類によって色々ある Random sampling (numpy)

%timeit 式 で式の計算時間を測れる

行列

arange、reshape、スライス、積(np.dot())、np.zeros(), np.ones()

練習問題

1から50の和をforを使わずnumpyで求める

素数10の配列を乱数を発生させて作り、最小値、最大値、合計値を求める

5x5、全要素3の行列を作り、各要素を2乗する

SciPyの基礎

# Scipyのライブラリ
import scipy as sp

# 線形代数用のライブラリ
import scipy.linalg as linalg

# 最適化計算(最小値)用の関数
from scipy.optimize import minimize_scalar

行列計算

行列式:linalg.det()、逆行列 linalg.inv()、固有値固有ベクトル:val, vec = linalg.eig()

ニュートン法

from scipy.optimize import newton
print(newton(sample_function,0))  # sample_function(x) == 0 となる x を求める

minimize_scalar関数の紹介

練習問題

行列式計算、固有値固有ベクトル計算、3次元方程式を解く

Pandasの基礎

Series: numpyの配列 (.value) +インデックス(.index)、インデックスは Series の引数indexで任意の値(文字列とか)に変更可能(配列指定)

DataFrame: 2次元の配列。インデックス値は Series と同様

# キー毎に列になる、1番目の要素が1行目、2番目の要素が2行目、...
attri_data1 = {'ID':['100','101','102','103','104'],
               'City':['Tokyo','Osaka','Kyoto','Hokkaido','Tokyo'],
               'Birth_year':[1990,1989,1992,1997,1982],
               'Name':['Hiroshi','Akiko','Yuki','Satoru','Steve']}

df1 = DataFrame(attri_data1)

Series, DataFrameはJupyter Notebook上で評価すると罫線がかかった表で表示される

転置:df1.T

1列取り出し:df1.Birth_year

複数列取り出し:df1[['ID', 'Birth_year']]

列CityがTokyoである行の抽出:df1[df1.City == 'Tokyo']

列CityがTokyoまたはOsakaである行を抽出:df1[df1.City.isin('Tokyo', 'Osaka')]

列削除(複数可)df1.drop(['City'], axis=1)

行削除(複数可):df1.drop([0,1], axis=0)

マージ(同じキーがあればそこで内部結合):pandas.merge(df1, df2)

集計(groupby()で指定した項目毎に集計 性別毎に数学の平均点を集計):df1.groupby('Sex')['Math'].mean()

ソート(インデックス):df1.sort_index()

ソート(値):df1.Birth_year.sort_values()

表全体指定値検索:df1.isin(['Tokyo'])

表全体nan検索:df1.isnull() (nanの数を数えたいときは df1.isnull().sum()

練習問題

行の絞り込み、groupby()、merge()

Matplotlibの基礎

# matplotlib と seabornの読み込み
# seabornはきれいに図示できる
import matplotlib as mpl
import seaborn as sns

# pyplotにはpltの別名で実行できるようにする
import matplotlib.pyplot as plt

# Jupyter Notebook上でグラフを表示させるために必要なマジックコマンド
%matplotlib inline

散布図

plt.plot(x, y, 'o') もしくは plt.scatter(x, y)

グラフの分割

# 2行1列のグラフの1つ目
plt.subplot(2,1,1)
...
plt.plot(x, y) 

# 2行1列のグラフの2つ目
plt.subplot(2,1,2)
...
plt.plot(x, 7) 

関数グラフの描画

plt.plot(x, y) の y を x の関数に置き換える

ヒストグラム

plt.hist(配列、bins=..., range=...) 

binsでビンの個数、rangeで範囲。help(plt.hist)で詳細表示。

コラム:d3js 紹介

練習問題

5x - 3のグラフ、cos(x)、一様乱数のヒストグラム表示

総合問題

モンテカルロ法で円周率の近似値を求める

GCIデータサイエンス講座 Chapter1 メモ

python知っていれば後半はスキップ可な感じ

本書の概要とPythonの基礎

  • データサイエンティストの仕事を例にとってデータ分析を考える

  • データサイエンティスト

ビジネスの課題に対して、統計や機械学習(数学)とプログラミング(IT)スキルを使って、解決する人と定義

  • データ分析の流れ

ビジネスデータを分析するプロジェクトでは、そのビジネス理解、データ理解、データ加工、処理、モデリング、検証、運用という流れで進めていくのが一般的

データ分析の現場で大事になるのは、ビジネス理解やその目的を明確化し、PDCAサイクルの流れ(データ分析のプロセス)を創ることです。

  • 講座構成

    • 1 - 4章 データ分析の基礎知識

      python, jupyter notebook

      科学計算・統計ライブラリ numpy, scipy, pandas matplotlib

    • 5-7章 エンジニア力をつける

      numpy, scipy, pandasを使ったテクニック

      データの可視化(matplotlib)

      Pythonのデータ分析前の処理や加工の基礎を身に付け、総合問題でそれらの手法を活用

    • 8-10章

      機械学習 教師あり/教師なし/モデリング・チューニング

    • 11,12章

      python高速化、深層学習入門, spark

様々なデータに対して(データ分析を?)実装できるために、自分で考えながら手を動かして学ぶことが大事

pyhtonの基礎

  • Jupyter Notebookの使い方

    作業効率化のためにNotebookのショートカットを使いこなそう

    Escで編集状態を抜けて b でセル追加等

  • 予約語

 __import__('keyword').kwlist

  • 組み込みオブジェクト

    dir(__builtins__)

  • リスト型、辞書型

  • 条件分岐・ループ

  • 関数  

    • 練習問題 文字列を1文字ずつ表示、1から50までの和
  • クラスとインスタンス

  • 総合問題