Python
機械学習
材料
MaterialsProject
pymatgen

Materials Project の API を利用してみた(メモ)

導入

@KentoObata さんの素晴らしい記事
機械学習でなんとなく材料研究者の気分を味わおう
に触発されて Materials Project の API を使ってデータを入手してみました。
あんまり日本語の情報がないみたいなので、メモを残しておきます。

参考記事

機械学習でなんとなく材料研究者の気分を味わおう
Citrine:MACHINE LEARNING FOR THE MATERIALS SCIENTIST

やったこと

上記参考記事と同様に、binary の計算データ(VASP)を入手しました。
目的変数はバンドギャップと形成エネルギー。
説明変数は組成......だけでは味気ないので、他の色々な計算値も考えることにします。
 ▶︎目的変数:formation_energy_per_atom, band_gap
 ▶︎説明変数:pretty_formula, volume, density, nsites, spacegroup, total_magnetization

必要なもの

  • Python 3.x
  • pymatgen

Materials Project の APIキー入手

Materials Project にユーザー登録。
その後ログインしてAPIのページを見ると書いてあるのでコピペしてください。

データの取得

1時間もするとデータを取得できる、はず。
sleep とか書いてないのでマナー悪そうですが、そのあたりは pymatgen の方で調整してくれています。多分。

feature.py
from pymatgen import MPRester
import itertools

file = open('feature.csv', 'w')
file.write('pretty_formula,volume,density,nsites,spacegroup,total_magnetization,formation_energy_per_atom,band_gap\n')

API_KEY = 'Your API-KEY' # Materials Project の API をここに入れる

# pymatgen は 103 元素扱えるので、binary は C(103,2) = 5253 パターンありえる
all_symbols = ["H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr"]
allBinaries = itertools.combinations(all_symbols, 2) 

with MPRester(API_KEY) as m:
    for system in allBinaries:
        results = m.get_data(system[0] + '-' + system[1], data_type='vasp') # 計算データ(VASP)を入手
        for material in results:
            if material['e_above_hull'] < 1e-6: # 熱力学的安定性のチェック。凸包上にデータがあればその物質は安定(分解しない)。
                output = material['pretty_formula'] + ',' 
                       + str(material['volume']) + ',' 
                       + str(material['density']) + ',' 
                       + str(material['nsites']) + ',' 
                       + str(material['spacegroup']['number']) + ','
                       + str(material['total_magnetization']) + ','
                       + str(material['formation_energy_per_atom']) + ',' 
                       + str(material['band_gap'])
                file.write(output + '\n')

file.close()

その後は?

これで feature.csv にデータが格納されました。
あとは参考記事みたいに入手したデータを元に pymatgen を用いて説明変数を追加して、
バンドギャップや形成エネルギーの予測をしてみるといいのではないでしょうか。

備考

  • 本当はバンドギャップの値がゼロなのに有限の値となっているものがあります。
    VASPの計算データだとよくあることなので、解析前にはちゃんとデータを確認するようにしましょう。
    (単位胞あたりの電子数が奇数なら、普通はバンドギャップはゼロとなります)

  • 一度バンドギャップのヒストグラムを描くとわかるのですが、入手したデータのほとんどのバンドギャップの値はゼロです。バンドギャップの予測精度が悪いのは、このデータの偏りが原因でしょう。

  • 今回は結晶構造データは取り出しませんでした。多分、構造データもあった方が予測精度があがるので、そのうち情報を追加します。