まくろぐ
更新: / 作成:

仕事がうまくいかなかったり、部屋の中がごちゃごちゃしてくると、断捨離をしたくなります。 そんなときにシンプルに生きる素晴らしさを思い出させてくれるのがドミニック・ローホー氏の著書です。

モノに依存しないようになることで、いかに豊かになれるかということをひたすらに説いてくれます。 日本在住歴30年で、禅の心を学んでいる彼女の言葉は、日本人の我々にもすっと入ってきます。 昔からモノを溜め込みがちな自分でも断捨離する気になってきます。

シンプルに豊かに生きるには、次のように考えます。

  • モノや人へ執着せず、在るがまま、成せるがままに終息させよう。
  • 物質的なことに時間をかけず、人や人間関係に時間をかけよう。
  • モノの役割は、他の様々な豊かさへの移行を容易にするためにある。
  • 唯一大切なこと、それは多分、居心地の良い場所を見つけること。
  • 幸せが身辺に留まっている間、好きなようにそれを堪能すればよい。その幸せに依存するわけではない。
  • 私たちの身に起こる全ての出来事を根底で「自分とは無関係」と捉える。
  • 自分が何者でもないと認識する。その時点で何者にでもなれる。
  • 余分なモノを捨て、しなければいけないことをする。これこそが知性の扉を開くための第一歩。
  • 様々な経験、これこそが私たちを成長させる。モノは私たちを停滞させる。
  • 「人生で一番」は所有しているモノではあり得ない。

モノを捨てられないときは、次のように考えます。

  • お金が勿体無いからモノを捨てられないというのは間違い。お金が目的であれば、そのモノの維持のために使ってきた時間でもっと儲けられる。
  • これを捨てた場合、自分に起こり得る最悪の事態は?それは取り返しのつかないこと?
  • 1 年使ってなければもう使わない。今使いたいと思わないものは捨てる。
  • 万が一、必要になったらまた買い直せるのでは。代替できるものがあるのでは。
  • テーブルの上がすっきりと何も置かれていない状態は、不安を減少させ、部屋の美しさを高める。
  • ガラクタが詰まった引き出しやボックスは、テーブルの上や風呂敷の上に中身をそっくり空けると簡単に捨てられる。
  • 収納用グッズ(かご、ケース、棚、ファイル)の購入はよく考える。これらはモノを溜め込んでいく手伝いをする。どんなに優れた収納グッズも、過剰にあるモノの問題は解決しない。

基本的には、モノを捨てるタイミング は思い立ったときがよいとされていますが、他にもよい機会が紹介されています。 例えば、旅行などで外泊するときに使い古しの衣類などを処分してくるというのは王道ですね。 他にも、腹が立っているときはモノを捨てやすいというのは面白いです。 確かにイライラしているときって変に勇気が出たりして、いつもと違う行動をとってしまうことがありますね。

とはいうものの、断捨離に慣れていない人にとって、モノを捨てることには罪悪感や勿体なさという感覚が付きまといます。 そんなときは、次の言葉を思い出すとよいです。

たくさんモノを所有した経験があるからこそ、シンプルに生きること、何も持たないことに幸せを見出せる。

捨ててもいいんです。 かつて持っていたという経験はなくなりません。

関連記事

更新: / 作成:

多クラス分類用の F1 スコア

2 クラスの分類タスク(二値分類)の代表的な評価指標として F1 スコア がありますが、多クラスの分類タスクの評価指標としては、これを拡張した次のような指標を使います。 F1 スコアの平均をとったりするのですが、どのような単位で F1 スコアを計算するかが微妙に異なります。

評価指標説明
mean-F1レコードごとに F1 スコアを求め、それらの平均をとります。
macro-F1クラスごとに F1 スコアを求め、それらの平均をとります。
micro-F1各レコードの各クラスに対する予測(陽性 or 陰性)が TP/TN/FP/FN のいずれであるかを求め、その混同行列をもとに F1 スコアを計算します。

これらの指標は、1 つのレコードに対して複数のラベルをつけるマルチラベル分類においてよく用いられます。 下記はマルチラベル分類のタスクにおいて、各種 F1 スコアを求める実装例です。 scikit-learn の f1_score() 関数の average 引数でどのロジックを用いるかを指定できます。

scikit-learn でマルチラベル分類の F1 スコアを求める
from sklearn.metrics import f1_score

# サンプルデータ
y_true = [[0, 1, 1],  # レコード1の真のラベル (2, 3)
          [1, 1, 1]]  # レコード2の真のラベル (1, 2, 3)
y_pred = [[0, 1, 0],  # レコード1の予測されたラベル (2)
          [1, 0, 1]]  # レコード2の予測されたラベル (1, 3)

print(" mean-F1:", f1_score(y_true, y_pred, average="samples"))  # 0.733
print("macro-F1:", f1_score(y_true, y_pred, average="macro"))    # 0.777
print("micro-F1:", f1_score(y_true, y_pred, average="micro"))    # 0.750

手作業で計算してみる

それぞれのロジックをちゃんと理解するために、上記コード中のサンプルデータに関して手作業で計算してみます。

mean-F1 の計算

mean-F1 は、レコードごとに F1 値を求めてから、それらの F1 値を平均します。

  1. レコード 1 に着目して F1 値を求めます
    • 真のラベルは (2, 3)
    • 予測ラベルは (2)
    • TP=1、TN=1、FP=0、FN=1 となるので、\( F_1 = \frac{2 \cdot TP}{2 \cdot TP + FN + FP} = \frac{2 \cdot 1}{2 \cdot 1 + 1 + 0} = \frac{2}{3} \)
  2. レコード 2 に着目して F1 値を求めます
    • 真のラベルは (1, 2, 3)
    • 予測ラベルは (1, 3)
    • TP=2、TN=0、FP=0、FN=1 となるので、\( F_1 = \frac{2 \cdot TP}{2 \cdot TP + FN + FP} = \frac{2 \cdot 2}{2 \cdot 2 + 1 + 0} = \frac{4}{5} \)

