VSCodeのMarkdownにおける脚注(footnote)について
わからなかったので調べました。
結論: Markdown Preview Enhanced extension1を使いましょうということです。
Markdown GuideのVS Codeの整理2がわかりやすかったです。
以下のような表現となります。
- 脚注を挿入するポイント
[^1]
- 最下部の脚注の中身(XXXにURLや補足事項を記載する3)
[^1]:XXX
例えば脚注に関する文章は当該記事ではこのように記載しております。
結論: Markdown Preview Enhanced extension[^1]を使いましょうということです。 Markdown GuideのVS Codeの整理[^2]がわかりやすかったです。 - 最下部の脚注の中身(XXXにURLや補足事項を記載する[^3])
Kaggleで頼りになるpdb(jupyter notebookのデバッグ手法)
はてなブログの数式を正規表現でなんとかする
はてなブログの数式を正規表現でなんとかする
notionなどで数式含めて整理した記事を投稿するときにやっかいなのが独特の数式阻害w
$x = 1$
$$ x = 1 $$
$で囲んだ数式ががうまく表示されないことがあります。
いろいろな対策がありますが・・・ここでは正規表現一発置換を選択しました。
やり方
正規表現の検索パターン
(\${1,2}(\n|.)+?\${1,2})
置き換え
$1
※visual studio codeにて動作確認
うまく置き換えができると数式部分のみが以下のようなかたちになると思います。
[]$x = 1$[]
[]$$ x = 1 $$[]
ひとまずこれで9割は正しく表示できる状態になる気がします。
[]で囲むことがなんであったか忘れてしまったのですが 確かはてなキーワードを無効化させる記述方法だったかな・・・
Macの日本語変換に関するキーボードショートカット
一度観測してからサンプルサイズを積むとp-hackingになるシミュレーション
一度観測してからサンプルサイズを積むとp-hackingになるシミュレーション
要旨
- twitterで話題になってたので自分でもやってみた
- pythonで実施
- マジで誤謬の確率が高くなる
- よくよく考えると
- 実験→検定→p値観測→分岐発生
- [A]0.05より大きい→サンプルサイズ貯まるまで待つ
- [B]0.05以下→有意差ありとしてここでストップ
- 以下のような話が隠れている?
- 観測0.08→待つ
- →観測0.06→待つ
- →観測0.04→本来ならここで止めるが続けると・・・
- →観測0.06(閾値の範囲内に収まってしまった)
- よくよく考えると
- 気になりごと
- 今回のシミュレーションは帰無仮説が成立する場合の話なので棄却できるときはまた異なる話になるか?
本文
import numpy as np from scipy import stats import seaborn as sns
# https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html # rvs(): 正規分布からランダムに値を取得する(Random variates) # loc: 平均、scale: 標準偏差, size: 取得する数※,で次元を指定 # locとscaleを省略すると標準正規分布になる # rvs = stats.norm.rvs(loc=0, scale=10, size=(50, 2)) rvs = stats.norm.rvs(size=(5, 3)) print(rvs)
rvs = stats.norm.rvs(size=(10000,2)) sns.displot(rvs)
def get_ttest_pvalue(): rvs1 = stats.norm.rvs(loc=5, scale=3, size=500) rvs2 = stats.norm.rvs(loc=5, scale=3, size=500) stat, pvalue = stats.ttest_ind(rvs1,rvs2) return pvalue pvalues = [] for i in range(10000): pvalues.append(get_ttest_pvalue()) print(len([x for x in pvalues if x <= 0.05]) / len(pvalues)) sns.displot(pvalues, bins=20)
- p-value ≤ 0.05の割合:0.0487
def get_ttest_pvalue_alternative(): rvs1 = stats.norm.rvs(loc=5, scale=3, size=500) rvs2 = stats.norm.rvs(loc=5, scale=3, size=500) stat, pvalue = stats.ttest_ind(rvs1, rvs2) if (pvalue > 0.05): rvs1alt = stats.norm.rvs(loc=5, scale=3, size=500) rvs2alt = stats.norm.rvs(loc=5, scale=3, size=500) rvs1 = np.append(rvs1, rvs1alt) rvs2 = np.append(rvs2, rvs2alt) stat, pvalue = stats.ttest_ind(rvs1, rvs2) if (pvalue > 0.05): rvs1alt = stats.norm.rvs(loc=5, scale=3, size=500) rvs2alt = stats.norm.rvs(loc=5, scale=3, size=500) rvs1 = np.append(rvs1, rvs1alt) rvs2 = np.append(rvs2, rvs2alt) stat, pvalue = stats.ttest_ind(rvs1, rvs2) return pvalue pvalues = [] for i in range(10000): pvalues.append(get_ttest_pvalue_alternative()) print(len([x for x in pvalues if x <= 0.05]) / len(pvalues)) sns.displot(pvalues, bins=20)
- p-value ≤ 0.05の割合:0.1115
Mean Average Precision
H&Mコンペの評価指標MAP@12
H&M Personalized Fashion Recommendations
正直あまり理解しないまま進めてました・・・笑
救世主登場!
Understanding Mean Average Precision
- 非常にわかりやすい記事を見つけたので備忘録として書き下す
- 順を追って説明してくれているため非常にわかりやすい
求めているもの
$$ MAP@12 = \dfrac{1}{U} \sum_{u=1}^{U} \dfrac{1}{min(m,12)} \sum_{k=1}^{min(n,12)} P(k) \times rel(k) $$
where 𝑈 is the number of customers, 𝑃(𝑘) is the precision at cutoff 𝑘, 𝑛 is the number predictions per customer, 𝑚 is the number of ground truth values per customer, and 𝑟𝑒𝑙(𝑘) is an indicator function equaling 1 if the item at rank 𝑘 is a relevant (correct) label, zero otherwise.
- U:customersの数
- P(k):cutoff kにおける精度
- n:customerごとの予測の数
- m:customerごとの真値の数
- rel(k):指示関数、ランクkのアイテムが正しく分類できていれば1(真の値の集合に存在していれば1)、そうでなければ0
Precision
$$ \text{Precision} = \dfrac{\text{num of correct predictions}} {\text{num of all predictions}} = \dfrac{TP}{TP + FP} $$
- Trueと予測し正しかったもの / Trueと予測したもの
- フラグ立てたもののうち正しく予測できたフラグの割合ってところですかね
Precision at k
Precision at cutoff k, P(k), is simply the precision calculated by considering only the subset of your predictions from rank 1 through k.
- P(k)は予測値のランク1〜kまでのsubsetのみを考慮したPrecisionということ
- kでばっさりと切り捨てて評価するイメージですかね
例示
- ground truth = [a,b,c,d,e]
- pred = [a,e,f,g,b]
- then for P@3
- cutoffが1
- →predから1つ目だけを評価する
- →つまりbのみ評価する
- →ground_truthにbがあるか確認する
- →ある!
$$ \text{Precision at 3} = \dfrac{| { gt } \cap \text{ {pred[:3]}} |} { \text{{pred[:3]}} } = \dfrac{2}{3} \ \text{※gt = ground truth} $$
なるほど・・・
Rel at k
rel(k):指示関数、ランクkのアイテムが正しく分類できていれば1(真の値の集合に存在していれば1)、そうでなければ0
例示
- ground truth = [a,b,c,d,e]
- pred = [a,e,f,g,b]
- then for rel@3
- ランクkのアイテムのみ評価する
- →つまりf
- →fは真の値の集合に・・・いない!
- つまりrel(3) = 0
結構大変だけどもう少し・・・
Average Precision at k
This is simply the mean of the product of P@k and rel(k) for all values of k
$$ \dfrac{1}{min(n,12)} \sum_{k=1}^{min(n,12)} P(k) \times rel(k) $$
- あぁランク1から繰り返して、cutoff kのp(recision)(k)と指示関数rel(k)の掛け算し算出した値の平均なんだねって感じ
- 指示関数が0のときは加算は0になるので無得点って感じですね
- これだ!と予測した序列に応じて上位ほど得点の重みがあるってところでしょうか
こんがらがってくるけど・・・
例示
- ground truth = [a,b,c,d,e]
- pred = [a,f,c,g,b]
then for AP@5
rank k P(k) rel(k) P(k) x rel(k) 1 1 1 1 2 1 / 2 = 0.5 0 0 3 2 / 3 = 0.66.. 1 0.66.. 4 2 / 4 = 0.5 0 0 5 3 / 5 = 0.6 1 0.6 sum 2.266.. sum / 5 (= ave) 0.4533.. - ∴ AP@5 = 0.4533..
Mean Average Precision at k
- やっと来ました・・・
- みてみましょう
$$ MAP@12 = {\color{red} \dfrac{1}{U} \sum_{u=1}^{U} } \dfrac{1}{min(m,12)} \sum_{k=1}^{min(n,12)} P(k) \times rel(k) $$
- なるほど$\frac{1}{U} \sum_{u=1}^{U}$ が追加の部分で他はこれまで順を追ってきたものとなりますね
- Uはnumber of customersであるので、これまで追ってきた計算をユーザーの数だけ繰り返して平均を算出すれば良さそうですね
- あんまりわかっていない気になりごと
- kaggleではmin(m,12)とmin(n,12)と分かれている
- mはground truthの数だけどこれが例えばm=1だとすると1/1となり分母が最小化される
- m>=12だと1/12となってこのパターンが一番スコアを減少させる力学が働く
- 基本的にはmax分、12個予測しないとスコア稼ぎ観点では損をするといった感じなのかな
Seabornのデータセット
公式ドキュメント
関数の使い方
https://seaborn.pydata.org/generated/seaborn.load_dataset.html
備わっているデータセット一覧
https://github.com/mwaskom/seaborn-data
コード
import pandas as pd import seaborn as sns df = sns.load_dataset('titanic') df.head()