【初心者向け】機械学習におけるハイパーパラメータについて

## 機械学習における「**ハイパーパラメータ**」について簡単に見ていきましょう。

機械学習のモデルを構築する際には、アルゴリズムの動作を調整するための「ハイパーパラメータ」を設定する必要があります。これらのハイパーパラメータは、学習の進行速度やモデルの複雑さを制御し、最適なモデルを作成するために重要な役割を果たします。

Titanicデータセットの前処理
以下のコードは、Titanicデータセットの読み込みと前処理を行っています。

```python:sample.py
import numpy as np
import pandas as pd

# データを読み込む
train = pd.read_csv('../input/titanic/train.csv')
test = pd.read_csv('../input/titanic/test.csv')
gender_submission = pd.read_csv('../input/titanic/gender_submission.csv')

# 訓練データとテストデータを結合して、統一的に前処理を行う
data = pd.concat([train, test], sort=False)

# 性別を数値に変換 (male: 0, female: 1)
data['Sex'].replace(['male', 'female'], [0, 1], inplace=True)

# 乗船場所の欠損値を最も多い'S'で補完し、数値に変換
data['Embarked'].fillna(('S'), inplace=True)
data['Embarked'] = data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2}).astype(int)

# 運賃(Fare)の欠損値を平均値で補完
data['Fare'].fillna(np.mean(data['Fare']), inplace=True)

# 年齢(Age)の欠損値を中央値で補完
data['Age'].fillna(data['Age'].median(), inplace=True)

# 家族の人数を計算 (自身 + 同伴者数)
data['FamilySize'] = data['Parch'] + data['SibSp'] + 1

# 独りかどうかを判断するフラグを追加
data['IsAlone'] = 0
data.loc[data['FamilySize'] == 1, 'IsAlone'] = 1

```

不要なカラムの削除とデータの分割
次に、予測に不要なカラムを削除し、訓練データとテストデータに分割します。


```python:sample.py
# 予測に不要なカラムを削除
delete_columns = ['Name', 'PassengerId', 'Ticket', 'Cabin']
data.drop(delete_columns, axis=1, inplace=True)

# 訓練データとテストデータに分割
train = data[:len(train)]
test = data[len(train):]

# 目的変数と説明変数に分ける
y_train = train['Survived']  # 生存フラグ（目的変数）
X_train = train.drop('Survived', axis=1)  # 説明変数
X_test = test.drop('Survived', axis=1)  # テストデータ用の説明変数

```

## 学習データと検証データに分割
モデルの性能を評価するため、訓練データをさらに訓練用と検証用に分割します。

```python:LightGBM.py
from sklearn.model_selection import train_test_split

# 訓練データをさらに分割して、検証用データを作成
X_train, X_valid, y_train, y_valid = train_test_split(
    X_train, y_train, test_size=0.3, random_state=0, stratify=y_train
)

```

## LightGBMを用いたモデルの学習
ここからは、LightGBMを用いてモデルを訓練します。LightGBMは、決定木ベースの勾配ブースティングフレームワークで、学習速度が速く、大規模なデータにも対応できます。

※　LightBGMの説明については下記で記載していますが、
勾配ブースティングは、複数の決定木を組み合わせてモデルを強化していくアルゴリズムになります。

https://qiita.com/Life-tech/items/6aa31c5910c0755a9b09


```python:LightGBM.py
import lightgbm as lgb

# 訓練データをLightGBMの形式に変換し、カテゴリ変数を指定
lgb_train = lgb.Dataset(X_train, y_train, categorical_feature=categorical_features)

# 検証データもLightGBM形式に変換
lgb_eval = lgb.Dataset(X_valid, y_valid, reference=lgb_train, categorical_feature=categorical_features)

# ハイパーパラメータの設定
params = {
    'objective': 'binary',         # 2値分類タスク
    'max_bin': 300,                # ヒストグラムのビン数
    'learning_rate': 0.05,         # 学習率
    'num_leaves': 40               # 決定木のリーフ数
}

# モデルの学習
model = lgb.train(
    params,                # ハイパーパラメータ
    lgb_train,             # 訓練データ
    valid_sets=[lgb_train, lgb_eval],  # モデルの評価に用いるデータセット
    verbose_eval=10,       # 10回ごとにログを表示
    num_boost_round=1000,  # 最大1000回のブーストを実行
    early_stopping_rounds=10  # 10回連続で改善が見られない場合、学習を停止
)

# テストデータに対する予測
y_pred = model.predict(X_test, num_iteration=model.best_iteration)

```


この下記のparamsが**ハイパーパラメータ**になります。
簡単に説明すると「**機械学習アルゴリズムの挙動を設定するパラメータ**」になります。

```param.py
params = {
    'objective': 'binary',         # 目的関数としてバイナリ分類を指定（2値分類問題を解くため）
    'max_bin': 300,                # ヒストグラムを作る際の最大ビン数。特徴量の値を300ビンに分けて計算し、メモリ使用量と精度に影響。
    'learning_rate': 0.05,         # 学習率。モデルの更新幅を調整し、小さい値ほどゆっくり学習して過学習を防ぐが、学習に時間がかかる。
    'num_leaves': 40               # 決定木の最大リーフ数。モデルの複雑さを調整し、過学習のリスクを低減するため、リーフ数を適度に制限。
}

```

params: モデルのハイパーパラメータを定義する辞書です。
例えば以下のようなパラメータが含まれます:

- **objective** : binary
    2クラス分類タスク（例: 0と1の分類）に対応する目的関数を設定。
- **max_bin**: 300
    ヒストグラムベースの学習方法で使われるビンの数を制限。ビンが多いほど特徴量の精度が高くなるが、計算コストも増える。
- **learning_rate**: 0.05
    小さくすることで、1回の更新でのモデルの変化を抑え、過学習を防ぐ。逆に、大きすぎると学習が急激に進みすぎて、最適解に到達できない可能性がある。
- **num_leaves**: 40
    決定木の葉の数。多くするとモデルの複雑さが増し、過学習のリスクが高まる。少なくするとモデルが単純になり、精度が低下する可能性がある。

## 最後に
　ハイパーパラメータとは、機械学習モデルの挙動や性能を左右する設定値の項目になります。アルゴリズム自体が自動で学習する「パラメータ」（例えば、線形回帰モデルの係数など）とは異なり、ハイパーパラメータはモデルの学習方法や複雑さを事前に定めるための「設定値」です。
 このように、ハイパーパラメータは機械学習モデルの質を左右する非常に重要な要素であり、正確な調整が成功するモデルの鍵となります