上記の \( F_1 \) 値の平均をとればよいので、

$$ \operatorname{mean-F_1} = \frac{1}{2} \cdot \left( \frac{2}{3} + \frac{4}{5} \right) = \frac{11}{15} = 0.733 \cdots $$

macro-F1 の計算

macro-F1 は、クラス(ラベル)ごとに F1 値を求めてから、それらの F1 値を平均します。

  1. クラス 1 に着目して F1 値を求めます
    • TP=1、TN=1、FP=0、FN=0 なので、\( F_1 = \frac{2 \cdot TP}{2 \cdot TP + FN + FP} = \frac{2 \cdot 1}{2 \cdot 1 + 0 + 0} = \frac{2}{2} \)
  2. クラス 2 に着目して F1 値を求めます
    • TP=1、TN=0、FP=0、FN=1 なので、\( F_1 = \frac{2 \cdot TP}{2 \cdot TP + FN + FP} = \frac{2 \cdot 1}{2 \cdot 1 + 1 + 0} = \frac{2}{3} \)
  3. クラス 3 に着目して F1 値を求めます
    • TP=1、TN=0、FP=0、FN=1 なので、\( F_1 = \frac{2}{3} \) (同上)

上記の \( F_1 \) 値の平均をとればよいので、

$$ \operatorname{macro-F_1} = \frac{1}{3} \cdot \left( \frac{2}{2} + \frac{2}{3} + \frac{2}{3} \right) = \frac{7}{9} = 0.777 \cdots $$

micro-F1 の計算

micro-F1 は、各レコードの中で各クラスの予測値が TP/TN/FP/FN のいずれかであるかを判別し、それらの数をもとに \( F_1 \) を計算します。

例えば、レコード 1 のクラス 1 の予測値は陰性 (negative) つまり、レコード 1 はクラス 1 ではないと予測していますが、これは正しく陰性 (negative) と予測できているので TN (true negative) となります。 同様に、すべてのレコードとクラスの組み合わせに関して TP/TN/FP/FN のいずれかであるかを一覧にすると次のようになります。

クラス 1クラス 2クラス 3
レコード 1TNTPFN
レコード 2TPFNTP

micro-F1 は、この TP/TN/FP/FN の数を用いて \( F_1 \) 値を求めます。

$$ \operatorname{macro-F_1} = \frac{2 \cdot TP}{2 \cdot TP + FN + FP} = \frac{2 \cdot 3}{2 \cdot 3 + 2 + 0} = \frac{3}{4} = 0.75 $$

これで、手作業でも mean-F1、macro-F1、micro-F1 を求められました!

٩(๑❛ᴗ❛๑)۶ わーぃ

関連記事

更新: / 作成:

機械学習の分類タスクにおける評価指標のひとつとして balanced accuracy があります(日本語だと加重平均正答率とかかな)。 balanced accuracy は、各クラスのデータ数に偏りがある場合に正答率 (accuracy) の計算に補正を加えます。

balanced accuracy の計算方法

通常の正解率 (accuracy) の計算は次のようなシンプルなものです。

$$ \operatorname{accuracy} = \frac{正解数 (r)}{データ数 (n)} $$

例えば、10 個のデータのうち 8 個の予測に成功した場合は、accuracy は 0.8 (80%) になりますが、blanced accuracy の場合は、各クラスに属するデータの数の逆数を重みとした加重平均を取ります。

$$ \operatorname{balanced accuracy} = \frac{1}{N} \sum_{i=1}^{N} \frac{r_i}{n_i} $$

  • \( N \) … クラス数
  • \( r_i \) … クラス \( i \) に属すると正しく予測できたデータ数
  • \( n_i \) … クラス \( i \) の(実際の)データ数

要するに、もともとたくさんのデータがあるクラスに属すると予測して正解したとしても、accuracy はあまり上がらないようにするということです。 逆に、少ししかデータがないクラスに属すると予測して正解すれば、accuracy は大きく上がります。 感覚としては、各クラスごとに個別に accuracy を求めてから平均するという感じです。

balanced accuracy の例

例として、7 個のデータを 3 クラスに分類する問題を考えてみます。

/p/g6v9puz/img-001.drawio.svg
図: blanced accuracy の例題

クラス 1 に属すると予測したデータの内 2 個が正解、クラス 2 に属すると予測したデータの内 1 個が正解だった場合の計算例です。

$$ \begin{align} \operatorname{balanced accuracy} &= \frac{1}{N} \sum_{i=1}^{N} \frac{r_i}{n_i} \\ &= \frac{1}{3} \left( \frac{2}{4} + \frac{1}{1} + \frac{0}{2} \right) \\ &= 0.5 \text{ (50%)} \end{align} $$

実際に分類確率を出力するモデルを使ってクラス分類を行う場合は、このデータ数の重み \( 1/n \) を加味した上で、どのクラスに分類するかを判断します。 例えば、モデルの出力として、クラス 1 の確率が 0.3、クラス 3 の確率が 0.2 という値が得られたとします。 このとき、単純にこの確率 \( (0.3 \gt 0.2) \) だけを見てクラス 1 に属するデータであると予測するのではなく、データ数の重みで補正した \( 0.3 \times \frac{1}{4} = 0.075 \)、\( 0.2 \times \frac{1}{2} = 0.1 \) という値を使って、クラス 3 に属すると予測します。

参考

関連記事

メニュー

まくろぐ
サイトマップまくへのメッセージ