Skip to content

Instantly share code, notes, and snippets.

@Jeffrey04 Jeffrey04/boost-annoy.ipynb Secret
Last active Nov 6, 2018

Embed
What would you like to do?
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-05T18:14:14.630415Z",
"start_time": "2018-11-05T18:14:13.209997Z"
},
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-06T06:31:49.147758Z",
"start_time": "2018-11-06T06:31:49.124920Z"
}
},
"outputs": [],
"source": [
"from sklearn.preprocessing import MinMaxScaler\n",
"from sklearn.datasets import fetch_california_housing\n",
"\n",
"ds = fetch_california_housing(data_home='.', download_if_missing=True)\n",
"x = MinMaxScaler().fit_transform(ds.data)\n",
"y = MinMaxScaler().fit_transform(ds.target.reshape(-1, 1))"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-06T06:31:50.285974Z",
"start_time": "2018-11-06T06:31:50.167056Z"
},
"collapsed": true
},
"outputs": [],
"source": [
"from functools import reduce\n",
"\n",
"def distance(points, plane_normal, d): \n",
" return np.divide(np.add(d, np.sum(np.multiply(points, plane_normal), axis=1).reshape(-1,1)),\n",
" np.sqrt(np.sum(np.power(plane_normal, 2))))\n",
"\n",
"def split_points(x):\n",
" idx = np.random.randint(x.shape[0], size=2)\n",
" points = x[idx,]\n",
" plane_normal = np.subtract(*points)\n",
"\n",
" return split_points(x) if np.all(plane_normal == 0) else (points, plane_normal)\n",
"\n",
"def tree_build(penalty, x, y):\n",
" points, plane_normal = split_points(x)\n",
" plane_point = np.divide(np.add(*points), 2)\n",
" d = 0 - np.sum(np.multiply(plane_normal, plane_point))\n",
" dist = distance(x, plane_normal, d)\n",
"\n",
" return {'plane_normal': plane_normal,\n",
" 'd': d,\n",
" 'points': (y[dist >= 0].size, y[dist < 0].size),\n",
" 'mean': (penalty * np.mean(y[dist >= 0]),\n",
" penalty * np.mean(y[dist < 0]))}\n",
"\n",
"def boost_annoy(B, penalty, x, y):\n",
" return [tree_build(penalty, x, y) for b in range(B)]\n",
"\n",
"def boost_annoy_transform(forest, x):\n",
" result = np.zeros((x.shape[0], 1))\n",
" for tree in forest:\n",
" dist = distance(x, tree['plane_normal'], tree['d'])\n",
" result = np.add(result, np.where(dist >= 0, tree['mean'][0], tree['mean'][1]))\n",
" \n",
" return result"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-06T12:40:15.804372Z",
"start_time": "2018-11-06T12:40:15.772868Z"
},
"collapsed": true
},
"outputs": [],
"source": [
"performance = []"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-06T13:41:54.719751Z",
"start_time": "2018-11-06T12:40:16.997958Z"
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fitting 0 at size 1\n",
"fitting 1 at size 1\n",
"fitting 2 at size 1\n",
"fitting 3 at size 1\n",
"fitting 4 at size 1\n",
"fitting 5 at size 1\n",
"fitting 6 at size 1\n",
"fitting 7 at size 1\n",
"fitting 8 at size 1\n",
"fitting 9 at size 1\n",
"fitting 0 at size 10\n",
"fitting 1 at size 10\n",
"fitting 2 at size 10\n",
"fitting 3 at size 10\n",
"fitting 4 at size 10\n",
"fitting 5 at size 10\n",
"fitting 6 at size 10\n",
"fitting 7 at size 10\n",
"fitting 8 at size 10\n",
"fitting 9 at size 10\n",
"fitting 0 at size 100\n",
"fitting 1 at size 100\n",
"fitting 2 at size 100\n",
"fitting 3 at size 100\n",
"fitting 4 at size 100\n",
"fitting 5 at size 100\n",
"fitting 6 at size 100\n",
"fitting 7 at size 100\n",
"fitting 8 at size 100\n",
"fitting 9 at size 100\n",
"fitting 0 at size 1000\n",
"fitting 1 at size 1000\n",
"fitting 2 at size 1000\n",
"fitting 3 at size 1000\n",
"fitting 4 at size 1000\n",
"fitting 5 at size 1000\n",
"fitting 6 at size 1000\n",
"fitting 7 at size 1000\n",
"fitting 8 at size 1000\n",
"fitting 9 at size 1000\n",
"fitting 0 at size 2000\n",
"fitting 1 at size 2000\n",
"fitting 2 at size 2000\n",
"fitting 3 at size 2000\n",
"fitting 4 at size 2000\n",
"fitting 5 at size 2000\n",
"fitting 6 at size 2000\n",
"fitting 7 at size 2000\n",
"fitting 8 at size 2000\n",
"fitting 9 at size 2000\n",
"fitting 0 at size 5000\n",
"fitting 1 at size 5000\n",
"fitting 2 at size 5000\n",
"fitting 3 at size 5000\n",
"fitting 4 at size 5000\n",
"fitting 5 at size 5000\n",
"fitting 6 at size 5000\n",
"fitting 7 at size 5000\n",
"fitting 8 at size 5000\n",
"fitting 9 at size 5000\n",
"fitting 0 at size 10000\n",
"fitting 1 at size 10000\n",
"fitting 2 at size 10000\n",
"fitting 3 at size 10000\n",
"fitting 4 at size 10000\n",
"fitting 5 at size 10000\n",
"fitting 6 at size 10000\n",
"fitting 7 at size 10000\n",
"fitting 8 at size 10000\n",
"fitting 9 at size 10000\n",
"fitting 0 at size 12500\n",
"fitting 1 at size 12500\n",
"fitting 2 at size 12500\n",
"fitting 3 at size 12500\n",
"fitting 4 at size 12500\n",
"fitting 5 at size 12500\n",
"fitting 6 at size 12500\n",
"fitting 7 at size 12500\n",
"fitting 8 at size 12500\n",
"fitting 9 at size 12500\n",
"fitting 0 at size 15000\n",
"fitting 1 at size 15000\n",
"fitting 2 at size 15000\n",
"fitting 3 at size 15000\n",
"fitting 4 at size 15000\n",
"fitting 5 at size 15000\n",
"fitting 6 at size 15000\n",
"fitting 7 at size 15000\n",
"fitting 8 at size 15000\n",
"fitting 9 at size 15000\n",
"fitting 0 at size 17500\n",
"fitting 1 at size 17500\n",
"fitting 2 at size 17500\n",
"fitting 3 at size 17500\n",
"fitting 4 at size 17500\n",
"fitting 5 at size 17500\n",
"fitting 6 at size 17500\n",
"fitting 7 at size 17500\n",
"fitting 8 at size 17500\n",
"fitting 9 at size 17500\n",
"fitting 0 at size 20000\n",
"fitting 1 at size 20000\n",
"fitting 2 at size 20000\n",
"fitting 3 at size 20000\n",
"fitting 4 at size 20000\n",
"fitting 5 at size 20000\n",
"fitting 6 at size 20000\n",
"fitting 7 at size 20000\n",
"fitting 8 at size 20000\n",
"fitting 9 at size 20000\n"
]
}
],
"source": [
"from sklearn.model_selection import KFold\n",
"from sklearn.metrics import mean_squared_error\n",
"\n",
"_performance = {'train': [], 'test': []}\n",
"for B in (1, 10, 100, 1000, 2000, 5000, 10000, 12500, 15000, 17500, 20000):\n",
" observations = KFold(n_splits=10).split(x, y)\n",
" mse = {'train': [], 'test': []}\n",
"\n",
" for (i, (train, test)) in enumerate(observations):\n",
" print('fitting {} at size {}'.format(i, B))\n",
" forest = boost_annoy(B, 0.0001, x[train,], y[train,])\n",
" y_hat_test = boost_annoy_transform(forest, x[test,])\n",
" y_hat_train = boost_annoy_transform(forest, x[train,])\n",
"\n",
" mse['test'].append(mean_squared_error(y[test,], y_hat_test))\n",
" mse['train'].append(mean_squared_error(y[train,], y_hat_train))\n",
"\n",
" _performance['test'].append((B, np.mean(mse['test'])))\n",
" _performance['train'].append((B, np.mean(mse['train'])))\n",
" \n",
"performance.append(('annoy test', _performance['test']))\n",
"performance.append(('annoy train', _performance['train']))"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-06T16:25:41.811945Z",
"start_time": "2018-11-06T13:41:54.748700Z"
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fitting 0 at size 1\n",
"fitting 1 at size 1\n",
"fitting 2 at size 1\n",
"fitting 3 at size 1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/site-packages/sklearn/utils/validation.py:526: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
" y = column_or_1d(y, warn=True)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"fitting 4 at size 1\n",
"fitting 5 at size 1\n",
"fitting 6 at size 1\n",
"fitting 7 at size 1\n",
"fitting 8 at size 1\n",
"fitting 9 at size 1\n",
"fitting 0 at size 10\n",
"fitting 1 at size 10\n",
"fitting 2 at size 10\n",
"fitting 3 at size 10\n",
"fitting 4 at size 10\n",
"fitting 5 at size 10\n",
"fitting 6 at size 10\n",
"fitting 7 at size 10\n",
"fitting 8 at size 10\n",
"fitting 9 at size 10\n",
"fitting 0 at size 100\n",
"fitting 1 at size 100\n",
"fitting 2 at size 100\n",
"fitting 3 at size 100\n",
"fitting 4 at size 100\n",
"fitting 5 at size 100\n",
"fitting 6 at size 100\n",
"fitting 7 at size 100\n",
"fitting 8 at size 100\n",
"fitting 9 at size 100\n",
"fitting 0 at size 1000\n",
"fitting 1 at size 1000\n",
"fitting 2 at size 1000\n",
"fitting 3 at size 1000\n",
"fitting 4 at size 1000\n",
"fitting 5 at size 1000\n",
"fitting 6 at size 1000\n",
"fitting 7 at size 1000\n",
"fitting 8 at size 1000\n",
"fitting 9 at size 1000\n",
"fitting 0 at size 2000\n",
"fitting 1 at size 2000\n",
"fitting 2 at size 2000\n",
"fitting 3 at size 2000\n",
"fitting 4 at size 2000\n",
"fitting 5 at size 2000\n",
"fitting 6 at size 2000\n",
"fitting 7 at size 2000\n",
"fitting 8 at size 2000\n",
"fitting 9 at size 2000\n",
"fitting 0 at size 5000\n",
"fitting 1 at size 5000\n",
"fitting 2 at size 5000\n",
"fitting 3 at size 5000\n",
"fitting 4 at size 5000\n",
"fitting 5 at size 5000\n",
"fitting 6 at size 5000\n",
"fitting 7 at size 5000\n",
"fitting 8 at size 5000\n",
"fitting 9 at size 5000\n",
"fitting 0 at size 10000\n",
"fitting 1 at size 10000\n",
"fitting 2 at size 10000\n",
"fitting 3 at size 10000\n",
"fitting 4 at size 10000\n",
"fitting 5 at size 10000\n",
"fitting 6 at size 10000\n",
"fitting 7 at size 10000\n",
"fitting 8 at size 10000\n",
"fitting 9 at size 10000\n",
"fitting 0 at size 12500\n",
"fitting 1 at size 12500\n",
"fitting 2 at size 12500\n",
"fitting 3 at size 12500\n",
"fitting 4 at size 12500\n",
"fitting 5 at size 12500\n",
"fitting 6 at size 12500\n",
"fitting 7 at size 12500\n",
"fitting 8 at size 12500\n",
"fitting 9 at size 12500\n",
"fitting 0 at size 15000\n",
"fitting 1 at size 15000\n",
"fitting 2 at size 15000\n",
"fitting 3 at size 15000\n",
"fitting 4 at size 15000\n",
"fitting 5 at size 15000\n",
"fitting 6 at size 15000\n",
"fitting 7 at size 15000\n",
"fitting 8 at size 15000\n",
"fitting 9 at size 15000\n",
"fitting 0 at size 17500\n",
"fitting 1 at size 17500\n",
"fitting 2 at size 17500\n",
"fitting 3 at size 17500\n",
"fitting 4 at size 17500\n",
"fitting 5 at size 17500\n",
"fitting 6 at size 17500\n",
"fitting 7 at size 17500\n",
"fitting 8 at size 17500\n",
"fitting 9 at size 17500\n",
"fitting 0 at size 20000\n",
"fitting 1 at size 20000\n",
"fitting 2 at size 20000\n",
"fitting 3 at size 20000\n",
"fitting 4 at size 20000\n",
"fitting 5 at size 20000\n",
"fitting 6 at size 20000\n",
"fitting 7 at size 20000\n",
"fitting 8 at size 20000\n",
"fitting 9 at size 20000\n"
]
}
],
"source": [
"from sklearn.ensemble import GradientBoostingRegressor\n",
"\n",
"_performance = {'train': [], 'test': []}\n",
"for B in (1, 10, 100, 1000, 2000, 5000, 10000, 12500, 15000, 17500, 20000):\n",
" observations = KFold(n_splits=10).split(x, y)\n",
" mse = {'train': [], 'test': []}\n",
"\n",
" for (i, (train, test)) in enumerate(observations):\n",
" print('fitting {} at size {}'.format(i, B))\n",
" est = GradientBoostingRegressor(n_estimators=B, learning_rate=0.0001,\n",
" max_depth=1, random_state=0, loss='ls') \\\n",
" .fit(x[train,], y[train,])\n",
"\n",
"\n",
" mse['test'].append(mean_squared_error(y[test,], est.predict(x[test,])))\n",
" mse['train'].append(mean_squared_error(y[train,], est.predict(x[train,])))\n",
"\n",
" _performance['test'].append((B, np.mean(mse['test'])))\n",
" _performance['train'].append((B, np.mean(mse['train'])))\n",
" \n",
"performance.append(('gradient test', _performance['test']))\n",
"performance.append(('gradient train', _performance['train']))"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"ExecuteTime": {
"end_time": "2018-11-06T16:25:43.020692Z",
"start_time": "2018-11-06T16:25:41.885137Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[('annoy test',\n",
" [(1, 0.21305913416298181),\n",
" (10, 0.21277847217541485),\n",
" (100, 0.20998181563653126),\n",
" (1000, 0.18345259417847154),\n",
" (2000, 0.15689560382084658),\n",
" (5000, 0.096006471774216048),\n",
" (10000, 0.056995259302669007),\n",
" (12500, 0.066851411781591805),\n",
" (15000, 0.096214612761149204),\n",
" (17500, 0.14504434011906395),\n",
" (20000, 0.21353345861339021)]),\n",
" ('annoy train',\n",
" [(1, 0.21305872132461096),\n",
" (10, 0.21277489779432335),\n",
" (100, 0.20994592992398839),\n",
" (1000, 0.18308069915587358),\n",
" (2000, 0.15618616456068338),\n",
" (5000, 0.094309692331934911),\n",
" (10000, 0.053891217341322087),\n",
" (12500, 0.063079304046509438),\n",
" (15000, 0.09187875499901399),\n",
" (17500, 0.14023153530648952),\n",
" (20000, 0.20816480002350465)]),\n",
" ('gradient test',\n",
" [(1, 0.058684407945535512),\n",
" (10, 0.058652201223142034),\n",
" (100, 0.058333750027273035),\n",
" (1000, 0.055433700601809507),\n",
" (2000, 0.052679831856731321),\n",
" (5000, 0.046444420119701874),\n",
" (10000, 0.040025232390181534),\n",
" (12500, 0.037939972738728914),\n",
" (15000, 0.036472019318824031),\n",
" (17500, 0.035261305820427427),\n",
" (20000, 0.034190709107858798)]),\n",
" ('gradient train',\n",
" [(1, 0.056494022225521502),\n",
" (10, 0.056462518382565087),\n",
" (100, 0.056150561576032362),\n",
" (1000, 0.053302213865710324),\n",
" (2000, 0.050594583797189396),\n",
" (5000, 0.044473673002460162),\n",
" (10000, 0.038206069147915613),\n",
" (12500, 0.036178601367478469),\n",
" (15000, 0.034595079973680463),\n",
" (17500, 0.03326354483135071),\n",
" (20000, 0.032102088175349791)])]"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10affe860>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"for label, series in performance:\n",
" plt.plot([B for B, mse in series],\n",
" [mse for B, mse in series],\n",
" label=label,\n",
" marker='x')\n",
"plt.legend()\n",
"performance"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.