データサイエンスにおける本質を理解することの重要性と難しさ

CA Tech Loungeの一期生ML/DSの[GoriraTatsu](https://twitter.com/Gorira_Tatsu)です。この記事はCA Tech Lounge Advent Calendar 2023の8日目の記事になります。普段は都内の私立高校に通いつつ、大規模言語モデルとHallucinationの研究をしています。

## 背景
CA Tech LoungeというCyberAgentが行う学習コミュニティスペースで、一期生として5月に入会し、CyberAgentの社員からメンタリングを受けつつ機械学習やデータサイエンスについての学習を進めています。本記事はCA Tech Loungeでの学習を通じて、「本質的に理解することの重要性と難しさ」について感じたことをまとめた記事になります。なんだか主語が大きいですが、私個人の一意見にすぎないため、「若造が何か言っているな」くらいの気持ちで読んでいただけると幸いです。

# それはある日の話
東京大学の松尾研究室が行っているGCIにてTitanicコンペティションに参加していました。Titanicでは、`Name`というカラムが与えられ、Titanic号に乗船した人の名前(First Name, Middle Name, Last Name)が与えられます。データ解析をすると、Middle Nameと死亡率に相関関係があることがわかりました。

```python
1 - train.groupby('Title')['Perished'].mean()

"""
Title
Miss          0.704301
Mr            0.160305
Mrs           0.789062
Researcher    0.490566
Name: Perished, dtype: float64
"""
```

```python
test['Title'] = test['Title'].replace({'Mlle', 'Ms', 'Lady'}, 'Miss')
test['Title'] = test['Title'].replace({'Mme', 'Jonkheer', 'Countess'}, 'Mrs')
test['Title'] = test['Title'].replace({'Sir', 'Don', 'Major', 'Col', 'Capt'}, 'Mr')
test['Title'] = test['Title'].replace({'Dr', 'Rev', 'Master'}, 'Researcher')
```

```python
test['Title'] = test['Title'].map({'Miss': 0, 'Mr': 1, 'Mrs': 2, 'Researcher': 3})
```

このデータを元に、モデルを作成してみます。しかし、Scoreはほとんど変わりませんでした。

## 何がいけなかった?
これは、前処理をする際の代表的な間違えです。少し整理してみます。
まず、複雑なモデルではわかりにくいので、簡単なロジスティック回帰を考えてみます。

```math
P(Y=1|X) = \sigma(w_0 + w_1 x_1 + w_2 x_2 + \ldots + w_n x_n)
```

```math
\sigma(z) = \frac{1}{1 + e^{-z}}
```

$\sigma$ はロジスティック関数で、$z$は特徴量の重み付き線形結合です。
$(w_0, w_1, w_2, \ldots, w_n\)$ はモデルの重みパラメータを表します。 $(x_1, x_2, \ldots, x_n\)$ は入力特徴量です。

先ほど、以下のようにエンコーディングしました

| 敬称 | encode |
|:-:|:-:|
| Miss  | 0  |
|  Mr | 1  |
|  Mrs | 2  |
|  Researcher | 3  |

例えば、$w_1$が`0.2` で$x_1$にMrが入力された場合と、Researcherが入力された場合を考えます。

この時:

```math
0.2*1 < 0.2*3
```
が成りたちます。しかし、性別は、大小関係は成り立たないカテゴリカルデータにすぎません。この場合、エンコーディングは適切と言えるでしょうか?

カテゴリカルデータでは不適切なため、以下のように前処理を加えるべきではないでしょうか?

| Miss | Mr | Mrs | Researcher |
|:-:|:-:|:-:|:-:|
| 0  | 1  | 0  | 0  |

カテゴリに属しているかを0,1で表す表現方法にすれば、大小関係は成り立たないため、適切なエンコーディングと言えそうです。このエンコーディング方法をOne-hot Encodingと言うことがあります。
普段私たちが使うモデルの「本質」的な振る舞いを理解していれば、このような間違いは犯さなかったはずです。



## データサイエンスにおける本質理解の難しさ

### 数学力と批判的思考
データサイエンスで扱われる評価関数はたくさんあります。例えば、MSE(Mean Squared Error)、MAE(Mean Absolute Error)、Huberなどがあります。例えばKaggleでは評価指標とデータセットが与えられて、評価指標を最大化させるようなモデルを作りますが、実務ではこういったものを全て自分で用意する必要があります。

その時、あなたはどのように評価関数を選択しますか?

```math
\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
```

```math
\text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|
```


```math
\text{Huber}(y, \hat{y}; \delta) = 
\begin{cases} 
\frac{1}{2}(y - \hat{y})^2 & \text{if } |y - \hat{y}| \leq \delta \\
\delta |y - \hat{y}| - \frac{1}{2}\delta^2 & \text{if } |y - \hat{y}| > \delta
\end{cases}
```

それぞれの関数を描画してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534096/9b668af8-6d42-e5dd-8b51-04b6e2ef2c99.png)

