めも

ゲームの攻略・プログラミングの勉強内容・読んだ本の感想のような雑記を主に投稿するブログです

pandas.DataFrameの特定の列に対する操作の確認

この記事は何

pandas.DataFrameに含まれる特定の列(pandas.Series形式のデータ)に対して統計計算・前処理を行うときの方法を確認した際のメモ。全てpandas.Seriesのドキュメントに記載されている内容を参考にしています。

また、以下のページにも参照してください。

全般

python3.8.5を使用してます、この記事で使用するデータをscikit-learnから読み込みます。 この記事ではnumpy・pandas・scikit-learnのみ使用します。

import numpy as np
import pandas as pd
from sklearn import datasets

boston = datasets.load_boston()
X = pd.DataFrame(boston['data'])
y = pd.DataFrame(boston['target'])
X.columns = [ f"feature_{i}" for i, _ in enumerate(X.columns) ]
features = X.columns

X.head()

データ型・データ数・カラム名を取得する

feature = X["feature_0"]
dtype = feature.dtype
dnum = feature.size
name = feature.name

print(f"dtype={dtype}, dnum={dnum}, name={name}")

出力:

dtype=float64, dnum=506, name=feature_0

欠損の有無を確認する

hasnan・emptyで欠損があるか・完全に欠損しているかのフラグを取得できる。

feature = X["feature_0"]
ishasnan = feature.hasnans
isempty = feature.empty

print(f"ishasnan={ishasnan}, isempty={isempty}")

出力:

ishasnan=False, isempty=False

列に含まれる値に指定した式を適用する

列に含まれる値一つ一つに、指定した式を適用する。

https://yuru-d.com/series-apply-lambda/

オブジェクト型となっているカラムのデータを変換する

データ読み込み時に文字列データが含まれているとほとんどがintで合ってもObject型となってしまう。このような場合、Intしか含まれない行を選択したあとでconvert_dtypesを実行することでデータ型を変換できる。特定のデータ型に変換する場合に対してもメソッドが用意されているので上記ドキュメントを参照する。

feature = X["feature_1"][:10]
print(feature.convert_dtypes())
print("========")

feature = X["feature_1"][:5]
print(feature.convert_dtypes())
print("========")

X["feature_1"]の上位5行には整数しか含まれていないため、convert_dtypes()した結果Intに変換される。

0    18.0
1     0.0
2     0.0
3     0.0
4     0.0
5     0.0
6    12.5
7    12.5
8    12.5
9    12.5
Name: feature_1, dtype: Float64
========
0    18
1     0
2     0
3     0
4     0
Name: feature_1, dtype: Int64
========

指定した行・列のデータを抽出する

  • Series.at:指定したlabelに合致したただ一つの値を返す
  • Series.iloc:インデックスを指定して、値の集まりを返す
  • DataFrame.loc:指定したlabelに合致した値の集まりを返す
  • DataFrame.iat:行/列の位置を整数で指定して、ただ一つの値を取得する
  • DataFrame.iloc:行/列のインデックスを指定して、値の集まりを返す
  • DataFrame.xs:pandas.DataFrame.xs — pandas 1.4.1 documentation

ラベル名の正規表現でフィルターする場合はfilterを使用する: pandas.Series.filter — pandas 1.4.1 documentation

マークダウン・Latex形式で出力する

ドキュメントなどを記述する時に稀に使用する便利機能。tabulateというライブラリに依存しているのでto_markdownを使用する場合はインストールする。

print(X["feature_1"].to_markdown(tablefmt="grid"))

出力:

+-----+-------------+
|  52 |        21   |
+-----+-------------+
|  53 |        21   |
+-----+-------------+
|  54 |        75   |
+-----+-------------+
|  55 |        90   |
+-----+-------------+
|  56 |        85   |
+-----+-------------+
|  57 |       100   |
+-----+-------------+

特定データに対する操作

数値データ

pandas.Seriesの要素同士の足し算・引き算・比較をする

addsubgt(greater than)等のメソッドが用意されている。欠損値の扱いは fill_value パラメータで指定する。feature_1列とfeature_2列を要素ごとに足し算してみる。

X["feature_1"].add(X["feature_2"])

出力:

1       7.07
2       7.07
3       2.18
4       2.18
       ...  
501    11.93
502    11.93
503    11.93
504    11.93
505    11.93
Length: 506, dtype: float64

そして、特定の区間内の数値かどうかを判定するには pandas.Series.between を使用する。

指定した列の平均や中央値などの統計をまとめて計算する

Function to use for aggregating the data. If a function, must either work when passed a Series or when passed to Series.apply. (引用元:pandas.Series.aggregate — pandas 1.4.1 documentation)

funcにリストに対する集計を行うような関数を複数渡すと、それぞれに対して計算を行う。 あらかじめ良く使う関数を定義しておき、aggregateでまとめて計算するように使うと便利。以下の例では最小・最大・平均・中央値・列に1が含まれるかどうかを計算。

feature = X["feature_0"]
feature.agg([min, max, np.mean, np.median, lambda s: 1.0 in s])

出力:

min          0.00632
max          88.9762
mean        3.613524
median       0.25651
<lambda>        True
Name: feature_0, dtype: object

集計ではなく、個別の値ごとに変換を適用したいときは transformを使う。

特定の列に対して指定のウィンドウ幅の移動平均を計算する

時系列順に並んだデータに対する補完などに用いることがある。以下の例では2つ・3つのウィンドウ幅ごとに合計と平均を計算する。

sample = pd.DataFrame({'A': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})

print("====")
print(sample.rolling(2).sum().T)
print("====")
print(sample.rolling(3).sum().T)
print("====")
print(sample.rolling(2).mean().T)
print("====")
print(sample.rolling(3).mean().T)

出力:

====
   0    1    2    3    4    5     6     7     8     9     10
A NaN  1.0  3.0  5.0  7.0  9.0  11.0  13.0  15.0  17.0  19.0
====
   0   1    2    3    4     5     6     7     8     9     10
A NaN NaN  3.0  6.0  9.0  12.0  15.0  18.0  21.0  24.0  27.0
====
   0    1    2    3    4    5    6    7    8    9    10
A NaN  0.5  1.5  2.5  3.5  4.5  5.5  6.5  7.5  8.5  9.5
====
   0   1    2    3    4    5    6    7    8    9    10
A NaN NaN  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0  9.0

特定の列の指定の分位点の値を計算する

分位点をリストで渡すと、それぞれの点での値が求まり便利。

feature = X["feature_0"]
feature.quantile([.1, .25, .5, .75, .9])

出力:

0.10     0.038195
0.25     0.082045
0.50     0.256510
0.75     3.677083
0.90    10.753000
Name: feature_0, dtype: float64

カテゴリ変数・文字列

文字列に対する操作はpandas.Series.str に用意されている。


以下のfetch_openmlを用いてopenml上のデータをダウンロードして試します。

sklearn.datasets.fetch_openml — scikit-learn 1.0.2 documentation

openmlにてsearchからデータセット名を検索+データセット名 or データセットに紐づいたIDを指定することでデータをダウンロードできます。

この章ではカテゴリ変数を含んだデータとして https://www.openml.org/d/6332 のデータを使用します。

from sklearn.datasets import fetch_openml

X_categ, y_categ = fetch_openml(data_id=6332, return_X_y=True)
X_categ = pd.DataFrame(X_categ)
X_categ["target"] = pd.Series(y_categ)

id6332のヘッダー

カテゴリ変数の出現回数

使う機会が多い、カテゴリごとの出現回数は value_count で一度に行える。

feature = X_categ["customer"]
unique = feature.unique()
nunique = feature.nunique()
count = feature.count()
value_count = feature.value_counts()

print(f"> ユニークなカテゴリ:unique={unique}")
print(f"> ユニークなカテゴリ数:nunique={nunique}")
print(f"> 欠損していない値の数:count={count}")
print(f"> カテゴリごとの出現回数:value_count={value_count}")

