[PYTHON] Apprentissage Scikit-Learn avec la chimioinfomatique

introduction

Dans la continuité de Matplotlib appris par chimioinfomatique, "Matplotlib" est l'une des bibliothèques représentatives de Python avec le thème de la lipidomique (analyse complète des lipides). Je vais vous expliquer. Nous expliquerons principalement des exemples pratiques de chimioinfomatique, donc si vous souhaitez vérifier les bases, veuillez lire l'article suivant avant de lire cet article.

Les chercheurs des sociétés pharmaceutiques ont résumé scikit-learn

Préparation du jeu de données

scikit-learn est une bibliothèque pour l'apprentissage automatique.

Ici, envisagez de prédire le temps de rétention (RT) en chromatographie liquide (LC) à partir des propriétés physiques d'un composé en utilisant la régression des moindres carrés partiels (PLS). Je vais.

Tout d'abord, créez un ensemble de données pour l'apprentissage automatique.

import pandas as pd


params_fatty_acids = ['Heavy atoms', 'Rotatable Bonds', 'van der Waals Molecular Volume', 'logP', 'Molar Refractivity']

lauric = [14, 10, 231.10, 3.99, 59.48]
myristic = [16, 12, 265.70, 4.77, 68.71]
palmitic = [18, 14, 300.30, 5.55, 77.95]
palmitoleic = [18, 13, 297.66, 5.33, 77.85]
stearic = [20, 16, 334.90, 6.33, 87.18]
oleic = [20, 15, 332.26, 6.11, 87.09]
linoleic = [20, 14, 329.62, 5.88, 86.99]
linolenic = [20, 13, 326.98, 5.66, 86.90]
stearidonic = [20, 12, 324.34, 5.44, 86.81]
arachidic = [22, 18, 369.50, 7.11, 96.42]
bishomo_gamma_linolenic = [22, 15, 361.58, 6.44, 96.13]
arachidonic = [22, 14, 358.94, 6.22, 96.04]
eicosapentaenoic = [22, 13, 356.30, 5.99, 95.95]
behenic = [24, 20, 404.10, 7.89, 105.65]
adrenic = [24, 16, 393.54, 7.00, 105.27]
docosapentaenoic = [24, 15, 390.90, 6.77, 105.18]
docosahexaenoic = [24, 14, 388.26, 6.55, 105.09]

df_fatty_acids = pd.DataFrame([lauric, myristic, palmitic, palmitoleic, stearic, oleic, linoleic, linolenic, stearidonic, arachidic, bishomo_gamma_linolenic, arachidonic, eicosapentaenoic, behenic, adrenic, docosapentaenoic, docosahexaenoic], columns=params_fatty_acids)
df_fatty_acids['Experimental Retention Time (min)'] = [4.53, 7.52, 11.02, 10.59, 14.45, 11.86, 9.76, 8.31, 6.71, 17.52, 11.20, 9.96, 8.27, 20.40, 12.75, 11.52, 9.84]

print(df_fatty_acids)

Ici, la liste des noms de paramètres de propriétés physiques utilisés comme variables explicatives est params_fatty_acids. Chaque valeur de propriété fait référence aux informations stockées dans la base de données de LIP ID MAPS. En outre, RT est publié sur le site Web de PRIMe de l'Institut de recherche physique et chimique [données RT en phase inverse LC](http: //prime.psc). .riken.jp / Metabolomics_Software / MrmDatabase / Detail% 20of% 20LCQqQMS% 20method% 20 (ODS-lipids) .xlsx) est référencé. De plus, en réalité, je pense que vous lisez souvent des fichiers CSV, etc. avec pandas.read_csv etc. En outre, un prétraitement des données tel que la saisie de la valeur manquante est souvent nécessaire.

Construire un modèle

Ensuite, nous allons construire un modèle de prédiction et calculer la valeur de prédiction à l'aide du modèle.

from sklearn.cross_decomposition import PLSRegression


X = df_fatty_acids[params_fatty_acids] #Variable explicative
y = df_fatty_acids['Experimental Retention Time (min)'] #Variable objective

pls_rt = PLSRegression()
pls_rt.fit(X, y) #Construire un modèle de prédiction PLS

y_pred = pls_rt.predict(X) #Calculer la valeur prévue

df_fatty_acids['Predicted Retention Time (min)'] = y_pred
df_fatty_acids['Diff (min)'] = df_fatty_acids['Predicted Retention Time (min)'] - df_fatty_acids['Experimental Retention Time (min)']
df_fatty_acids['Accuracy (%)'] = (df_fatty_acids['Diff (min)'] / df_fatty_acids['Experimental Retention Time (min)']) * 100

print(df_fatty_acids)

La relation entre la valeur mesurée et la valeur prévue est indiquée ci-dessous.

%matplotlib inline
import matplotlib.pyplot as plt


plt.scatter(y, y_pred)
plt.xlabel('Experimental Retention Time (min)')
plt.ylabel('Predicted Retention Time (min)')

plt.savefig('rts_fatty_acids.png')
plt.show()

rts_fatty_acids.png

Dans ces données, il semble que la valeur mesurée et la valeur prédite correspondent bien. Vous pouvez vérifier le degré d'ajustement du modèle construit avec r2_score.

from sklearn.metrics import r2_score


print(r2_score(y, y_pred))

r2_score prend une valeur entre 0 et 1, et plus il est proche de 1, meilleures sont les valeurs mesurées et prédites. Dans ces données, r2_score est une valeur supérieure à 0,98, ce qui est un assez bon modèle.