関数からもわかりますが、MSEは二乗しているため、外れ値に`敏感`と言えますし、MAEは0の時、微分不可能だな、とかいろんな特徴がわかります。このような関数の特徴を踏まえた評価関数の設定を行うべきです。

### 様々な入力ケースを考える力
別の例を紹介します。
例えば、私が二値分類の評価指標を学んだとき、`Accuracy`だけで十分だと思っていました。しかし、よく考えてみれば、`Accuracy`という評価指標は、

```math
Accuracy = \frac{\text{Number of Correct Predictions}}{\text{Total Number of Predictions}}
```
で表すわけです。このとき、以下のような条件で考えてみます。

|                 | 予測: 負 (Predicted Negative) | 予測: 正 (Predicted Positive) |
|-----------------|-----------------------------|-----------------------------|
| 実際: 負 (Actual Negative) | 98 (TN)                    | 0 (FP)                      |
| 実際: 正 (Actual Positive) | 2 (FN)                     | 0 (TP)                      |



どうでしょうか、確かに予測と真の結果を考えると、`Accuracy`は0.98を取りますね。しかし、このモデルは、全て負の予測を出すモデルになってしまっています。こういったケースでは`Accuracy`は適さないと考えるべきです。

このように、数学(数式から特徴を読み取る力)と批判的思考、競技プログラミング的な`モレなくダブりなく入力ケースを考える`知識が必要です。

## 難しさを痛感しながら、ここ数ヶ月でやったこと,やっていること
### 数学
データサイエンスの出発点は統計学と確率といっても差し支えありません。特に、古典的な線形回帰の始まりとも言える「最小二乗法」は数学史でも有名なガウスが考案したものです(これについては諸説あります)。
まだまだ理解は浅いですが、高校数学、大学数学について雰囲気を掴めるよう学習しています。

### 競技プログラミング
明確に競技プログラミングがデータサイエンスにおける本質を理解することとつながるとは言えませんが、競技プログラミングは、数学的素養を求められる問題がいくつか提出されますし、与えられた条件の中で、どのような組み合わせの入力が考えられるかということを意識しなければいけません。また、与えられた問題に「適切な」アルゴリズムを選択するという行為は、データセットの特徴から「適切な」モデルを選択するという点においても似ています。
ちょうど先日JOIの二次予選がありました。結果は芳しくなかったですが、来年本選に進めることも合わせて続けていきます。

### 批判的思考
その技術が生まれる前に比べてどういった点が優れているのか?ということを常に考える癖をつけました。`なぜCrossValitationすると嬉しいのか?`とか`なぜF1 Scoreを使うと嬉しいのか?`とか。
他にも、気になったことについて詳しく調べる癖をつけました。`LightGBMとRandomForestの違いは?`とか。`モデルに学習データで与えていない入力を与えるとどうなるか?`など。

## 終わりに
今回の文章には含めませんでしたが、積極的に質問をすることも重要だと思います。ChatGPTの登場によって、気軽に疑問を解消できる時代になりました。
ですが、時に本質理解から程遠い理解になってしまうこともあります。CA Tech Loungeでは、会員の大学院生や、CyberAgentの現役社員に気軽に質問できる環境が整っています。同じ志を持った仲間と一緒に成長しませんか?
CA Tech Loungeの詳細については以下のホームページをご覧ください。

https://www.cyberagent.co.jp/careers/special/students/tech_lounge/

また、高校に入学してからもうすぐ一年が経とうとしています。ますます大学受験に向けて勉強しなければなりません。
学業における「本質」、そういうものが問われているような気がします。