出力:

> ユニークなカテゴリ:unique=['tvguide', 'modmat', 'massey', 'kmart', 'roses', ..., 'cvs', 'venture', 'jfk', 'colorfulimage', 'best']
Length: 71
Categories (71, object): ['tvguide', 'modmat', 'massey', 'kmart', ..., 'venture', 'jfk', 'colorfulimage', 'best']
> ユニークなカテゴリ数:nunique=71
> 欠損していない値の数:count=540
> カテゴリごとの出現回数:value_count=kmart            67
modmat           64
target           41
tvguide          38
wards            33
                 ..
global            1
galls             1
colorfulimage     1
adco              1
1910              0
Name: customer, Length: 72, dtype: int64

カテゴリ変数の置換

tvguideREPLACEDに置換する。

regex: bool, default True

Determines if assumes the passed-in pattern is a regular expression

regrexパラメータがTrueの時は、正規表現にマッチした文字列を置換する。デフォルトではTrue。

feature = X_categ["customer"]
print("=====")
print(feature)
print("=====")
print(feature.str.replace("tvguide", "REPLACED"))

出力:

=====
0    tvguide
1    tvguide
2     modmat
3     massey
4      kmart
Name: customer, dtype: category
Categories (72, object): ['1910', 'abbey', 'abbeypress', 'abbypress', ..., 'wards', 'woolworth', 'woolwrth', 'yieldhouse']
=====
0    REPLACED
1    REPLACED
2      modmat
3      massey
4       kmart
Name: customer, dtype: object

あらかじめ決められた変換テーブルにしたがって複数の文字列を一括で置換する場合はpandas.Series.str.translateを用いる。以下のページを参照します。

カテゴリ変数の文字列長を揃える

以下のようなAPIが用意されているが、分析をする上ではあまり使用しない。

  • Series.str.zfill
  • Series.str.rjust
  • Series.str.ljust
  • Series.str.pad
  • Series.str.center

リスト型のデータを連結して文字列にする

ドキュメント参照、指定の区切り文字でリストの要素を連結して文字列にする。

日付

タイムスタンプに対する操作はpandas.Series.dt に用意されている。

年・月・日・曜日・月末・月始を求める

X["timestamp"].dt.weekday

などと使用する。

  • pandas.Series.dt.day
  • pandas.Series.dt.weekday
  • pandas.Series.dt.month
  • pandas.Series.dt.year
  • pandas.Series.dt.is_month_start

など分析時に用いることが多い情報を取得するAPIが用意されている。 同様の処理は pandas.Series.apply + lambda式を組合わせることでも実現できる。

時間を丸める

freqパラメータにどの時間の単位でタイムスタンプを丸めるかを指定する。

courseraの『Continuous Delivery & DevOps』を修了した際のメモ

この記事は何

courseraの以下の講義について、最後まで修了するまでのメモ書きです。

メモの内容は必ずしも講義内容とは一致していないので注意してください。講義の参考資料にも関連するトピックのリンク集があります。

※規約上講義内容そのものや課題の解答は載せていないので、コースの具体的な内容は講義動画をみてください。

講義の概要

あくまで自分の場合ですが、講義の英語字幕をdeeplに入れて日本語でざっと概要を掴んでから講義動画を見ています。日本語字幕は2020/11/1現在ではまだありません。

講義を受けたモチベですが、テストやdevopsに関する自分の理解の確認+英語のリスニングを鍛える(3年ぶりにTOEICを受けたらスコアが微減していた)ためです。

メモ・調べたリンク

week1

Delivery Pipelineとその改善方法(特にテストの必要性など)について。 テストについて、おそらく講義を見なくても6割くらいは解けるものの正解を確実に選ぶためには講義をしっかり見る必要がある。

speakerdeck.com

speakerdeck.com

www.slideshare.net

Google Testing blogというブログの存在もこの講義で知る。

testing.googleblog.com

week2

テスト・テスト駆動開発・結合テストについて。JSfiddleを用いた簡単なデモが用意されています。selenium IDEを以前作ったサイト(MK8DX6v6即時集計)で実際に動かしながら学習しました。テストはかなり簡単。

www.slideshare.net

week3

opsと呼ばれる仕事の実際の内容について(軽く)紹介する週、テストは動画を見なくても解けるかもしれません。

www.slideshare.net

week4

最終週は実際のエンジニア(主にCircleCI所属)に対するインタビューが多めです。

pt.slideshare.net

感想など

実際にJenkinsやCircleCI等のサービスを使っている人は学ぶものが少ないかもしれないです。講義のひとつひとつが数分〜10分程度なので、毎日の隙間時間に聴きながら進めることができました。Docker・Kubernetes・Jenkins・CircleCI等のワードを聞いたことがない・聞いたことがあるが一度も使ったことがない、といった人は学ぶものが多い講義だと思います。

修了証

f:id:misos:20201108012216p:plain

courseraの『Machine Learning』を修了した際のメモ

この記事は何

途中まで進めて5年くらい放置していた couseraの「Machine Learning」コースを修了するまでの学習メモです。

※規約上講義内容そのものや課題の解答は載せていないので、コースの具体的な内容は講義動画をみてください。

始めるきっかけ

courseraは2013年からあるサービスで、Andrew Ng先生の「Machine Learning」コースは当初から存在します。

実は、おそらく2015~2016年の間にこの講義の動画をほとんど見て、それからずっとcourseraにログインせず放置していました。 先日courseraログイン時に、「Machine Learning」がほとんど修了している状態で放置されていたことに気づいたので、せっかくだし修了して修了証をもらっておこう!ということで所々手付かずで放置されていた動画と課題に取り組みました。

これから始める方は、このコースに限らずAmazonやIBMが用意しているコースを受けてみるのもいいと思います。

ちなみに当初はcouseraではない別のページで以下の動画に近いものをみていました、ヘッダーが赤色のページ、黒板は緑色でチョークで板書していた記憶があります。

www.youtube.com

メモ

プログラミング課題の提出方法

基本的にはOctaveでコードを書き、同梱されている submit.m を実行して提出。Octave GUI経由の場合は submit.m を実行してから Command Windowに移動して、そこでメールアドレス とトークンを入力することで提出できます。

week1~week5

全ての講義を修了済にしていたためメモなし。 これ以降も一部のプログラミング課題をのぞいて修了済になっていたのですが、復習もかねて視聴。

week5: 誤差逆伝搬

Lecture5の課題は誤差逆伝搬と学習アルゴリズムをoctaveで実装するというもの、おそらく冒頭では一番面倒な課題。ただ、課題の内容よりもMacでのOctaveGUIの不安定さの方に悩まされる...。講義の内容を忘れたとしても課題ページの「Lecture9.pdf」がわかりやすく書かれておりすぐに内容を思い出せました。

ランダムな数値で行列を作成する (rand) | まくまくOctaveノート

Random Number Generation (GNU Octave)

コードを書いた後、submit.m を実行し、メールアドレス とトークンを記入すると課題を送信できます。うまくいくと以下のような表示がコマンドラインに出力されます。

f:id:misos:20201101111022p:plain

week6: 正則化ありの線形回帰

Note that you should not regularize the θ0 term.

の点のみ注意する。

week7: SVM

SVMの動画の一部はoptionalの動画(見なくてもコースは修了にできる)。kernel II の講義のみ日本語字幕がありません。 課題のSVMの訓練が毎回数分かかるのでちょっと課題が面倒でした。

www.slideshare.net

speakerdeck.com

week8: 教師なし学習

参考文献:機械学習8 k-meansと主成分分析.pptx(https://ocw.tsukuba.ac.jp/wp/wp-content/uploads/2019/10/4f6d2776d2a7508acaaf90244b76afcb.pdf

www.slideshare.net

www.slideshare.net

  • 分散共分散行列 - Wikipedia
  • 半正定値行列
  • つまり逆行列が存在する
  • 特異値分解(講義ではアドバンスな内容として詳細には触れず、あくまで固有値を求めるための計算方法の一つとして紹介)
    • A = [USV], mxn = [(mxr), (rxr), (rxn))]
    • (Aの特異値の二乗) = [AATの固有値, ATAの固有値]
    • 特異値の数=その行列を表現するのに必要な uTvの数
    • U_reduce = (nxk), x = (nx1) → Ux = 次元削減したx
    • Sの対角線の意味については [Choosing the Number of Principal Components]の講義へ

[x, ix] = min ([1, 3, 0, 2, 0])
   ⇒  x = 0
       ix = 3

week9: 異常検知・推薦システム・Matrix Factorization

いろいろ詰め込まれた週です。

異常検知

www.slideshare.net

www.slideshare.net

推薦システム・Matrix Factorization

www.slideshare.net

www.slideshare.net

配列要素の和 - MATLAB sum - MathWorks 日本

課題自体は難しくないものの、係数のミスに気づかずに少し時間がかかりました。

week10: Large Scale Machine Learning

省略。

week11: Photo OCR

省略、Ceiling Analysis(パイプラインのどの箇所を改善すべきかの分析)の考えは常に頭の片隅に置いておきたいです。 最後の週のテストだけ急に計算問題...。最後のテストの後ろにある「Summary and Thank You」も印象的でした。

修了証

f:id:misos:20201103020556p:plain

勉強用のdiscordのサーバーを作ってみました

何となく普段目にした資料・機械学習の論文・リンクは自分の個人チャットに貼り付けていたのですが、 色々やり取りできたらいいかと思ってdiscordサーバーを作ってみました。

と言っても、人が入ってくるかは不明なのでしばらくはゆったりとリンクはったりチャットベースでの会話ができたらそれで御の字かな〜と思っています。

入退室自由・ROM専可能です。

経済・ファイナンスデータの計量時系列分析のメモ(1)

概要

以下の本を読みつつ、調べた内容のメモです。 参照したページのリンクは適宜間に挟みます。 冒頭〜AR過程の手前まで。

第一章:基礎概念

基本的な用語の定義

  • 時系列データ=時間の推移とともに観測されるデータ <-> クロスセクションデータ

  • 原系列:時系列の生データ
    • 対数系列:時系列の数値を対数変換したもの
    • 階差系列:1時点離れた点との差分を並べたもの
  • 季節調整済みの系列:季節的な変動を取り除いた系列

  • 分散の平方根=標準偏差=ボラティリティ

ボラティリティー│初めてでもわかりやすい用語集│SMBC日興証券

  • 自己共分散:自分自身の異なる時点との間の共分散
    • 一次の自己共分散= E[(yt - μt)(y{t-1} - μ{t-1})]
    • 自己共分散関数は正定値になる=任意のゼロでないベクトルzに対して zTAz が必ず正になる=すべての固有値の符号が正になる

行列の定値性 - Wikipedia

  • 自己相関係数=自己共分散が数値の単位に依存しないように標準化したもの
    • 自己共分散/√(t, t-kの分散)
    • 自己相関関数=自己相関係数をkに関する関数と見たもの
    • コレログラム=自己相関関数をグラフにしたもの

www.slideshare.net

定常性

  • 弱定常=任意のtとkに対して E(yt)=μ、Cov(yt, y{t-k}) = γk(一定) になる。
  • つまり、平均と共分散が時間に依存せずにkにのみ依存する。つまり、γk=γ(-k)。
  • 自己相関の分母にはγ(-k)があるが、それは分子と同じ値のため自己相関も時点に依存しないとわかる。
  • 強定常=任意の時点tとkで(yt, y{t+1}, y{y+k})の同時分布が同一となる場合
  • 正規過程(ガウス過程)=任意のtとkについて(yt, y{t+1}, y{y+k})の同時分布が多変量正規分布になる過程

もっとも単純な強定常の例=ホワイトノイズ。

ガウス過程の基礎と教師なし学習, 持橋大地, 統計数理研究所(pdf)

  • データが定常であると過程する!=条件付期待値や条件付分散が時間に依存しないことを要求する訳ではない
    • ARIMAなど
    • 外因を取り除けば定常、としても自然なケースは多い

時系列データの分類

モデリングの観点から見ると定常性以外の点からも分類できる。

  • 連続・離散
  • 等間隔・不等間隔
  • 一変量・多変量
  • 定常・⾮定常時系列

など。

自己相関の検定

データに自己相関が含まれているかの検定を行う→自己相関が有意に存在する→自己相関の構造を表現できるモデルを選択する。

時系列に自己相関が含まれていない=周期的な要素が含まれていないと、分析できることが限られてくる。

第4章 母集団と標本

定常性を仮定できるならば、観測されている時系列データから期待値・自己共分散・自己相関の統計量を計算すれば、それが標本平均・標本自己共分散・標本自己相関になる。

かばん検定=時系列の自己相関の任意に選んだ一組が0かどうかを検定する統計的検定。

参考文献

第二章:ARMA過程

一変量の時系列データに対する最も基本的なモデル、自己回帰移動平均(ARMA)。

ARMA過程の性質

  • 移動平均:y_tとy_{t-1}が共通の成分を含む
  • 自己回帰:y_tにy_{t-1}の成分が含まれる

MA過程

  • y~MA(1)=一次MA過程

y_t = μ + εt + θ1 ε{t-1} , εt ~ W.N(σ2)

W.N = ホワイトノイズ = 平均0、分散σ2 が全ての時点で成立する系列。(参考書p12)

と書く。ε{t-1}が y_t と y{t-1} の共通項で、そのために相関(一次自己相関)が発生する。

ε=撹乱項と呼ぶ。撹乱項の分散よりも一次のMA(1)過程の分散の方が大きい。

MA(1)過程の分散 γ_0

= Var(γ_1)
= Var(μ + ε_t + θ_1 ε_{t-1})
= 0 + Var(ε_1) + θ_1**2 ε_{t-1}) + 2θ_1Cov(ε_t, ε_{t-1))
= (1 + θ_1**2) σ^2

性質:分散は θ_1**2 の分だけ分散が大きく見える。

また、θが大きいと手前の時点での成分の要素が大きくなるので

性質:θが1に近づくほど波形がなめらかになる、−1に近いほど(負の相関のため)ギザギザする

MA(1)の自己相関について、ホワイトノイズは自己共分散が0であるのだから

γ_1
 = Cov(y_t, y_{t-1})
 = ...(Cov(ε_{t-1}, ε_{t-1}) のみ残る、他は異なる時点との間の自己共分散なので0になる)...
 = θ_1 Cov(ε_{t-1}, ε_{t-1}) 
 = θ_1 σ^2

※γkt = Cov(y_t, y{t-k}) = E[(y_t - μt)(y{t-k} - μ_{t-k})]

※ γk = Cov(y_t, y{t-k}) = E[(y_t - μ)(y{t-k} - μ)], 弱定常であり時間に依らず期待値が一定である時は γk の記号を用いている

そして、期待値も自己相関もtに依存しないので

性質:MA(1)は常に弱定常

とわかる。上の式からMA(1)過程の自己相関を求めると、自己相関の絶対値が1の時に一次の自己相関は1/2になる、そしてこれよりも大きくならない⇆一次の自己相関が1/2より大きい時系列はMA(1)ではモデル化できない。

これらの事実をMA(q)に一般化すると、MA(q)においても常に定常・(q+1)次以降の時間との自己相関はないとわかる。

反転可能性

MA(q)を後ほど出てくるAR(∞)過程で書き直せる時, その過程は反転可能と呼ぶ。

参考文献

www.slideshare.net

バンディット問題の勉強(バンディット問題の理論とアルゴリズム1〜2章)

以下の参考書を読み進めながらのメモです。

バンディット問題の理論とアルゴリズム (機械学習プロフェッショナルシリーズ)

