# 機械学習ガイド ラマンスペクトルデータを用いた機械学習モデルの構築 --- ## 📋 目次 - {ref}`機械学習の基礎 ` - {ref}`データ準備 ` - {ref}`アルゴリズム選択 ` - {ref}`モデルトレーニング ` - {ref}`モデル評価 ` - {ref}`ハイパーパラメータ調整 ` - {ref}`特徴量選択 ` - {ref}`モデルの解釈 ` - {ref}`予測と実運用 ` --- (ug-ml-basics)= ## 機械学習の基礎 ### 機械学習とは ``` 定義: データからパターンを学習し、 新しいデータに対して予測を行う手法 ラマン分光での応用: - 化合物の識別・分類 - 品質管理 - 濃度予測 - 異常検出 - 偽造品検出 ``` ### 学習パラダイム #### 教師あり学習 ``` ラベル(正解)付きデータから学習 分類: 目的: カテゴリを予測 例: - サンプルA、B、Cの識別 - 合格/不合格の判定 - 正常/異常の検出 回帰: 目的: 連続値を予測 例: - 濃度の予測 - 純度の推定 ``` #### 教師なし学習 ``` ラベルなしデータから構造を発見 クラスタリング: - グループの自動発見 - 外れ値検出 次元削減: - PCA、UMAP(前処理や可視化に使用) ``` ### ワークフロー ``` 1. データ準備 ├── データ分割(Train/Test) ├── 前処理 └── 特徴量エンジニアリング 2. モデル選択 └── アルゴリズムの選択 3. トレーニング ├── モデルの学習 └── ハイパーパラメータ調整 4. 評価 ├── 精度メトリクス ├── 混同行列 └── クロスバリデーション 5. 予測 └── 新しいデータへの適用 ``` --- (ug-ml-data-prep)= ## データ準備 ### データ分割 #### Train/Test分割 ``` 機械学習タブ → 設定 → データ分割 推奨分割: - トレーニング: 70% - テスト: 30% または - トレーニング: 60% - 検証: 20% - テスト: 20% 重要: ランダムシードを設定 random_seed: 42(再現性のため) ``` #### 層化分割(Stratified Split) ``` 設定 → データ分割: □ 層化分割を使用 効果: 各クラスの比率を維持 例: 全データ: - クラスA: 60サンプル(60%) - クラスB: 40サンプル(40%) トレーニングセット(70サンプル): - クラスA: 42サンプル(60%) - クラスB: 28サンプル(40%) テストセット(30サンプル): - クラスA: 18サンプル(60%) - クラスB: 12サンプル(40%) ``` ### クロスバリデーション ``` 設定 → クロスバリデーション: □ CVを有効化 パラメータ: n_folds: 5(推奨) 仕組み: データを5つに分割 各分割を1回ずつテストセットとして使用 評価: 5回の平均精度 ± 標準偏差 利点: - より信頼性の高い評価 - すべてのデータを使用 - 過学習の検出 例: Fold 1: 85% Fold 2: 88% Fold 3: 86% Fold 4: 87% Fold 5: 84% 平均: 86% ± 1.5% → 安定したモデル ``` ### 前処理パイプライン ``` 機械学習の前に必須の前処理: 1. ベースライン補正 AsLS(lambda=100000, p=0.01) 2. スムージング Savitzky-Golay(window=11, polyorder=3) 3. 正規化 ベクトルノルム または SNV (オプション) 4. 次元削減 PCA(n_components=50-100) 5. 微分 一次微分(特徴を強調したい場合) ``` --- (ug-ml-algorithms)= ## アルゴリズム選択 ### Random Forest #### 特徴 ``` 決定木の集合(アンサンブル) 利点: ✓ 高精度 ✓ 過学習に強い ✓ 特徴量の重要度を提供 ✓ ハイパーパラメータ調整が比較的簡単 ✓ 初心者に優しい 欠点: ✗ 解釈性が低い(ブラックボックス) ✗ モデルサイズが大きい ``` #### 主要パラメータ ``` n_estimators: 木の数 - デフォルト: 100 - 推奨: 100-500 - 多いほど精度向上(計算時間とトレードオフ) max_depth: 木の最大深さ - デフォルト: None(無制限) - 過学習の場合: 5-20に制限 min_samples_split: 分割に必要な最小サンプル数 - デフォルト: 2 - 過学習の場合: 5-10に増やす min_samples_leaf: 葉の最小サンプル数 - デフォルト: 1 - 過学習の場合: 2-5に増やす max_features: 各分割で考慮する特徴量数 - 'sqrt': √(n_features)(推奨) - 'log2': log₂(n_features) - None: すべての特徴量 ``` #### 使用例 ``` 機械学習タブ → アルゴリズム → Random Forest 基本設定: n_estimators: 200 max_depth: None min_samples_split: 2 max_features: 'sqrt' → トレーニング 期待される結果: - トレーニング精度: 90-95% - テスト精度: 85-90% - 計算時間: 10-60秒 ``` ### SVM(Support Vector Machine) #### 特徴 ``` 利点: ✓ 高次元データに強い ✓ 少数のサンプルでも動作 ✓ 理論的基盤が強固 ✓ カーネルトリックで非線形境界 欠点: ✗ 大規模データでは遅い ✗ ハイパーパラメータ調整が重要 ✗ 確率推定が直接的でない ``` #### 主要パラメータ ``` C: 正則化パラメータ - 小さい(0.1): 単純なモデル、汎化性高い - 大きい(10): 複雑なモデル、過学習リスク - デフォルト: 1.0 kernel: カーネル関数 - 'linear': 線形分離可能な場合 - 'rbf': 非線形(デフォルト、推奨) - 'poly': 多項式 - 'sigmoid': シグモイド gamma: RBFカーネルのパラメータ - 'scale': 1 / (n_features × X.var())(推奨) - 'auto': 1 / n_features - 小さい: 滑らかな決定境界 - 大きい: 複雑な決定境界 ``` #### 使用例 **線形SVM(高速、解釈しやすい)** ``` 機械学習タブ → SVM → Linear 設定: C: 1.0 kernel: 'linear' 適用ケース: - 線形分離可能なデータ - 特徴量の重要度を知りたい - 高速処理が必要 ``` **RBF SVM(非線形、高精度)** ``` 機械学習タブ → SVM → RBF 設定: C: 1.0 kernel: 'rbf' gamma: 'scale' 適用ケース: - 非線形な決定境界 - 高精度が必要 - サンプル数が中程度(< 10,000) ``` ### XGBoost #### 特徴 ``` 勾配ブースティング決定木 利点: ✓ 最高の精度(多くの場合) ✓ 欠損値の処理 ✓ 正則化機能 ✓ 早期停止 欠点: ✗ ハイパーパラメータが多い ✗ 調整に時間がかかる ✗ やや遅い ``` #### 主要パラメータ ``` n_estimators: 木の数 - 推奨: 100-300 - 早期停止と組み合わせる max_depth: 木の深さ - デフォルト: 6 - 推奨: 3-10 - 深すぎると過学習 learning_rate(eta): 学習率 - デフォルト: 0.3 - 推奨: 0.01-0.3 - 小さいほど汎化性能向上(n_estimators増やす) subsample: サンプルのサブサンプリング比率 - デフォルト: 1.0 - 推奨: 0.8-1.0 - 過学習防止 colsample_bytree: 特徴量のサブサンプリング - デフォルト: 1.0 - 推奨: 0.8-1.0 reg_lambda: L2正則化 - デフォルト: 1.0 - 過学習の場合: 増やす reg_alpha: L1正則化 - デフォルト: 0 - スパース解が必要な場合: 増やす ``` #### 使用例 **基本設定** ``` 機械学習タブ → XGBoost 設定: n_estimators: 200 max_depth: 6 learning_rate: 0.1 subsample: 0.8 colsample_bytree: 0.8 → トレーニング 期待される結果: - 最高の精度 - 計算時間: 1-10分 ``` **高速設定** ``` tree_method: 'hist' n_estimators: 100 max_depth: 3 learning_rate: 0.3 用途: 迅速な探索 ``` **高精度設定** ``` n_estimators: 500 max_depth: 8 learning_rate: 0.01 subsample: 0.8 colsample_bytree: 0.8 reg_lambda: 2.0 early_stopping_rounds: 20 用途: 最終モデル ``` ### ロジスティック回帰 #### 特徴 ``` 線形モデル 利点: ✓ 非常に高速 ✓ 解釈しやすい(係数の意味) ✓ 確率出力 ✓ 過学習しにくい 欠点: ✗ 線形分離のみ ✗ 複雑なパターンは捉えられない ``` #### パラメータ ``` C: 正則化の強さの逆数 - デフォルト: 1.0 - 小さい: 強い正則化(単純なモデル) - 大きい: 弱い正則化(複雑なモデル) penalty: 正則化タイプ - 'l2'(Ridge): デフォルト、推奨 - 'l1'(Lasso): スパース解 - 'elasticnet': L1 + L2 solver: 最適化アルゴリズム - 'lbfgs': デフォルト、小〜中規模データ - 'liblinear': 小規模データ - 'saga': 大規模データ、elasticnet対応 ``` #### 使用例 ``` 機械学習タブ → ロジスティック回帰 設定: C: 1.0 penalty: 'l2' solver: 'lbfgs' max_iter: 100 適用ケース: - ベースラインモデル - 高速処理が必要 - モデルの解釈が重要 - 線形分離可能なデータ ``` --- (ug-ml-training)= ## モデルトレーニング ### 基本的なトレーニング ``` 機械学習タブ → トレーニング: ステップ: 1. アルゴリズムを選択 2. パラメータを設定 3. 「トレーニング開始」をクリック 進行状況: プログレスバーとログが表示 完了後: - トレーニング精度 - テスト精度 - 計算時間 - モデルの保存 ``` ### グリッドサーチ ``` 設定 → ハイパーパラメータ調整 → グリッドサーチ 定義: 複数のパラメータ組み合わせを網羅的に探索 例(Random Forest): n_estimators: [100, 200, 500] max_depth: [None, 10, 20] min_samples_split: [2, 5, 10] → 3 × 3 × 3 = 27 組み合わせを評価 各組み合わせでクロスバリデーション 最良の組み合わせを自動選択 注意: - 計算時間: CV折数 × 組み合わせ数 - 5-fold CV × 27組み合わせ = 135回のトレーニング ``` #### 効率的なグリッドサーチ ``` 探索範囲を絞る: 粗い探索: n_estimators: [100, 500] max_depth: [5, 20] 結果: max_depth=5が良い 細かい探索: max_depth: [3, 5, 7, 10] 段階的に絞り込む ``` ### ランダムサーチ ``` 設定 → ハイパーパラメータ調整 → ランダムサーチ グリッドサーチとの違い: - ランダムに組み合わせをサンプリング - 指定した回数だけ評価 利点: - より効率的 - 広い範囲を探索可能 - 計算時間を制御しやすい 例: n_iter: 30(30組み合わせを試す) → 5-fold CV × 30 = 150回のトレーニング ``` --- (ug-ml-evaluation)= ## モデル評価 ### 分類メトリクス #### 精度(Accuracy) ``` 定義: 正しく分類されたサンプルの割合 Accuracy = (TP + TN) / (TP + TN + FP + FN) TP: 真陽性 TN: 真陰性 FP: 偽陽性 FN: 偽陰性 解釈: 90%精度 = 100サンプル中90が正解 注意: 不均衡データでは誤解を招く 例: 99サンプルがクラスA、1サンプルがクラスB すべてクラスAと予測 → 精度99% (実際はクラスBを全く検出できていない) ``` #### 適合率(Precision) ``` 定義: 陽性と予測したもののうち、実際に陽性だった割合 Precision = TP / (TP + FP) 解釈: - 高い: 陽性予測が信頼できる - 偽陽性が少ない 用途: 偽陽性のコストが高い場合 例: 疾病診断(誤って陽性と診断するコスト) ``` #### 再現率(Recall / Sensitivity) ``` 定義: 実際の陽性のうち、正しく検出できた割合 Recall = TP / (TP + FN) 解釈: - 高い: 陽性をよく検出できる - 偽陰性が少ない 用途: 偽陰性のコストが高い場合 例: がん検診(見逃すことのコスト) ``` #### F1スコア ``` 定義: 適合率と再現率の調和平均 F1 = 2 × (Precision × Recall) / (Precision + Recall) 解釈: - PrecisionとRecallのバランス - 不均衡データでも有用 目標: F1 > 0.8: 良好 F1 > 0.9: 優秀 ``` ### 混同行列 ``` 機械学習タブ → 評価 → 混同行列 表示例(3クラス): 予測 A B C 実 A [45 3 2] 際 B [ 2 48 1] C [ 1 2 47] 解釈: 対角線上: 正しい予測 対角線外: 誤り 詳細分析: - AをBと誤分類: 3サンプル - BをCと誤分類: 1サンプル → どのクラス間で混同が起きているかわかる ``` ### ROC曲線とAUC ``` 2クラス分類の評価 ROC曲線: X軸: 偽陽性率(FPR) Y軸: 真陽性率(TPR = Recall) AUC(Area Under Curve): 0.5: ランダム 0.7-0.8: 良好 0.8-0.9: 優秀 > 0.9: 非常に優秀 用途: - 閾値に依存しない評価 - モデル間の比較 ``` ### クロスバリデーション結果 ``` 機械学習タブ → 評価 → CV結果 表示: Fold 1: 85.3% Fold 2: 87.8% Fold 3: 86.1% Fold 4: 84.9% Fold 5: 86.5% 平均: 86.1% 標準偏差: 1.1% 解釈: - 標準偏差が小さい: 安定したモデル - 標準偏差が大きい: 不安定(過学習の可能性) 目標: 標準偏差 < 3% ``` --- (ug-ml-hyperparams)= ## ハイパーパラメータ調整 ### 学習曲線 ``` 機械学習タブ → 診断 → 学習曲線 表示: X軸: トレーニングサンプル数 Y軸: スコア 2本の曲線: - トレーニングスコア - 検証スコア 診断: パターン1: 過学習 訓練スコア: 高い(95%) 検証スコア: 低い(70%) → 正則化を増やす、データを増やす パターン2: 過小適合 訓練スコア: 低い(65%) 検証スコア: 低い(60%) → より複雑なモデル、特徴量を追加 パターン3: 良好 訓練スコア: 高い(90%) 検証スコア: やや低い(85%) → バランスが取れている ``` ### 検証曲線 ``` 機械学習タブ → 診断 → 検証曲線 パラメータを選択(例: max_depth) 表示: X軸: パラメータ値 Y軸: スコア 2本の曲線: - トレーニングスコア - 検証スコア 最適値の特定: 検証スコアが最大のパラメータ値を選択 ``` --- (ug-ml-feature-selection)= ## 特徴量選択 ### 特徴量の重要度 ``` 機械学習タブ → 特徴量の重要度 Random Forest / XGBoostで利用可能 表示: 棒グラフ: 各波数の重要度 解釈: - 高い値: 分類に重要な波数 - 低い値: あまり重要でない 活用: 1. 重要な波数を特定 2. 化学的解釈(どの結合が重要か) 3. 特徴量選択(重要度の低い波数を除去) ``` ### RFE(Recursive Feature Elimination) ``` 設定 → 特徴量選択 → RFE 手順: 1. すべての特徴量でモデルを訓練 2. 最も重要度の低い特徴量を削除 3. 繰り返す 4. 指定した数の特徴量まで削減 パラメータ: n_features_to_select: 50-100 利点: - モデル性能の維持 - 計算時間の短縮 - 過学習の防止 ``` ### 分散閾値法 ``` 設定 → 特徴量選択 → 分散閾値 原理: 分散が低い特徴量(ほぼ定数)を除去 閾値: 0.01 理由: 分散が低い = すべてのサンプルで類似 → 識別に役立たない ``` --- (ug-ml-interpretation)= ## モデルの解釈 ### 混同しやすいサンプルの分析 ``` 機械学習タブ → 診断 → 誤分類分析 表示: 誤って分類されたサンプルのリスト 分析: 1. これらのサンプルの共通点 2. スペクトルの特徴 3. データ品質の問題 対策: - より多くの類似サンプルを収集 - 前処理の改善 - より複雑なモデルの使用 ``` ### SHAP(予測の説明:SHapley Additive exPlanations) **目的**: 1つのスペクトル(サンプル)に対して、予測に寄与した波数(特徴量)を可視化します。 **使い方(アプリ内の流れ)**: 1. 機械学習タブでモデルを学習します。 2. **SHAP** をクリックします(再学習は不要)。 3. SHAPパラメータ設定ダイアログで、以下を選択します: - 説明対象(学習/テスト) - データセットとスペクトル番号 - 背景サンプル数 / Max evals / 表示する特徴量数(表示される場合) 4. 結果は **モーダルダイアログ** で表示され、進捗が表示されます。 **表示内容(タブ)**: - **Spectrum(スペクトル)**: 選択したスペクトル - **SHAP**: 波数軸に沿った寄与度バー(特徴量ごとのSHAP値) - **赤**:正の寄与(予測クラス方向へ押す) - **青**:負の寄与(予測クラスから遠ざける) - **Summary / Report**: 予測クラス名・確率、寄与度上位の表 - **Provenance**: データセット/サンプル由来(取得できる場合) **出力(Export)**: Export から、プロット画像・寄与度表(CSV)・生データ(JSON)をまとめて保存できます。 **性能メモ**: - 特徴量(波数点)が多いと計算に時間がかかります。 - **背景サンプル数** と **Max evals** を増やすほど時間が増える傾向があります。 - 長時間になる場合は **停止(Stop)** でキャンセルできます(協調的キャンセルのため、即時停止ではない場合があります)。 --- (ug-ml-deployment)= ## 予測と実運用 ### 新しいデータへの予測 ``` 機械学習タブ → 予測 ステップ: 1. 新しいデータをロード 2. 同じ前処理を適用(自動) 3. 予測を実行 結果: - 予測クラス - 確率(各クラスの確率) - 信頼度 例: サンプル1: 予測: クラスA 確率: A=0.85, B=0.10, C=0.05 信頼度: 高 サンプル2: 予測: クラスB 確率: A=0.35, B=0.40, C=0.25 信頼度: 低(要確認) ``` ### モデルの保存と読み込み ``` モデル → 保存: ファイル名: model_20260124.pkl 含まれる内容: - トレーニング済みモデル - 前処理パイプライン - スケーラー - メタデータ 読み込み: 機械学習タブ → モデルを読み込む → ファイルを選択 → 予測に使用 ``` ### バッチ予測 ``` 機械学習タブ → バッチ予測 手順: 1. 複数のファイルを選択 2. 自動的に前処理と予測 3. 結果をエクスポート 出力(CSV): Filename,PredictedClass,Prob_A,Prob_B,Prob_C,Confidence sample001.csv,A,0.85,0.10,0.05,High sample002.csv,B,0.15,0.75,0.10,High sample003.csv,C,0.20,0.30,0.50,Medium ``` ### モデルの更新 ``` 状況: 新しいデータが利用可能になった オプション1: 再トレーニング すべてのデータで新しいモデルを訓練 オプション2: 増分学習 既存モデルに新しいデータを追加 (一部のアルゴリズムのみ対応) 推奨: 定期的に再トレーニング(月1回など) ``` --- ## 🔗 関連ドキュメント - **[前処理ガイド](preprocessing.md)** - データの前処理 - **[分析ガイド](analysis.md)** - 探索的分析 - **[FAQ](../faq.md)** - よくある質問 - **[トラブルシューティング](../troubleshooting.md)** - 問題解決 --- **最終更新**: 2026年1月24日 | **バージョン**: 1.0.0