Skip to content

Instantly share code, notes, and snippets.

@mtzl
Created May 24, 2016 09:20
Show Gist options
  • Save mtzl/eed088b349ee3b92e520d7c8a5ab14e7 to your computer and use it in GitHub Desktop.
Save mtzl/eed088b349ee3b92e520d7c8a5ab14e7 to your computer and use it in GitHub Desktop.
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#!/usr/bin/env python\n",
"# vim:set ts=4 sts=4 sw=4 et:\n",
"\n",
"from glob import glob\n",
"from collections import defaultdict, Counter\n",
"from time import time\n",
"\n",
"from matplotlib.mlab import rec_drop_fields\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import scipy\n",
"from sklearn.cross_validation import (StratifiedKFold, train_test_split, \n",
" StratifiedShuffleSplit, cross_val_predict, \n",
" cross_val_score)\n",
"from sklearn.discriminant_analysis import (QuadraticDiscriminantAnalysis, \n",
" LinearDiscriminantAnalysis)\n",
"from sklearn.dummy import DummyClassifier\n",
"from sklearn.ensemble import (RandomForestClassifier, GradientBoostingClassifier, \n",
" ExtraTreesClassifier, BaggingClassifier)\n",
"from sklearn.feature_selection import f_classif, chi2, VarianceThreshold\n",
"from sklearn.grid_search import GridSearchCV\n",
"from sklearn.linear_model import LogisticRegressionCV, RidgeClassifierCV\n",
"from sklearn.metrics import (accuracy_score, roc_auc_score, roc_curve, \n",
" precision_score, recall_score, precision_recall_curve)\n",
"from sklearn.naive_bayes import GaussianNB\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.pipeline import Pipeline, make_pipeline\n",
"from sklearn.preprocessing import RobustScaler, PolynomialFeatures\n",
"from sklearn.svm import SVC\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.utils import resample\n",
"\n",
"import h5py\n",
"import tables\n",
"\n",
"from hdf_utils import load_data\n",
"from stat_utils import common_binlims\n",
"\n",
"plt.style.use('foursigma')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['../precut_75_deg/atmuon.h5', '../precut_75_deg/nuelec_cc.h5', '../precut_75_deg/nuelec_nc.h5', '../precut_75_deg/numuon_cc.h5']\n"
]
}
],
"source": [
"lab_feat = 'dusj_MCtype'\n",
"#n_evts = 10000\n",
"prefix = '../precut_75_deg/'\n",
"fnames = sorted(glob(prefix + '*.h5'))\n",
"n_evts_per_file = {\n",
" prefix + 'atmuon.h5': 40000,\n",
" prefix + 'numuon_cc.h5': 40000,\n",
" prefix + 'nuelec_cc.h5': 20000,\n",
" prefix + 'nuelec_nc.h5': 20000,\n",
"}\n",
"fnames = sorted(n_evts_per_file.keys())\n",
"print(fnames)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def recToTwoDim(rec, dt=np.float64):\n",
" return rec.view(dt).reshape(rec.shape + (-1,)).view(np.ndarray)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loading tables...\n"
]
}
],
"source": [
"print(\"Loading tables...\")\n",
"rec = []\n",
"for fn in fnames:\n",
" with h5py.File(fn, 'r') as h5:\n",
" n_evts = n_evts_per_file[fn]\n",
" buf = h5['/mva'][:n_evts]\n",
" rec.append(buf)\n",
"\n",
"rec = np.concatenate(rec)\n",
"#plt.hist(rec['tf_r_dir_z'])\n",
"#zen_cut = rec['tf_r_dir_z'] > 0\n",
"#print(zen_cut)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['dusj_MCCh', 'dusj_MCby', 'dusj_MC_phi', 'dusj_MCpr', 'dusj_MC_theta', 'dusj_MCen', 'tf_MCen', 'dusj_MCtype', 'dusj_MC_x', 'dusj_MC_y', 'dusj_MC_z', 'dusj_EventID', 'EventID', 'tf_EventID', 'dusj_GlobalWeight', 'dusj_OneWeight', 'dusj_NEvents', 'dusj_LivetimeSec']\n"
]
}
],
"source": [
"feats = rec.dtype.names\n",
"mc_feats = []\n",
"mc_feats.extend([f for f in feats if 'MC' in f])\n",
" #('combinator', PolynomialFeatures())\n",
"mc_feats.extend([f for f in feats if 'ID' in f])\n",
"mc_feats.extend([f for f in feats if 'Weight' in f])\n",
"mc_feats.extend(['dusj_NEvents', 'dusj_LivetimeSec'])\n",
"reco_feats = [f for f in feats if f not in mc_feats]\n",
"print(mc_feats)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"X = rec[reco_feats]\n",
"X_mc = rec[mc_feats]\n",
"X = recToTwoDim(X)\n",
"X = np.nan_to_num(X)\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(120000, 68)\n"
]
}
],
"source": [
"# dont differ between particle/antiparticle\n",
"\n",
"preproc = Pipeline([\n",
" ('variance_cut', VarianceThreshold()),\n",
" ('robust_scaler', RobustScaler()),\n",
"])\n",
"\n",
"X = preproc.fit_transform(X)\n",
"print(X.shape)\n",
"#pd.DataFrame(X, columns=feats).describe()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"MC_TYPE_DICT = {\n",
" 12.0: 'nu_e',\n",
" 13.0: 'mu_atm',\n",
" 14.0: 'nu_mu',\n",
" 15.0: 'nu_tau',\n",
" -12.0: 'nu_e',\n",
" -13.0: 'mu_atm',\n",
" -14.0: 'nu_mu',\n",
" -15.0: 'nu_tau',\n",
" # \"Magic number\" indicating *something* went wrong\n",
" -1234.0: 'THIS_SHOULD_NOT_BE_HERE',\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(120000,)\n",
"[13 14]\n"
]
}
],
"source": [
"y = X_mc['dusj_MCtype']\n",
"labs = np.unique(y)\n",
"print(y.shape)\n",
"y = y.astype(int)\n",
"y = np.abs(y)\n",
"y[np.where(y == 12)] = 14\n",
"labs = np.unique(y)\n",
"print(labs)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.11.0\n"
]
}
],
"source": [
"# auto-binning only since numpy 1.11\n",
"print(np.__version__)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"rf = RandomForestClassifier(n_estimators=100, n_jobs=-1, class_weight='balanced')\n",
"et = ExtraTreesClassifier(n_estimators=500, n_jobs=-1, class_weight='balanced')\n",
"bdt = GradientBoostingClassifier(n_estimators=100)\n",
"dummy = DummyClassifier(strategy='stratified')\n",
"nb = GaussianNB()\n",
"knn = KNeighborsClassifier(n_neighbors=5)\n",
"lda = LinearDiscriminantAnalysis()\n",
"qda = QuadraticDiscriminantAnalysis()\n",
"svc = SVC(kernel='rbf', probability=True)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"clf = rf\n",
"\n",
"n_bs = 50\n",
"dists = defaultdict(list)\n",
"xval = StratifiedShuffleSplit(y, n_iter=n_bs, test_size=.2)\n",
"for k, (train, test) in enumerate(xval):\n",
" clf = clf.fit(X[train], y[train])\n",
" #y_pred = clf.predict(X[test])\n",
" y_proba = clf.predict_proba(X[test])[:, 0]\n",
" for lab in labs:\n",
" dists[lab].append(y_proba[np.where(y[test] == lab)])\n",
"for key, val in dists.iteritems():\n",
" dists[key] = np.concatenate(val)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[13, 14]\n",
"[ 1. 0.97 1. ..., 1. 0.99 1. ]\n"
]
}
],
"source": [
"print(dists.keys())\n",
"print(dists[13])"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7fe33f87ba90>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/mlotze/.virtualenvs/km3net/lib/python2.7/site-packages/matplotlib/font_manager.py:1288: UserWarning: findfont: Font family [u'cursive'] not found. Falling back to Bitstream Vera Sans\n",
" (prop.get_family(), self.defaultFamily[fontext]))\n",
"/home/mlotze/.virtualenvs/km3net/lib/python2.7/site-packages/matplotlib/font_manager.py:1288: UserWarning: findfont: Font family [u'serif'] not found. Falling back to Bitstream Vera Sans\n",
" (prop.get_family(), self.defaultFamily[fontext]))\n",
"/home/mlotze/.virtualenvs/km3net/lib/python2.7/site-packages/matplotlib/font_manager.py:1288: UserWarning: findfont: Font family [u'monospace'] not found. Falling back to Bitstream Vera Sans\n",
" (prop.get_family(), self.defaultFamily[fontext]))\n"
]
},
{
"data": {
"image/png": "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\nC919993auHFjJMtFCAQ75lu2bNEbb7yhVatWad++ffrXf/1XLV26VM8//3wUqsZABTvuf+3RRx9V\ncnLy176wA+ayM+a/+tWv9MMf/lB33HGHdu3apX379umiiy6KcMUYKDv/vt922236h3/4B33++eda\nt26d3n77bd1///1RqBoDUVNToylTpqijo+Nr/60+ePCgrrnmGs2dO1d79+7Vj370I1177bX65JNP\nTnySQCBgReJTX19vJSQkWNXV1b3bXnrpJSsnJ8fy+/192r7wwgtWTk6O5fV6e7fddddd1t/+7d9G\npFY+kR/zY32uueYaa968eVH/HnzCP+4bN260CgoKrN27d1sJCQmWz+eL+vfgE54x7+7utnJycqzt\n27dHvW4+kRnz//zP/7ROPfXUPtvuvfdea9asWVH/HnzsfX76059aa9assTZu3Gjl5eUdt93y5cut\n8847r8+27373u9Y999xzwnNEbMa0urpaycnJvQ/gl6Ti4mK53W7V1tb2abt161YVFhb2eQZqcXGx\n3n///UiVixCwM+bH0tDQoNzc3HCWiDCwO+719fW67bbbtHbtWg0dOjSSpSJE7Iz5O++8o+zsbG3d\nulXnnHOOvvGNb2ju3Lk6fPhwpMvGANgZ80svvVTd3d1atWqVJKmurk6//vWvNXfu3IjWjIFbsGBB\nUOO2detWTZkypc+2Cy64QB988MEJ+0YsmLrdbmVlZfXZlpOTI+loAPlq2xEjRvRr++VrTjE42Bnz\nr9qwYYM+/vhjlZeXh60+hIedcQ8EArrhhhu0ePFinXXWWRGrEaFlZ8x37typ+vp6/f73v9dzzz2n\nl19+WTU1Nbr11lsjVi8Gzs6Yu1wuvfnmm1q6dKnOPPNMFRUV6ac//alKSkoiVi8i63g57kQ/+yUp\nMVxFfdXXrUWwrL6PUj1e26+2g9nsjPlf27lzp2688UatWrVKI0eODEdpCCM74/7ggw/qm9/8pm64\n4YY++/m7PrjYGfPW1lYNGzZMzz33nBISjs6NLF++XN/5znfU2dmpIUOGhLVWhIadMf/y5tYzzjhD\n8+fP19q1a/Xggw9q0qRJ/EIaowaS4yI2Y+pyueTxePps+3IG9Mvfsv66bVNTU7+2X03fMJudMf/S\nrl27dPnll+uRRx5RaWlp2GtE6NkZ9+XLl+vXv/61srKylJWVpXPOOUeWZcnlcmnt2rURqxkDY2fM\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fe33f87b810>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nbins = 50\n",
"plt.figure(figsize=(10, 7.5))\n",
"for lab, probs in dists.iteritems():\n",
" plt.hist(probs, bins=np.linspace(0, 1, nbins+1), label=str(lab), \n",
" histtype='stepfilled', alpha=.5)\n",
"plt.yscale('log')\n",
"plt.xlabel('Score')\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's try some actuall pull validation here:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[]\n"
]
}
],
"source": [
"est = BaggingClassifier(DecisionTreeClassifier())\n",
"estimators = []\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1)\n",
"preds = []\n",
"#est = est.fit(X_train, y_train)\n",
"#for e in est.estimators_:\n",
"# preds.append(e.predict(X_test))\n",
"#\n",
"print(preds)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.8"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment