復習6日目その②_20251128

IT

バンドギャップ予測アプリの作成について

https://k-stone.click/2025/11/18/バンドギャップ予測アプリ作成中/

https://k-stone.click/2025/11/19/簡易バンドギャップ予測アプリ作成中 その2 /

 

絵画分類器アプリと比べて、

  • UIが複雑
  • 入力項目が多い
  • モデルが古い可能性がある
  • データ理解が必要

一旦やったことを整理してから、学習開始する。近々に待てインフォのアプリを作る。


📘 **2026/11/16(日)

本日は「バンドギャップ予測アプリ」を作るための前処理データを取得し、
機械学習向けにデータセットを整えるところまで進めました。

やったことは大きく 3つ:

  1. Materials Project(mp-api)でデータ取得(Python)

  2. KNIME で特徴量の整形と前処理、ここでの予測精度はrandom forest で、MSE=0.937, RMSE=0.968

  3. Python で使う軽量データを作成

  4. 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オブジェクト)付きデータを取得するスクリプトを作る。

▼ 必要なフィールド例

structure
band_gap
material_id
formula_pretty
density
volume
nsites

▼ このステップのゴール

  • structures_dataset.pkl(構造オブジェクト入り)

  • summary_dataset.csv(簡易的な表)


🥈 STEP 2:matminer で構造特徴量を生成

▼ 代表的な構造特徴量(まずはここから)

  • StructureFingerprint

  • SiteStatsFingerprint

  • BondFractions

  • GlobalSymmetryFeatures

  • StructuralHeterogeneity

※ いきなり全部やる必要はなく、
最初は 1〜2個のフィーチャライザでOK

▼ 生成方法の概要

from matminer.featurizers.structure import SiteStatsFingerprint
ssf = SiteStatsFingerprint.from_preset("coordination")

features = ssf.featurize(structure)

▼ このステップのゴール

  • 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/ で公開

  1. Dockerfile(python:3.10)

  2. docker-compose に bandgap2 サービス追加

  3. Nginx に:

location /band2/ {
proxy_pass http://bandgap2:5000/;
}
  1. WordPress に /band2/ の固定ページを作成