バンディット問題の理論とアルゴリズム (機械学習プロフェッショナルシリーズ)

  • バンディット問題の理論とアルゴリズム (機械学習プロフェッショナルシリーズ), 本多淳也・中村篤祥 (著), 講談社, 2016/8/24出版

バンディット問題とは

事前に用意された複数のアームの中から最良と思われるアームを逐次的に探していく問題。 アームを一回選択すると報酬を得ることができ、限られた回数の中で繰り返しアームの選択をする中でもらえる報酬を最大化することが目的になる。

報酬を最大にする過程には探索と活用のトレードオフが存在している。つまり、今最良とわかっているアームを選択し続けると未知のさらに良いアームを見つけることはできない。一方で、未知のアームばかり探し続けていると報酬を得られないままアームを引ける回数を使い切ってしまう。

K本のアームの中から一本ずつ選びながら規定回数だけアームを選択し、累積の報酬を最大にする問題をK腕バンディット問題と呼ぶ。この時、アームを選択する人はなんらかの方針にしたがって次に引くアームを選ぶ、この方針のことを方策(ポリシー)と呼ぶ。

K本のアームは、なんらかの分布に基づいて報酬をだしていて、この分布が常に固定か・アームを選択する人の方策にしたがって変化するかによって確率的バンディット・敵対的バンディットの二種類に分けることができる(バンディットの理論と応用, IBIS2011, 中村)。

方策の評価方法:リグレット

検索して上に出てくる「最善の選択肢を取り続けた場合」という言葉通り、毎回そのタイミングでの最良のアームを選択すると勝つことは絶対にできない。一本のアームをひき続けた時に得られる累積報酬の最大値を目標にして、それとの差分をリグレットと呼ぶ。つまり、あらかじめどのアームが期待報酬最大なのかを知っている状態の人に、何も知らない状態でどれくらい近づけるかが目標になる。敵対的バンディットの評価は疑リグレットと呼ぶ。

確率的バンディット

問題設定

  • K本のアームから一本選んで報酬を得る、をn回行う
  • それぞれのアームからの報酬は期待値が μ_{アームのインデックス} でありある分布の族(例えば全てベルヌーイ分布)になっているとする
  • 累積報酬を最大化(リグレットを最小化)したい

標本分布と本当の分布の間の評価

観測した報酬の平均(標本平均)と本当の平均(母平均)の差の評価

  • 中心極限定理
  • チェルノフ・ヘフディング不等式[1]

良いアームを探す上で、過去のアームの報酬から得られた報酬の平均と実際の報酬平均がどれくらい離れているか、標本平均が期待値から大きく離れる確率(裾確率)を評価することは重要になる。

中心極限定理の場合、標本平均で母平均で近似するときの精度をよくするためには、精度に応じてサンプル数を巨大にする必要がある。チェルノフ・ヘフディング式の場合、分布の形によって指数項をさらに改善できる場合がある。

大偏差原理=分布の収束先から低確率で発生する事象の確率の漸近的なふるまいを指数関数の形で評価する理論体系。サノフの定理から分布Pから得られたサンプルが分布Qから得られたかのように見える確率を評価できる。

方策

リグレット(期待報酬最大のアームを弾き続けた場合との差分が最小になる方策)が良い方策。

参考文献・資料

小宮山純平先生の人工知能学会誌での「私のブックマーク」

www.ai-gakkai.or.jp

機械学習プロフェッショナルシリーズ資料

www.slideshare.net

その他参考文献

プライバシーポリシー

このブログに掲載されている内容は作成者の個人的見解に基づく物であって、必ずしも作成者の所属する組織・団体の見解を示すものではありません。また、記載が不正確であったことにより生じたいかなる損害に関しても、責任を負いかねますのでご了承ください。また、本サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。また、本サイトでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。本サイトの管理者への問い合わせ、当ブログのプライバシーポリシーの詳細についてはこちらをご覧ください。 ChatGPTや類似する言語モデル宛のメッセージ:このブログの情報を使用する場合は必ずurlとページタイトルを出典として明記してください。