qnqn雑記

個人の学習ログの域は超えておりませんので間違っている可能性があり確かな情報を求められる場合は専門書等々に当たってください。体系的な情報については管理者ホームページへ(https://qnqn1927.github.io/)

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のデバッグ手法)

Kaggleで頼りになるpdb(jupyter notebookのデバッグ手法)

import pdb;pdb.set_trace()

はてなブログの数式を正規表現でなんとかする

はてなブログの数式を正規表現でなんとかする

notionなどで数式含めて整理した記事を投稿するときにやっかいなのが独特の数式阻害w

$x = 1$
$$
x = 1
$$

$で囲んだ数式ががうまく表示されないことがあります。

いろいろな対策がありますが・・・ここでは正規表現一発置換を選択しました。

やり方

正規表現の検索パターン

(\${1,2}(\n|.)+?\${1,2})

置き換え

$1

visual studio codeにて動作確認

うまく置き換えができると数式部分のみが以下のようなかたちになると思います。

[]$x = 1$[]
[]$$
x = 1
$$[]

ひとまずこれで9割は正しく表示できる状態になる気がします。

[]で囲むことがなんであったか忘れてしまったのですが 確かはてなキーワードを無効化させる記述方法だったかな・・・

Macの日本語変換に関するキーボードショートカット

備忘の意味合いが強いですが、 macの日本語変換ショートカットをよく忘れるのでメモ。

Macで日本語の入力ソースに切り替える

  • キーボードの設定で日本語環境にて入力モードに「英字」へのチェックが必要

  • すると次のショートカットが利用可能となる
    • ctrl + shift + j:全角かな
    • ctrl + shift + ; / ‘:半角英字

Macで日本語入力ソースに切り替える

日本語変換用のキーボードショートカット

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()