はじめに
DeepChemでScaffoldSplitterを普通に使ったところ、掲題のエラーが発生したので調べたときのメモ
環境
- python 3.6
- deepchem 2.2.1.dev54
- rdkit 2019.03.3.0
現象
splitterにScaffoldSplitterを指定して意気揚々とCross-Validationをやろうとしたら、deepchem.data.CSVLoaderでcsvファイルを読み込もうとした時に、以下エラーが発生。
File "C:\Users\XXX\AppData\Local\conda\conda\envs\yyy\lib\site-packages\rdkit\Chem\Scaffolds\MurckoScaffold.py", line
108, in MurckoScaffoldSmiles
raise ValueError('No molecule provided')
ValueError: No molecule provided
原因と解決策
エラーログを元に色々見たところ、deepchem.splits.splitters.pyの870行目に以下を発見。
for ind, smiles in enumerate(dataset.ids):
if ind % log_every_n == 0:
log("Generating scaffold %d/%d" % (ind, data_len), self.verbose)
scaffold = generate_scaffold(smiles)
if scaffold not in scaffolds:
scaffolds[scaffold] = [ind]
else:
scaffolds[scaffold].append(ind)
dataset.idsからsmilesとってんじゃん。CSVLoaderでid_fieldを明示的に指定した場合は、そこにはsmilesは格納されないわけだから、そのフィールドをsmilesと勝手に判断し、molに変換したらそりゃー、'No molecule provided'が発生するよ。
といっても、こんなファイル修正しようがないのでScaffoldSplitterを使う場合は、CSVLoaderのid_fieldsは指定しないようにしましょう。
そうすると、id_fieldにsmiles_fieldsの値が設定されるっぽいので、結果オーライです。
id_fieldが何に使われてるか知らんけど、まあ今のところ大丈夫っぽい。
loader = dc.data.CSVLoader(tasks=[args.target_col],
# id_field=args.id_col, # ここはコメントオフにしよう。
smiles_field=args.smiles_col,
featurizer=featurizer)
おわりに
OSSを使う場合は、適度にソースも見ながら、うまく付き合うことが大事ということで。。。
以上、取り急ぎご報告まで失礼します。