Pythonの型ヒントを機械学習コードに導入する方法【品質向上と保守性アップ】

Pythonの型ヒントを機械学習コードに導入する方法【品質向上と保守性アップ】 AI資格・学習

はじめに

機械学習のコードは実験的な性質上、型ヒントなしで書かれていることが多いです。でも実務でチーム開発をする場合や、後から自分のコードを読み返すとき、型ヒントがあるとぐっと読みやすくなります。Pythonの型ヒントを機械学習コードに導入する方法を紹介します。

型ヒントの基本

from typing import Optional, Union, List, Dict, Tuple
import numpy as np
import pandas as pd

# 基本的な型ヒント
def add_numbers(a: int, b: int) -> int:
    return a + b

# NumPy配列の型ヒント
def scale_features(X: np.ndarray, mean: float, std: float) -> np.ndarray:
    return (X - mean) / std

# pandas DataFrameの型ヒント
def load_and_clean(filepath: str) -> pd.DataFrame:
    df = pd.read_csv(filepath)
    df = df.dropna()
    return df

# Optional(Noneも許容)
def get_feature_importance(
    model,
    feature_names: Optional[List[str]] = None
) -> Dict[str, float]:
    importances = model.feature_importances_
    if feature_names is None:
        feature_names = [f'feature_{i}' for i in range(len(importances))]
    return dict(zip(feature_names, importances))

機械学習パイプラインへの型ヒント適用

from dataclasses import dataclass
from typing import Tuple, Optional
import numpy as np
import pandas as pd
from sklearn.base import BaseEstimator

@dataclass
class ModelConfig:
    n_estimators: int = 100
    learning_rate: float = 0.1
    max_depth: int = 5
    random_state: int = 42

class MLPipeline:
    def __init__(self, config: ModelConfig) -> None:
        self.config = config
        self.model: Optional[BaseEstimator] = None
        self.feature_names: Optional[List[str]] = None
    
    def preprocess(
        self,
        df: pd.DataFrame,
        target_col: str
    ) -> Tuple[np.ndarray, np.ndarray]:
        """データを特徴量とターゲットに分割して返す"""
        X = df.drop(columns=[target_col]).values
        y = df[target_col].values
        self.feature_names = list(df.drop(columns=[target_col]).columns)
        return X, y
    
    def train(self, X: np.ndarray, y: np.ndarray) -> 'MLPipeline':
        """モデルを学習する。メソッドチェーンのためselfを返す"""
        import lightgbm as lgb
        self.model = lgb.LGBMClassifier(
            n_estimators=self.config.n_estimators,
            learning_rate=self.config.learning_rate,
            max_depth=self.config.max_depth,
            random_state=self.config.random_state
        )
        self.model.fit(X, y)
        return self
    
    def predict(self, X: np.ndarray) -> np.ndarray:
        """予測値を返す"""
        if self.model is None:
            raise ValueError('モデルが学習されていません。train()を先に実行してください。')
        return self.model.predict(X)

# 使用例
config = ModelConfig(n_estimators=200, learning_rate=0.05)
pipeline = MLPipeline(config)
X, y = pipeline.preprocess(df, target_col='target')
pipeline.train(X, y)

mypyで静的型チェック

pip install mypy

# 型チェックの実行
mypy ml_pipeline.py --ignore-missing-imports

まとめ

型ヒントを機械学習コードに導入することで、コードの可読性・保守性が大幅に向上します。dataclassを使った設定クラス、Optional型の使い方、NumPy・pandasの型ヒントから始めてみましょう。チーム開発やポートフォリオコードの品質を上げたい方にとって、型ヒントは費用対効果の高いスキルです。

📌 プログラミング・AI学習のおすすめスクール

※本記事にはアフィリエイトリンクが含まれます。

コメント

タイトルとURLをコピーしました