Cette fois, nous avons utilisé 5 types de paramètres de propriétés physiques pour prédire la RT, mais voyons lesquels d'entre eux contribuent de manière significative à la prédiction.

print(pls_rt.coef_)

À partir de ce résultat, on peut voir que dans ces données, le coefficient (valeur absolue) pour les obligations rotatives est le plus grand à 3,44, et cette valeur de propriété physique contribue fortement à la prédiction de RT.

Prédiction à l'aide d'un modèle

Nous avons discuté de la précision de prédiction des données utilisées pour construire le modèle de prédiction, mais enfin, voyons avec quelle précision les données non utilisées pour construire le modèle peuvent être prédites.

lignoceric = [26, 22, 438.70, 8.67, 114.88]
x_lignoceric = pd.DataFrame([lignoceric], columns=params_fatty_acids)
y_pred_lignoceric = pls_rt.predict(x_lignoceric)

y_exp_lignoceric = 22.31 #La valeur de mesure

print(y_exp_lignoceric)
print(y_pred_lignoceric)

Ici, j'ai essayé de prédire la RT de l'acide lignocérique (FA 24: 0). La différence entre la valeur prédite et la valeur mesurée est d'environ 1,2 minute. Je pense qu'il existe différents points de vue sur la question de savoir si cette différence est grande ou petite, mais je pense personnellement que la précision des prévisions est plutôt faible. La raison en est que l'acide lignocérique est une espèce moléculaire qui est plus hydrophobe que toute espèce moléculaire d'acide gras incluse dans l'ensemble de données utilisé pour la construction du modèle, et l'ajustement des données proches des propriétés physiques de l'acide lignocérique est effectué au stade de la construction du modèle. On pense que c'est lié à ce qui n'a pas été fait.

La régression PLS peut être effectuée par la procédure ci-dessus. Bien que cela ne soit pas mentionné ici, le nombre de variables latentes n_components est également important lors de l'exécution de la régression PLS. Cette fois, j'ai utilisé la valeur par défaut «2», mais en changeant cela, la précision de la prédiction changera petit à petit. Je voudrais l'expliquer à un autre moment.

Résumé

Ici, nous avons expliqué scikit-learn, en nous concentrant sur les connaissances pratiques qui peuvent être utilisées en chimioinfomatique. Revoyons à nouveau les principaux points.

Documents de référence / liens

Quel est le langage de programmation Python? Peut-il être utilisé pour l'IA et l'apprentissage automatique?

Recommended Posts

Apprentissage Scikit-Learn avec la chimioinfomatique
Isomap avec Scikit-learn
DBSCAN avec scikit-learn
Clustering avec scikit-learn (1)
Clustering avec scikit-learn (2)
PCA avec Scikit-learn
kmeans ++ avec scikit-learn
Apprenez Python avec ChemTHEATER
SVM multi-classes avec scikit-learn
Apprenez Zundokokiyoshi en utilisant LSTM
Clustering avec scikit-learn + DBSCAN
Apprenez avec Chemo Informatics Matplotlib
DBSCAN (clustering) avec scikit-learn
Apprenez avec Chemo Informatics NumPy
DCGAN avec TF Learn
Installez scikit.learn avec pip
Calculer tf-idf avec scikit-learn
Apprenez Pendulum-v0 avec DDPG
Apprenez librosa avec un tutoriel 1
Réseau de neurones avec Python (scikit-learn)
Apprenez les orbites elliptiques avec Chainer
Apprenez de nouvelles données avec PaintsChainer
Traitement parallèle avec Parallel de scikit-learn
[Python] Régression linéaire avec scicit-learn
Régression linéaire robuste avec scikit-learn
Recherche en grille d'hyper paramètres avec Scikit-learn
Créer un arbre déterminé avec scikit-learn
Apprendre avec Causal ML Package Meta-Learner
Segmentation d'image avec scikit-image et scikit-learn
[TensorFlow 2] Apprendre RNN avec perte CTC
Apprenons Deep SEA avec Selene
Identifiez les valeurs aberrantes avec le classificateur de forêt aléatoire de scikit-learn
Factorisation matricielle non négative (NMF) avec scikit-learn
Apprendre la catégorisation de documents avec la CLI spaCy
SVM essayant l'apprentissage automatique avec scikit-learn
Structure de données Python apprise avec la chimioinfomatique
Scikit-learn DecisionTreeClassifier avec des valeurs de type datetime
L'analyse de clustering la plus basique avec scikit-learn
Premiers pas avec python3 # 1 Apprenez les connaissances de base
Apprenez à coloriser les images monochromes avec Chainer
Affinons les hyper paramètres du modèle avec scikit-learn!
[Scikit-learn] J'ai joué avec la courbe ROC
Essayez SVM avec scikit-learn sur Jupyter Notebook
Classification multi-étiquettes par forêt aléatoire avec scikit-learn
Regrouper les écoles représentatives à l'été 2016 avec scikit-learn
Implémentez un estimateur auto-créé minimal avec scikit-learn
Apprendre Python! Comparaison avec Java (fonction de base)
Apprenez avec Supra Nervous Weakness! La théorie des graphes
Remplissez les valeurs manquantes avec Scikit-learn impute
Apprenez le modèle de conception "Singleton" avec Python
Se préparer à apprendre les indicateurs techniques avec TFlearn
Apprenez le modèle de conception "Façade" avec Python
Visualisez l'arbre de décision scikit-learn avec Treemap de Plotly