Skip to content

Instantly share code, notes, and snippets.

@pstjohn
Last active September 5, 2019 22:53
Show Gist options
  • Save pstjohn/b7e2f05136bf8bfd22f68f375437452d to your computer and use it in GitHub Desktop.
Save pstjohn/b7e2f05136bf8bfd22f68f375437452d to your computer and use it in GitHub Desktop.

YSI Prediction and Analysis code

Flattened jupyter notebooks containing the analysis workflow in the manuscript A quantitative model for the prediction of sooting tendency from molecular structure.

Full repository (with data files) is available at pstjohn/ysi_qsar_energy_fuels

name: ysi
channels:
- https://conda.anaconda.org/rdkit
dependencies:
- python=3.5
- jupyter
- pandas
- seaborn
- rdkit
- jinja2
- pip:
- https://github.com/pstjohn/scikit-learn/archive/pstjohn-changes.zip
- pubchempy
- keras==0.3.3
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Randomized K-Fold Cross-validation\n",
"\n",
"This notebook implements randomized k-fold cross-validation, and examines the errors of the model by distance from the training set.\n",
"\n",
"*Note*, these results may differ slightly from those presented in the manuscript, as its fairly difficult to get a consistent random state throughout all the training and validation steps."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"sns.set_style('darkgrid')\n",
"sns.set_context('talk', font_scale=1.5)\n",
"sns.set(color_codes=True)\n",
"\n",
"import matplotlib.gridspec as gridspec\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using Theano backend.\n"
]
}
],
"source": [
"from ysi_utils.models.setup_model import model\n",
"\n",
"from ysi_utils.data import low\n",
"from ysi_utils.descriptors import dragon\n",
"from ysi_utils.validation import y_train as y\n",
"from ysi_utils.validation import y_test\n",
"\n",
"X = dragon.loc[y.index]\n",
"X_test = dragon.loc[y_test.index]"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/pstjohn/anaconda3/envs/ysi/lib/python3.5/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
" \"This module will be removed in 0.20.\", DeprecationWarning)\n"
]
}
],
"source": [
"from sklearn.preprocessing import LabelEncoder\n",
"from sklearn.metrics import median_absolute_error\n",
"from sklearn.cross_validation import KFold, cross_val_predict"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*This step takes a long time to run, as it re-fits the model 10 times for each iteration*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import multiprocessing\n",
"multiprocessing.cpu_count()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"np.random.seed(0)\n",
"\n",
"y_cv_predict = [[]] * 25\n",
"\n",
"for i in range(25):\n",
" y_cv_predict[i] = cross_val_predict(model, X.values, y.YSI.values,\n",
" cv=KFold(n=len(y), n_folds=10, shuffle=True,\n",
" random_state=i), n_jobs=-1)\n",
"# Pickle the CV results\n",
"y_cv_df = pd.DataFrame(np.array(y_cv_predict).T, index=y.index)\n",
"y_cv_df.to_pickle('y_cv_random_results.p')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Or, load from an existing pickle"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"y_cv_df = pd.read_pickle('y_cv_random_results.p')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from ysi_utils.models import outlier_model\n",
"y['inlier'] = outlier_model.predict(X) == 1"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"train_dist = outlier_model.decision_function(X)\n",
"y_dist = pd.DataFrame((y['YSI'] - y_cv_df.mean(1)).abs(), columns=['YSI'])\n",
"y_dist['err'] = y_cv_df.std(1)*1.96\n",
"y_dist['dist'] = -train_dist\n",
"y_dist['inlier'] = y.inlier\n",
"\n",
"mavg = np.zeros((2, 200))\n",
"for i, x_start in enumerate(\n",
" np.linspace(y_dist.dist.min(), .15, 200)):\n",
" \n",
" x_end = x_start + .05\n",
" mavg[0, i] = x_start + .025\n",
" mavg[1, i] = y_dist.loc[\n",
" (y_dist.dist >= x_start) & (y_dist.dist < x_end), 'YSI'].mean()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nvJCfn08fz8nJweLFi2FpaYkRI0bg999/l2j7c+bMweXLlwXKpNFmWVkZ1q1bh379+sHW1hbHjh1r\ncJ01tTN27FhERUXRZampqXBzc4OFhQXGjBmDiIgIibT16dMnLFmyBP3798fQoUOxdetWOi2xtNqU\nF7Zt2wYbGxv0798f/v7+tZ779OlTTJ06FRYWFnB0dMT58+dlZKVoxOnLCQkJmDJlCvr06YPJkycj\nPj5ehpbWjjjXcefOHYwfPx4WFhZwcnLC7du3ZWcoRWgQy5YtoyZNmkQlJCRQCQkJ1OTJk6klS5bQ\nx+fPn0+5ublRSUlJ1Pnz56levXpRMTExDW6Xx+NRvr6+lImJCXXp0iWBY9Jo09fXl3JycqKeP39O\n3bhxg7K0tKSuX7/eoDqrU1paSi1atIgyMTGhHj58SJePGzeOWrNmDcXlcqmDBw9Sffr0oT5+/Njg\n9qZMmUK5u7tTSUlJ1KNHj6iRI0dSfn5+FEVR1NixY6XSpjwQEBBA2dnZUY8fP6YePHhA2draUkeP\nHhV5bkZGBtWvXz9qx44d1Lt376g//viD6t27N3Xnzh0ZW/0fde3LRUVF1KBBgyg/Pz+Ky+VSmzZt\nogYNGkQVFxczYLUwdb2O58+fUz179qQCAwOp5ORkKjAwkDIzM6MSExNlYicRmQZQVFREmZmZCXyB\nP3nyhDIzM6NKS0upd+/eUcbGxtSHDx/o4+vXr6fWrl3boHbT0tKomTNnUnZ2dpS1tbWAyCQnJ0u8\nzaKiIqp3795UVFQUXbZv3z5q5syZ9a6zOklJSZSTkxPl5OQkIDL379+nLCwsqJKSEvrcWbNmUbt3\n725Qe1wulzIxMaGysrLosrCwMGrIkCFUZGSkVNqUF4YNGybQ50JDQyl7e3uR5549e5b69ttvBcp+\n/PFHatWqVVK1sSbE6cvnz5+nRowYIVA2cuRIoR91TCDOdWzbto2aN2+eQNns2bOpHTt2SN1OiqIo\nMl3WANhsNg4cOAATExO6jKIoVFRUoKioCDExMejQoQN0dXXp41ZWVnj69GmD2k1ISECHDh1w8eJF\noQirz549k3ibiYmJqKioQJ8+fQTqjImJqXed1Xn48CFsbGwQHBwMqkrM1piYGJiZmUFZWVmg7Ya+\nh9ra2jhy5Ai0tLQEyvPz8/Hs2TOptCkPpKen4+PHj+jbty9dZmVlhQ8fPiAzM1Po/CFDhohMlFZ1\n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\n/D+JAchypszm/wAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x118a55128>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with sns.axes_style('ticks'):\n",
" \n",
" fig = plt.figure(figsize=(4,6))\n",
" gs = gridspec.GridSpec(3,2)\n",
" \n",
" ax = fig.add_subplot(gs[:2,:2], aspect='equal')\n",
" ax2 = fig.add_subplot(gs[2, 0])\n",
" ax3 = fig.add_subplot(gs[2, 1])\n",
" #plt.setp(ax2.get_xticklabels(), visible=False)\n",
"\n",
" ax.set_xlim([-60, 120])\n",
" ax.set_ylim([-60, 120])\n",
"\n",
" ax.errorbar(y.loc[y.inlier, 'YSI'], y_cv_df.mean(1)[y.inlier.values],\n",
" fmt='.', label='inlier', lw=1., capsize=0,\n",
" yerr=1.96*y_cv_df[y.inlier.values].std(1))\n",
" ax.errorbar(y.loc[~y.inlier, 'YSI'], y_cv_df.mean(1)[~y.inlier.values],\n",
" fmt='x', color='r', markeredgewidth=1., label='outlier',\n",
" yerr=1.96*y_cv_df[~y.inlier.values].std(1), lw=1., capsize=0)\n",
"\n",
" ax.plot([-50, 110], [-50, 110], '--', zorder=0, color='gray')\n",
" \n",
" mae_inlier = median_absolute_error(\n",
" y.loc[y.inlier, 'YSI'], y_cv_df.mean(1)[y.inlier.values])\n",
" \n",
" \n",
" \n",
" ax.set_title('Training set cross-validation')\n",
" ax.set_ylabel('YSI (predicted)')\n",
" ax.set_xlabel('YSI (measured)')\n",
" \n",
" text = ('MAE (CV) Inliers: {:.2f}'.format(\n",
" mae_inlier) + '\\n' +\n",
" 'MAE (CV) Outliers: {:.2f}'.format(\n",
" median_absolute_error(y.loc[~y.inlier, 'YSI'],\n",
" y_cv_df.mean(1)[~y.inlier.values])))\n",
" \n",
" ax.text(0.05, 0.95, text,\n",
" transform=ax.transAxes, ha='left', va='top')\n",
" \n",
" ax.legend(loc='lower right')\n",
" \n",
" \n",
" #ax2 = fig.add_subplot(122)\n",
" ax2.hist((y.loc[y.inlier, 'YSI'] - y_cv_df.mean(1)[y.inlier.values]),\n",
" bins=15, edgecolor='w', normed=False, range=(-20, 20))\n",
"\n",
" ax2.set_xlim([-20, 20])\n",
" ax2.set_xticks([-20, -10, 0, 10, 20])\n",
" ax2.set_ylim([0, 50])\n",
"\n",
" ax2.set_xlabel('YSI Error')\n",
" ax2.set_ylabel('Number of inliers')\n",
"\n",
" ax3.plot(y_dist.loc[y_dist.inlier, 'dist'], y_dist.loc[y_dist.inlier, 'YSI'], '.',\n",
" markersize=3)\n",
" ax3.plot(y_dist.loc[~y_dist.inlier, 'dist'], y_dist.loc[~y_dist.inlier, 'YSI'],\n",
" 'rx', markersize=5., markeredgewidth=1.)\n",
" ax3.plot(train_dist[outlier_model.predict(X) == -1]**(1/3), \n",
" (y.loc[~y.inlier, 'YSI'] - y_cv_df.mean(1)[~y.inlier.values]).abs(),\n",
" 'rx', markersize=4., markeredgewidth=1.)\n",
" \n",
" ax3.axvline(0, ls='--', color='gray')\n",
" \n",
" #plt.legend(loc='upper right')\n",
" ax3.set_ylabel('Absolute YSI Error')\n",
" ax3.set_xlabel(r'Outlier Score')\n",
" \n",
" ax3.set_xlim([-.2, .25])\n",
" ax3.set_yticks(np.arange(0, 50, 10))\n",
" ax3.set_xticks([-.2, 0., .2])\n",
" \n",
" sns.despine()\n",
" fig.tight_layout()\n",
"\n",
" fig.text(0.0, .975, 'A', va='top', ha='left', fontsize=16, fontweight='bold')\n",
" fig.text(0.0, .325, 'B', va='top', ha='left', fontsize=16, fontweight='bold')\n",
" fig.text(0.475, .325, 'C', va='top', ha='left', fontsize=16, fontweight='bold')\n",
" \n",
" fig.savefig('ysi_crossval.svg', transparent=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Analysis of cross-validation outliers"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"ycv = y.copy()\n",
"ycv['YSI_diff'] = (ycv.YSI - y_cv_df.mean(1))\n",
"ycv['YSI(cv)'] = y_cv_df.mean(1)\n",
"ycv['YSI(cv_err)'] = 1.96*y_cv_df.std(1)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"ycv = ycv[ycv.inlier].copy()\n",
"ycv = ycv.sort_values('YSI_diff').drop(\n",
" ['Ref', 'inlier', 'YSI_diff', 'Type'], 1)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Species</th>\n",
" <th>CAS</th>\n",
" <th>YSI</th>\n",
" <th>YSI(cv)</th>\n",
" <th>YSI(cv_err)</th>\n",
" </tr>\n",
" <tr>\n",
" <th>SMILES</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>C1=CCCCC1</th>\n",
" <td>cyclohexene</td>\n",
" <td>110-83-8</td>\n",
" <td>23.7</td>\n",
" <td>48.816883</td>\n",
" <td>9.110898</td>\n",
" </tr>\n",
" <tr>\n",
" <th>COC1CCCCO1</th>\n",
" <td>2-methoxytetrahydropyran</td>\n",
" <td>6581-66-4</td>\n",
" <td>-12.9</td>\n",
" <td>2.181619</td>\n",
" <td>9.145402</td>\n",
" </tr>\n",
" <tr>\n",
" <th>C=C(C)CC(C)(C)C</th>\n",
" <td>2,4,4-trimethyl-1-pentene</td>\n",
" <td>107-39-1</td>\n",
" <td>59.2</td>\n",
" <td>74.061302</td>\n",
" <td>6.971259</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CC=C(C)C</th>\n",
" <td>2-methyl-2-butene</td>\n",
" <td>513-35-9</td>\n",
" <td>20.4</td>\n",
" <td>33.103073</td>\n",
" <td>4.903362</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CC1CCCC1</th>\n",
" <td>methylcyclopentane</td>\n",
" <td>96-37-7</td>\n",
" <td>30.9</td>\n",
" <td>42.903755</td>\n",
" <td>10.453062</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CCC1CO1</th>\n",
" <td>1,2-epoxybutane</td>\n",
" <td>106-88-7</td>\n",
" <td>-17.9</td>\n",
" <td>-5.971723</td>\n",
" <td>5.488716</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CCC1CCCC1</th>\n",
" <td>ethylcyclopentane</td>\n",
" <td>1640-89-7</td>\n",
" <td>43.8</td>\n",
" <td>54.633961</td>\n",
" <td>13.129497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CCCCCCC(=O)OC</th>\n",
" <td>methyl heptanoate</td>\n",
" <td>106-73-0</td>\n",
" <td>3.3</td>\n",
" <td>13.107208</td>\n",
" <td>4.223814</td>\n",
" </tr>\n",
" <tr>\n",
" <th>COC(C)(OC)OC</th>\n",
" <td>1,1,1-trimethoxyethane</td>\n",
" <td>1445-45-0</td>\n",
" <td>-27.5</td>\n",
" <td>-17.705420</td>\n",
" <td>4.342262</td>\n",
" </tr>\n",
" <tr>\n",
" <th>COC(C)(C)OC</th>\n",
" <td>2,2-dimethoxypropane</td>\n",
" <td>77-76-9</td>\n",
" <td>-21.7</td>\n",
" <td>-11.929333</td>\n",
" <td>3.986717</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Species CAS YSI YSI(cv) \\\n",
"SMILES \n",
"C1=CCCCC1 cyclohexene 110-83-8 23.7 48.816883 \n",
"COC1CCCCO1 2-methoxytetrahydropyran 6581-66-4 -12.9 2.181619 \n",
"C=C(C)CC(C)(C)C 2,4,4-trimethyl-1-pentene 107-39-1 59.2 74.061302 \n",
"CC=C(C)C 2-methyl-2-butene 513-35-9 20.4 33.103073 \n",
"CC1CCCC1 methylcyclopentane 96-37-7 30.9 42.903755 \n",
"CCC1CO1 1,2-epoxybutane 106-88-7 -17.9 -5.971723 \n",
"CCC1CCCC1 ethylcyclopentane 1640-89-7 43.8 54.633961 \n",
"CCCCCCC(=O)OC methyl heptanoate 106-73-0 3.3 13.107208 \n",
"COC(C)(OC)OC 1,1,1-trimethoxyethane 1445-45-0 -27.5 -17.705420 \n",
"COC(C)(C)OC 2,2-dimethoxypropane 77-76-9 -21.7 -11.929333 \n",
"\n",
" YSI(cv_err) \n",
"SMILES \n",
"C1=CCCCC1 9.110898 \n",
"COC1CCCCO1 9.145402 \n",
"C=C(C)CC(C)(C)C 6.971259 \n",
"CC=C(C)C 4.903362 \n",
"CC1CCCC1 10.453062 \n",
"CCC1CO1 5.488716 \n",
"CCC1CCCC1 13.129497 \n",
"CCCCCCC(=O)OC 4.223814 \n",
"COC(C)(OC)OC 4.342262 \n",
"COC(C)(C)OC 3.986717 "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ycv.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Species</th>\n",
" <th>CAS</th>\n",
" <th>YSI</th>\n",
" <th>YSI(cv)</th>\n",
" <th>YSI(cv_err)</th>\n",
" </tr>\n",
" <tr>\n",
" <th>SMILES</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>CC1=CCCC1</th>\n",
" <td>1-methylcyclopentene</td>\n",
" <td>693-89-0</td>\n",
" <td>102.7</td>\n",
" <td>63.667564</td>\n",
" <td>11.138880</td>\n",
" </tr>\n",
" <tr>\n",
" <th>COC1CCCC1</th>\n",
" <td>methyl cyclopentyl ether</td>\n",
" <td>5614-37-9</td>\n",
" <td>49.6</td>\n",
" <td>20.147734</td>\n",
" <td>4.788744</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CC(C)=CC(C)(C)C</th>\n",
" <td>2,4,4-trimethyl-2-pentene</td>\n",
" <td>107-40-4</td>\n",
" <td>91.4</td>\n",
" <td>64.029732</td>\n",
" <td>8.027209</td>\n",
" </tr>\n",
" <tr>\n",
" <th>C1=CCCCCC1</th>\n",
" <td>cycloheptene</td>\n",
" <td>628-92-2</td>\n",
" <td>71.6</td>\n",
" <td>46.242435</td>\n",
" <td>8.639507</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CC(C)=C(C)C(C)C</th>\n",
" <td>2,3,4-trimethyl-2-pentene</td>\n",
" <td>565-77-5</td>\n",
" <td>87.9</td>\n",
" <td>71.874557</td>\n",
" <td>8.474607</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CCC(C)OC(C)CC</th>\n",
" <td>sec-butyl ether</td>\n",
" <td>6863-58-7</td>\n",
" <td>36.6</td>\n",
" <td>21.828070</td>\n",
" <td>4.415872</td>\n",
" </tr>\n",
" <tr>\n",
" <th>C=C(C)C(C)(C)C</th>\n",
" <td>2,3,3-trimethyl-1-butene</td>\n",
" <td>594-56-9</td>\n",
" <td>65.9</td>\n",
" <td>51.572617</td>\n",
" <td>7.796319</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CCCCCOC(C)=O</th>\n",
" <td>pentyl acetate</td>\n",
" <td>628-63-7</td>\n",
" <td>15.6</td>\n",
" <td>1.975592</td>\n",
" <td>3.615796</td>\n",
" </tr>\n",
" <tr>\n",
" <th>C=CCCCCCCCC</th>\n",
" <td>1-decene</td>\n",
" <td>872-05-9</td>\n",
" <td>69.0</td>\n",
" <td>55.395443</td>\n",
" <td>6.303191</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CC1CCC(C)C(C)C1</th>\n",
" <td>1,2,4-trimethylcyclohexane</td>\n",
" <td>2234-75-5</td>\n",
" <td>81.4</td>\n",
" <td>68.729317</td>\n",
" <td>5.166113</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Species CAS YSI YSI(cv) \\\n",
"SMILES \n",
"CC1=CCCC1 1-methylcyclopentene 693-89-0 102.7 63.667564 \n",
"COC1CCCC1 methyl cyclopentyl ether 5614-37-9 49.6 20.147734 \n",
"CC(C)=CC(C)(C)C 2,4,4-trimethyl-2-pentene 107-40-4 91.4 64.029732 \n",
"C1=CCCCCC1 cycloheptene 628-92-2 71.6 46.242435 \n",
"CC(C)=C(C)C(C)C 2,3,4-trimethyl-2-pentene 565-77-5 87.9 71.874557 \n",
"CCC(C)OC(C)CC sec-butyl ether 6863-58-7 36.6 21.828070 \n",
"C=C(C)C(C)(C)C 2,3,3-trimethyl-1-butene 594-56-9 65.9 51.572617 \n",
"CCCCCOC(C)=O pentyl acetate 628-63-7 15.6 1.975592 \n",
"C=CCCCCCCCC 1-decene 872-05-9 69.0 55.395443 \n",
"CC1CCC(C)C(C)C1 1,2,4-trimethylcyclohexane 2234-75-5 81.4 68.729317 \n",
"\n",
" YSI(cv_err) \n",
"SMILES \n",
"CC1=CCCC1 11.138880 \n",
"COC1CCCC1 4.788744 \n",
"CC(C)=CC(C)(C)C 8.027209 \n",
"C1=CCCCCC1 8.639507 \n",
"CC(C)=C(C)C(C)C 8.474607 \n",
"CCC(C)OC(C)CC 4.415872 \n",
"C=C(C)C(C)(C)C 7.796319 \n",
"CCCCCOC(C)=O 3.615796 \n",
"C=CCCCCCCCC 6.303191 \n",
"CC1CCC(C)C(C)C1 5.166113 "
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ycv.tail(10)[::-1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Write structure files to generate SVG images from openbabel"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"with open('structures/over.smi', 'w') as f:\n",
" for smiles, row in ycv.head().iterrows():\n",
" f.write('{0} {1}\\n'.format(smiles, row.Species))\n",
" \n",
"with open('structures/under.smi', 'w') as f:\n",
" for smiles, row in ycv.tail()[::-1].iterrows():\n",
" f.write('{0} {1}\\n'.format(smiles, row.Species))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"ycv.reset_index(drop=True).set_index('Species').loc[low.Species].dropna().reset_index().to_csv('cv_results.csv')"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [conda env:ysi]",
"language": "python",
"name": "conda-env-ysi-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
import numpy as np
np.random.seed(0)
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import (StandardScaler, Normalizer, RobustScaler,
MaxAbsScaler, Imputer)
from sklearn.decomposition import PCA
from sklearn.feature_selection import VarianceThreshold, RFE, SelectKBest, f_regression
from sklearn import svm
from ysi_utils.descriptors import dragon
from ysi_utils.validation import y_train as y
from ysi_utils.validation import y_test
X = dragon.loc[y.index]
X_test = dragon.loc[y_test.index]
# These are the optimal parameters as selected by the hyperopt fitting routine.
params = \
{'activation': 'relu',
'batch_size': 39,
'dropout1': 0.36632971139053216,
'dropout2': 0.030115015871571206,
'feature_extractor': {'n_features_to_select': 390, 'step': 10, 'type': 'RFE'},
'nb_epochs': 100,
'num_layers': {'dropout3': 0.31435729897990794,
'layers': 'three',
'units3': 161},
'optimizer': 'adam',
'preprocessor': 'MaxAbsScaler',
'units1': 140,
'units2': 140}
def get_input_size(params):
if 'n_components' in params['feature_extractor']:
return params['feature_extractor']['n_components']
elif 'k' in params['feature_extractor']:
return params['feature_extractor']['k']
elif 'n_features_to_select' in params['feature_extractor']:
return params['feature_extractor']['n_features_to_select']
def build_model(params=params):
model = Sequential()
model.add(Dense(output_dim=params['units1'],
input_dim=get_input_size(params)))
model.add(Activation(params['activation']))
model.add(Dropout(params['dropout1']))
model.add(Dense(output_dim=params['units2'], init="glorot_uniform"))
model.add(Activation(params['activation']))
model.add(Dropout(params['dropout2']))
if params['num_layers']['layers']== 'three':
model.add(Dense(output_dim=params['num_layers']['units3'], init="glorot_uniform"))
model.add(Activation(params['activation']))
model.add(Dropout(params['num_layers']['dropout3']))
model.add(Dense(output_dim=1))
model.compile(loss='mae', optimizer=params['optimizer'])
return model
ffann = KerasRegressor(build_fn=build_model,
nb_epoch=params['nb_epochs'],
batch_size=params['batch_size'],
verbose=0)
# Set up preprocessing pipeline
imputer = Imputer()
var_filter = VarianceThreshold()
preprocessor_dict = {
'StandardScaler' : StandardScaler,
'MaxAbsScaler' : MaxAbsScaler,
'Normalizer' : Normalizer,
'RobustScaler' : RobustScaler,
}
scaler = preprocessor_dict[params['preprocessor']]()
if params['feature_extractor']['type'] == 'pca':
opts = dict(params['feature_extractor'])
del opts['type']
feature_extraction = PCA(**opts)
elif params['feature_extractor']['type'] == 'RFE':
opts = dict(params['feature_extractor'])
del opts['type']
svr = svm.SVR(kernel='linear')
feature_extraction = RFE(estimator=svr, **opts)
elif params['feature_extractor']['type'] == 'SelectKBest':
opts = dict(params['feature_extractor'])
del opts['type']
feature_extraction = SelectKBest(score_func=f_regression, **opts)
model = Pipeline(steps=[
('imputer', imputer),
('filter', var_filter),
('scaler', scaler),
('feature_extraction', feature_extraction),
('ffann', ffann)
])
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment