ValueError при выполнении проверки со случайными лесами

Я пытаюсь построить модель, которая бы предсказывала коэффициент caco-2 молекулы, учитывая ее представление в виде строки улыбок. Мое решение основано на этом примере. Поскольку мне нужно предсказать реальную стоимость, я использую RandomForestRegressor, С некоторыми молекулами, добавленными в код вручную, все работает (хотя сами прогнозы совершенно неверны):

from rdkit import Chem, DataStructs     #all the nice chemical stuff, ConvertToNumpyArray
from rdkit.Chem import AllChem
from sklearn.ensemble import RandomForestRegressor      #our regressor
from sklearn.model_selection import train_test_split    
import numpy as np



# generate molecules
m1 = Chem.MolFromSmiles('Cc1ccc(NNC(=O)c2ccc(CN3C(=O)CCC3=O)cc2)cc1Cl')
m2 = Chem.MolFromSmiles('Nc1ccc(C(=O)N2CCN(c3cc[nH+]cc3)CC2)cc1[N+](=O)[O-]')
m3 = Chem.MolFromSmiles('CN(Cc1[nH+]ccn1C)C(=O)CCc1ccsc1')
m4 = Chem.MolFromSmiles('COc1ccc([N+](=O)[O-])cc1C(=O)NCCC[NH+]1CCCC1')
m5 = Chem.MolFromSmiles('C[NH+]1CCN(S(=O)(=O)c2ccc(NC(=O)Cc3ccc([N+](=O)[O-])cc3)cc2)CC1')
m6 = Chem.MolFromSmiles('CCc1ccc(S(=O)(=O)Nc2ccc(NC(C)=O)cc2)cc1')
m7 = Chem.MolFromSmiles('O=C(COC(=O)c1ccc(S(=O)(=O)N2CCCCC2)cc1)c1ccc(F)cc1')
m8 = Chem.MolFromSmiles('COC(=O)c1ccc(S(=O)(=O)NCc2csc3ccc(Cl)cc23)n1C')
m9 = Chem.MolFromSmiles('CCC(C)N1C(=O)C(=CNc2ccccc2C(=O)[O-])C(=O)NC1=S')
m10 = Chem.MolFromSmiles('Cn1c(CNC(=O)C(=O)Nc2cccc(Cl)c2Cl)nc2ccccc21')
mols = [m1, m2, m3, m4, m5 ,m6, m7, m8, m9, m10]


# generate fingeprints: Morgan fingerprint with radius 2
fps = [AllChem.GetMorganFingerprintAsBitVect(m, 2) for m in mols]

# convert the RDKit explicit vectors into numpy arrays
np_fps = []
for fp in fps:
  arr = np.zeros((1,))
  DataStructs.ConvertToNumpyArray(fp, arr)
  np_fps.append(arr)

# get a random forest regressor with 100 trees
rndf_rgsr = RandomForestRegressor(n_estimators=100, random_state=42, n_jobs=-1, warm_start=False)


#train the random forest
#ys are the caco-2 coefficients we wish to predict
ys_fit = [379.724, 101.644, 3154.167, 97.437, 21.152, 569.981, 150.55, 690.843, 78.866, 984.371]

rndf_rgsr.fit(np_fps, ys_fit)


#use the random forest to predict a new molecule
m_new = Chem.MolFromSmiles('Cc1n[nH]c(Cc2ccc(-n3cnnc3)cc2)n1')      #actual caco2 is 410.037
fp = np.zeros((1,))
DataStructs.ConvertToNumpyArray(AllChem.GetMorganFingerprintAsBitVect(m_new, 2), fp)

print(rndf_rgsr.predict((fp,)))

Но когда я пытаюсь работать с большим количеством молекул, импортированных из файла, который содержит много строк, которые выглядят как Cc1ccc(NNC(=O)c2ccc(CN3C(=O)CCC3=O)cc2)cc1Cl,379.724, используя следующий код:

from rdkit import Chem, DataStructs     
from rdkit.Chem import AllChem
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor     #our regressors
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split    
import numpy as np
import pandas as pd
from pandas import DataFrame, read_csv



#import our data from file
df = pd.read_csv('test_db.csv', delimiter=',' )     #a pandas DataFrame


#get the values of variables and targets
X = df["smiles"].values
y = df["Caco2"].values



#split our data set into two parts
x_train, x_eval, y_train, y_eval = train_test_split(X, y, test_size = 0.2, random_state = 42)   


#convert our smiles string into actual molecular graphs
mols_ready_train = [Chem.MolFromSmiles(x_train[i]) for i in range(len(x_train))]
mols_ready_eval = [Chem.MolFromSmiles(x_eval[i]) for i in range(len(x_eval))]

# generate fingeprints: Morgan fingerprint with radius 2    
fing_prints_train = [AllChem.GetMorganFingerprintAsBitVect(m, 2) for m in mols_ready_train]
fing_prints_eval = [AllChem.GetMorganFingerprintAsBitVect(m, 2) for m in mols_ready_eval]


# convert the RDKit explicit vectors into numpy arrays
np_fps_train = []
for fp in fing_prints_train:
  arr = np.zeros((1,))
  DataStructs.ConvertToNumpyArray(fp, arr)
  np_fps_train.append(arr)

np_fps_eval = []
for fp in fing_prints_eval:
  arr = np.zeros((1,))
  DataStructs.ConvertToNumpyArray(fp, arr)
  np_fps_eval.append(arr)  


# get a random forest regressor with 100 trees

rndf_rgsr = RandomForestRegressor(n_estimators=1000, random_state=42, n_jobs=-1, warm_start=False)


#train our random forest regressor
rndf_rgsr.fit(np_fps_train, y_train)



# use the random forest to predict a new molecule
m_new = Chem.MolFromSmiles('Cc1n[nH]c(Cc2ccc(-n3cnnc3)cc2)n1')

fp = numpy.zeros((1,))
DataStructs.ConvertToNumpyArray(AllChem.GetMorganFingerprintAsBitVect(m_new, 2), fp)

print(rndf_rgsr.predict((fp,)))

происходит сбой со следующей ошибкой:

Файл "/home/me/predictor.py", строка 55, в файле rndf_rgsr.fit(np_fps_train, y_train) Файл "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/forest.py", строка 248, в подгонке y = check_array(y, accept_sparse='csc', sure_2d=False, dtype=None) Файл "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", строка 407, в файле check_array _assert_all_finite(массив) "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", строка 58 в _assert_all_finite "или слишком большое значение для%r ". % X.dtype) ValueError: Вход содержит NaN, бесконечность или значение, слишком большое для dtype('float64').

Я проверил, что ни один из используемых мной векторов не содержит nanс или infs. Используемые здесь отпечатки пальцев имеют длину 2048 бит, но я сомневаюсь, что они являются источником проблемы. Что-то не так с проверкой, но я не могу понять, что именно. Не могли бы вы дать какие-нибудь советы?

ETA: test_db.csv имеет 50000 строк. Я создал tiny_db.csv только с 10 строками, и на ней моя модель отлично работает (то есть ее прогнозы неверны, но это работает вообще). Он также работает с файлом из 100 строк, но с 1000 - нет, и вылетает с вышеупомянутой ошибкой. Дальнейшие эксперименты показывают, что 250 строк работают, а 500 - нет.

ETA: первые 250 строк работают, но следующие 250 строк (от 250 до 500) не работают. Прочитав более 100 строк, print(y_train.mean(), y_train.min(), y_train.max()) возвращается (nan,nan,nan), В общем, я сильно подозреваю, что проблема исходит от pandas.Dataframe.values, которые сбили мои хорошие коэффициенты float64, которые приводят к ошибкам арифметики, что, в свою очередь, приводит к сбою процедур проверки. Я думаю, что было бы лучше использовать питона csv модуль вместо pandas.read_csv в сочетании с DataFrame.values,

0 ответов

Другие вопросы по тегам