復習6日目その②_20251128
バンドギャップ予測アプリの作成について

https://k-stone.click/2025/11/18/バンドギャップ予測アプリ作成中/
https://k-stone.click/2025/11/19/簡易バンドギャップ予測アプリ作成中 その2 /
絵画分類器アプリと比べて、
- UIが複雑
- 入力項目が多い
- モデルが古い可能性がある
- データ理解が必要
一旦やったことを整理してから、学習開始する。近々に待てインフォのアプリを作る。
📘 **2026/11/16(日)
本日は「バンドギャップ予測アプリ」を作るための前処理データを取得し、
機械学習向けにデータセットを整えるところまで進めました。
やったことは大きく 3つ:
-
Materials Project(mp-api)でデータ取得(Python)
-
KNIME で特徴量の整形と前処理、ここでの予測精度はrandom forest で、MSE=0.937, RMSE=0.968
-
Python で使う軽量データを作成
- Javascriptでローカルアプリとし、ブログの記事の一つとして公開。ローカルアプリで線形予測のため予測精度はよくない。
構造からバンドギャップを予測するアプリをつくっていきたい。
-
完全な構造(structure オブジェクト)を扱う本格的ML ではないが、「結晶の大まかな指標」から band_gap を予測するライトな構造予測アプリ とする。
| 特徴量 | 意味 |
|---|---|
| density | 密度(構造に依存) |
| volume | 単位格子の体積 |
| nsites | 原子サイト数(単位格子内の原子の数) |
| crystal_system | 結晶系(Cubic / Hexagonal / Tetragonal…) |
| spacegroup_symbol | 空間群(構造のシンメトリー情報) |
Day7以降に着手するために、概要を以下に記載する。
🌙 レベル2:構造そのもの(CIF / structure)→ バンドギャップ予測アプリ
〜 Day7 が終わったら取り組むための“全体像のまとめ” 〜
🧭 目的
「材料の構造(CIF or MP-ID)を入力すると、構造特徴量を matminer で計算して band_gap を予測するアプリを作る」
| フェーズ | 工程 | 具体内容 | 成果物 |
|---|---|---|---|
| 1. 環境準備 | Python環境構築 | python3-venv / pip install(mp-api, matminer, pymatgen, pandas, scikit-learn) | venv + 必要ライブラリ |
| プロジェクト作成 | materials-ai/ フォルダ構成を作成 |
directory structure | |
| 2. データ取得 | Materials Project API設定 | API KEY 発行、.env に保存 |
API_KEY |
| structure付きデータのダウンロード | fields = material_id / band_gap / structure / density など | raw_data.json / pickle | |
| CSV化 | material_id, band_gap, density, volume などを dataframe 化 | bandgap_raw.csv | |
| 3. 特徴量エンジニアリング(matminer) | 構造解析 | pymatgen で Structure オブジェクトを読み込み | structure list |
| 特徴量抽出① | SiteStatsFingerprint | features_ssf.csv | |
| 特徴量抽出② | GlobalSymmetryFeatures | features_gsf.csv | |
| 特徴量抽出③ | BondFractions / StructureHeterogeneity など | additional_features.csv | |
| 特徴量統合 | すべての特徴量+band_gap の統合DF作成 | features_merged.csv | |
| 欠損値・外れ値の処理 | dropna / 基本統計量確認 | clean_features.csv | |
| 4. モデル作成(ML) | 訓練/テスト分割 | train_test_split | X_train, X_test |
| モデル① | RandomForestRegressor でベースライン | rf_model.pkl | |
| モデル② | LightGBM / XGBoost で高精度化 | lgbm_model.pkl | |
| モデル③(オプション) | ニューラルネット(Keras) | nn_model.h5 | |
| 評価 | RMSE / MAE / R² / Feature importance | evaluation_report.md | |
| 5. Flaskアプリ化 | ルーティング設計 | material_id → structure取得 → 特徴量 → 予測 | app.py |
| 入力フォーム作成 | material_id / CIFアップロードに対応 | templates/index.html | |
| 結果ページ作成 | bandgap予測値の表示 | templates/result.html | |
| エラーハンドリング | 無効な mp-id、APIエラー対応 | improved app | |
| 6. Docker化 | Dockerfile作成 | python3.10, app.py, requirements.txt | Dockerfile |
| docker-compose | Flask サービス追加(port=9001等) | docker-compose.yml | |
| 動作確認 | localhost:9001 で予測実行 | Flaskコンテナ | |
| 7. サーバ公開(AWS) | EC2へデプロイ | SCP / Git で転送 | kaiga-app / bandgap-app |
| Nginx設定 | /bandgap/ → Flaskコンテナへ proxy_pass |
nginx.conf | |
| HTTPS化確認 | certbot 自動更新 | SSL ready | |
| 8. WordPress連携 | 固定ページ作成 | 「バンドギャップ予測」ページ | WP固定ページ |
| 埋め込み | <iframe src="/bandgap/"> または リンク |
完全統合 | |
| ログイン制御(オプション) | Google OAuth でログイン済のみ実行 | security added | |
| 9. UI改善 | CSS調整 | カラー、フォント、ボタン、エラー画面 | responsive UI |
| 画像/構造可視化(発展) | Crystal Toolkit / 3D構造表示 | advanced interface | |
| 10. 運用 | モデル更新 | Materials Project の新しいデータに対応 | update script |
| ログ記録 | Flask / Nginx ログ整備 | monitoring | |
| バックアップ | model.h5, データ、設定のバックアップ | stable ops |
より具体的には以下
🥇 STEP 1:構造データの収集(mp-api)
▼ やること
-
Materials Project API からstructure(pymatgenのStructureオブジェクト)付きデータを取得するスクリプトを作る。
▼ 必要なフィールド例
▼ このステップのゴール
-
structures_dataset.pkl(構造オブジェクト入り) -
summary_dataset.csv(簡易的な表)
🥈 STEP 2:matminer で構造特徴量を生成
▼ 代表的な構造特徴量(まずはここから)
-
StructureFingerprint
-
SiteStatsFingerprint
-
BondFractions
-
GlobalSymmetryFeatures
-
StructuralHeterogeneity
※ いきなり全部やる必要はなく、
最初は 1〜2個のフィーチャライザでOK
▼ 生成方法の概要
▼ このステップのゴール
-
100〜300次元くらいの特徴量データを作成
-
CSV に統合して保存
🥉 STEP 3:機械学習モデルの学習
▼ 検討するモデル
-
RandomForestRegressor
-
GradientBoostingRegressor
-
XGBoost / LightGBM
-
Neural Network
最初は RandomForest で十分。
▼ 評価指標
-
MAE(平均絶対誤差)
-
RMSE
▼ このステップのゴール
-
bandgap_structure_model.joblib -
scaler.pkl(標準化した場合)
🟦 STEP 4:Flask アプリ化(構造→推論)
ユーザーがCIF ファイルをアップロード
(将来の発展版)
-
ユーザーが CIF をアップロード
-
Flask が pymatgen で Structure に変換
-
特徴量を作成
-
予測値を返す
🟩 STEP 5:Docker化 → /band2/ で公開
-
Dockerfile(python:3.10)
-
docker-compose に
bandgap2サービス追加 -
Nginx に:
-
WordPress に
/band2/の固定ページを作成