diff --git a/.gitignore b/.gitignore index 0d20b648..99ec4282 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.pyc +.idea diff --git a/Building Machine Learning Systems with Python, 2nd Edition.pdf b/Building Machine Learning Systems with Python, 2nd Edition.pdf new file mode 100644 index 00000000..8f9093fb Binary files /dev/null and b/Building Machine Learning Systems with Python, 2nd Edition.pdf differ diff --git a/Machine Learning Projects for .NET Developers [Brandewinder 2015-06-29].pdf b/Machine Learning Projects for .NET Developers [Brandewinder 2015-06-29].pdf new file mode 100644 index 00000000..fbaa711d Binary files /dev/null and b/Machine Learning Projects for .NET Developers [Brandewinder 2015-06-29].pdf differ diff --git a/Mastering Machine Learning with scikit-learn.pdf b/Mastering Machine Learning with scikit-learn.pdf new file mode 100644 index 00000000..0b1d857d Binary files /dev/null and b/Mastering Machine Learning with scikit-learn.pdf differ diff --git a/ch01/work.py b/ch01/work.py new file mode 100644 index 00000000..67d3c648 --- /dev/null +++ b/ch01/work.py @@ -0,0 +1,76 @@ +import scipy as sp +import os +from matplotlib import pyplot as plt + +data = sp.genfromtxt(os.path.join(os.getcwd(), 'data\\web_traffic.tsv') , delimiter='\t') + +# preprocessing +x = data[:, 0] +y = data[:, 1] +x = x[~sp.isnan(y)] +y = y[~sp.isnan(y)] + +# plot the data +plt.scatter(x, y, c='r' ,s=10) +plt.xlabel('Time/Hours') +plt.ylabel('Requests') +plt.title('Number of requests per hour') +plt.xticks([w*7*24 for w in range(10)], ['week %i' % w for w in range(10)]) +plt.grid(True) +plt.autoscale(tight=True) + +# choosing model + +# define the error function +def error(f, x, y): + return sp.sum((f(x) - y)**2) + +# simple straighe line + +def plot_models(): + plt.scatter(x, y, c='r', s=10) + plt.xlabel('Time/Hours') + plt.ylabel('Requests') + plt.title('Number of requests per hour') + plt.xticks([w * 7 * 24 for w in range(10)], ['week %i' % w for w in range(10)]) + plt.grid(True) + plt.autoscale(tight=True) + fx = sp.linspace(0, x[-1], 1000) + legends = [] + errors = [] + for i in [1, 2, 3, 10, 100]: + f = sp.poly1d(sp.polyfit(x, y, i)) + plt.plot(fx, f(fx), linewidth=2) + errors.append(error(f, x, y)) + legends.append(f.order) + + plt.legend(["d=%i" % o for o in legends], loc='upper left') + return errors + +plt.show() + +inflection = 3.5*7*24 + +xa = x[:inflection] +ya = y[:inflection] + +xb = x[inflection:] +yb = y[inflection:] + +f1 = sp.poly1d(sp.polyfit(xa, ya, 1)) +f2 = sp.poly1d(sp.polyfit(xb, yb, 1)) + +plt.scatter(x, y, c='r', s=10) +plt.xlabel('Time/Hours') +plt.ylabel('Requests') +plt.title('Number of requests per hour') +plt.xticks([w * 7 * 24 for w in range(10)], ['week %i' % w for w in range(10)]) +plt.grid(True) +plt.autoscale(tight=True) + +fx = sp.linspace(0, x[-1], 1000) +plt.plot(fx, f1(fx), linewidth=2) +plt.plot(fx, f2(fx), linewidth=2) + + + diff --git a/ch07/work.ipynb b/ch07/work.ipynb new file mode 100644 index 00000000..6c90b986 --- /dev/null +++ b/ch07/work.ipynb @@ -0,0 +1,415 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.datasets import load_boston\n", + "boston = load_boston()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'DESCR': \"Boston House Prices dataset\\n===========================\\n\\nNotes\\n------\\nData Set Characteristics: \\n\\n :Number of Instances: 506 \\n\\n :Number of Attributes: 13 numeric/categorical predictive\\n \\n :Median Value (attribute 14) is usually the target\\n\\n :Attribute Information (in order):\\n - CRIM per capita crime rate by town\\n - ZN proportion of residential land zoned for lots over 25,000 sq.ft.\\n - INDUS proportion of non-retail business acres per town\\n - CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\\n - NOX nitric oxides concentration (parts per 10 million)\\n - RM average number of rooms per dwelling\\n - AGE proportion of owner-occupied units built prior to 1940\\n - DIS weighted distances to five Boston employment centres\\n - RAD index of accessibility to radial highways\\n - TAX full-value property-tax rate per $10,000\\n - PTRATIO pupil-teacher ratio by town\\n - B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town\\n - LSTAT % lower status of the population\\n - MEDV Median value of owner-occupied homes in $1000's\\n\\n :Missing Attribute Values: None\\n\\n :Creator: Harrison, D. and Rubinfeld, D.L.\\n\\nThis is a copy of UCI ML housing dataset.\\nhttp://archive.ics.uci.edu/ml/datasets/Housing\\n\\n\\nThis dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.\\n\\nThe Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic\\nprices and the demand for clean air', J. Environ. Economics & Management,\\nvol.5, 81-102, 1978. Used in Belsley, Kuh & Welsch, 'Regression diagnostics\\n...', Wiley, 1980. N.B. Various transformations are used in the table on\\npages 244-261 of the latter.\\n\\nThe Boston house-price data has been used in many machine learning papers that address regression\\nproblems. \\n \\n**References**\\n\\n - Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261.\\n - Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.\\n - many more! (see http://archive.ics.uci.edu/ml/datasets/Housing)\\n\",\n 'data': array([[ 6.32000000e-03, 1.80000000e+01, 2.31000000e+00, ...,\n 1.53000000e+01, 3.96900000e+02, 4.98000000e+00],\n [ 2.73100000e-02, 0.00000000e+00, 7.07000000e+00, ...,\n 1.78000000e+01, 3.96900000e+02, 9.14000000e+00],\n [ 2.72900000e-02, 0.00000000e+00, 7.07000000e+00, ...,\n 1.78000000e+01, 3.92830000e+02, 4.03000000e+00],\n ..., \n [ 6.07600000e-02, 0.00000000e+00, 1.19300000e+01, ...,\n 2.10000000e+01, 3.96900000e+02, 5.64000000e+00],\n [ 1.09590000e-01, 0.00000000e+00, 1.19300000e+01, ...,\n 2.10000000e+01, 3.93450000e+02, 6.48000000e+00],\n [ 4.74100000e-02, 0.00000000e+00, 1.19300000e+01, ...,\n 2.10000000e+01, 3.96900000e+02, 7.88000000e+00]]),\n 'feature_names': array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',\n 'TAX', 'PTRATIO', 'B', 'LSTAT'], \n dtype='|S7'),\n 'target': array([ 24. , 21.6, 34.7, 33.4, 36.2, 28.7, 22.9, 27.1, 16.5,\n 18.9, 15. , 18.9, 21.7, 20.4, 18.2, 19.9, 23.1, 17.5,\n 20.2, 18.2, 13.6, 19.6, 15.2, 14.5, 15.6, 13.9, 16.6,\n 14.8, 18.4, 21. , 12.7, 14.5, 13.2, 13.1, 13.5, 18.9,\n 20. , 21. , 24.7, 30.8, 34.9, 26.6, 25.3, 24.7, 21.2,\n 19.3, 20. , 16.6, 14.4, 19.4, 19.7, 20.5, 25. , 23.4,\n 18.9, 35.4, 24.7, 31.6, 23.3, 19.6, 18.7, 16. , 22.2,\n 25. , 33. , 23.5, 19.4, 22. , 17.4, 20.9, 24.2, 21.7,\n 22.8, 23.4, 24.1, 21.4, 20. , 20.8, 21.2, 20.3, 28. ,\n 23.9, 24.8, 22.9, 23.9, 26.6, 22.5, 22.2, 23.6, 28.7,\n 22.6, 22. , 22.9, 25. , 20.6, 28.4, 21.4, 38.7, 43.8,\n 33.2, 27.5, 26.5, 18.6, 19.3, 20.1, 19.5, 19.5, 20.4,\n 19.8, 19.4, 21.7, 22.8, 18.8, 18.7, 18.5, 18.3, 21.2,\n 19.2, 20.4, 19.3, 22. , 20.3, 20.5, 17.3, 18.8, 21.4,\n 15.7, 16.2, 18. , 14.3, 19.2, 19.6, 23. , 18.4, 15.6,\n 18.1, 17.4, 17.1, 13.3, 17.8, 14. , 14.4, 13.4, 15.6,\n 11.8, 13.8, 15.6, 14.6, 17.8, 15.4, 21.5, 19.6, 15.3,\n 19.4, 17. , 15.6, 13.1, 41.3, 24.3, 23.3, 27. , 50. ,\n 50. , 50. , 22.7, 25. , 50. , 23.8, 23.8, 22.3, 17.4,\n 19.1, 23.1, 23.6, 22.6, 29.4, 23.2, 24.6, 29.9, 37.2,\n 39.8, 36.2, 37.9, 32.5, 26.4, 29.6, 50. , 32. , 29.8,\n 34.9, 37. , 30.5, 36.4, 31.1, 29.1, 50. , 33.3, 30.3,\n 34.6, 34.9, 32.9, 24.1, 42.3, 48.5, 50. , 22.6, 24.4,\n 22.5, 24.4, 20. , 21.7, 19.3, 22.4, 28.1, 23.7, 25. ,\n 23.3, 28.7, 21.5, 23. , 26.7, 21.7, 27.5, 30.1, 44.8,\n 50. , 37.6, 31.6, 46.7, 31.5, 24.3, 31.7, 41.7, 48.3,\n 29. , 24. , 25.1, 31.5, 23.7, 23.3, 22. , 20.1, 22.2,\n 23.7, 17.6, 18.5, 24.3, 20.5, 24.5, 26.2, 24.4, 24.8,\n 29.6, 42.8, 21.9, 20.9, 44. , 50. , 36. , 30.1, 33.8,\n 43.1, 48.8, 31. , 36.5, 22.8, 30.7, 50. , 43.5, 20.7,\n 21.1, 25.2, 24.4, 35.2, 32.4, 32. , 33.2, 33.1, 29.1,\n 35.1, 45.4, 35.4, 46. , 50. , 32.2, 22. , 20.1, 23.2,\n 22.3, 24.8, 28.5, 37.3, 27.9, 23.9, 21.7, 28.6, 27.1,\n 20.3, 22.5, 29. , 24.8, 22. , 26.4, 33.1, 36.1, 28.4,\n 33.4, 28.2, 22.8, 20.3, 16.1, 22.1, 19.4, 21.6, 23.8,\n 16.2, 17.8, 19.8, 23.1, 21. , 23.8, 23.1, 20.4, 18.5,\n 25. , 24.6, 23. , 22.2, 19.3, 22.6, 19.8, 17.1, 19.4,\n 22.2, 20.7, 21.1, 19.5, 18.5, 20.6, 19. , 18.7, 32.7,\n 16.5, 23.9, 31.2, 17.5, 17.2, 23.1, 24.5, 26.6, 22.9,\n 24.1, 18.6, 30.1, 18.2, 20.6, 17.8, 21.7, 22.7, 22.6,\n 25. , 19.9, 20.8, 16.8, 21.9, 27.5, 21.9, 23.1, 50. ,\n 50. , 50. , 50. , 50. , 13.8, 13.8, 15. , 13.9, 13.3,\n 13.1, 10.2, 10.4, 10.9, 11.3, 12.3, 8.8, 7.2, 10.5,\n 7.4, 10.2, 11.5, 15.1, 23.2, 9.7, 13.8, 12.7, 13.1,\n 12.5, 8.5, 5. , 6.3, 5.6, 7.2, 12.1, 8.3, 8.5,\n 5. , 11.9, 27.9, 17.2, 27.5, 15. , 17.2, 17.9, 16.3,\n 7. , 7.2, 7.5, 10.4, 8.8, 8.4, 16.7, 14.2, 20.8,\n 13.4, 11.7, 8.3, 10.2, 10.9, 11. , 9.5, 14.5, 14.1,\n 16.1, 14.3, 11.7, 13.4, 9.6, 8.7, 8.4, 12.8, 10.5,\n 17.1, 18.4, 15.4, 10.8, 11.8, 14.9, 12.6, 14.1, 13. ,\n 13.4, 15.2, 16.1, 17.8, 14.9, 14.1, 12.7, 13.5, 14.9,\n 20. , 16.4, 17.7, 19.5, 20.2, 21.4, 19.9, 19. , 19.1,\n 19.1, 20.1, 19.9, 19.6, 23.2, 29.8, 13.8, 13.3, 16.7,\n 12. , 14.6, 21.4, 23. , 23.7, 25. , 21.8, 20.6, 21.2,\n 19.1, 20.6, 15.2, 7. , 8.1, 13.6, 20.1, 21.8, 24.5,\n 23.1, 19.7, 18.3, 21.2, 17.5, 16.8, 22.4, 20.6, 23.9,\n 22. , 11.9])}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "boston" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(506L, 13L)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "boston.data.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\no26CqucAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "from matplotlib import pyplot as plt\n", + "plt.scatter(boston.data[:, 5], boston.target, color='r')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import LinearRegression\n", + "lr = LinearRegression()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "x = boston.data[:, 5]\n", + "y = boston.target\n", + "import numpy as np\n", + "x = np.transpose(np.atleast_2d(x))\n", + "\n", + "lr.fit(x, y)\n", + "y_predicted = lr.predict(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "43.600551771169563" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.metrics import mean_squared_error\n", + "\n", + "mse = mean_squared_error(y, y_predicted)\n", + "mse" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6.6030713892225608" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rmse = np.sqrt(mse)\n", + "rmse" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.48352545599133423" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.metrics import r2_score\n", + "r2 = r2_score(y, y_predicted)\n", + "r2" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = boston.data\n", + "y = boston.target\n", + "lr.fit(x, y)\n", + "p = lr.predict(x)\n", + "plt.scatter(p, y)\n", + "plt.xlabel('Predicted price')\n", + "plt.ylabel('Actual price')\n", + "plt.plot([y.min(), y.max()], [[y.min()], [y.max()]])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6.097044039669913" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.cross_validation import KFold\n", + "kf = KFold(len(x), n_folds=5)\n", + "p = np.zeros_like(y)\n", + "\n", + "for train, test in kf:\n", + " lr.fit(x[train], y[train])\n", + " p[test] = lr.predict(x[test])\n", + " \n", + "rmse_cv = np.sqrt(mean_squared_error(y, p))\n", + "rmse_cv" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# P greater than N example" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.datasets import load_svmlight_file\n", + "import os\n", + "data, target = load_svmlight_file(os.path.join(os.getcwd(), 'ch07\\\\data\\\\E2006.train'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## OLS" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.00238297744011\n0.999985795589\n" + ] + } + ], + "source": [ + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.metrics import mean_squared_error, r2_score\n", + "import numpy as np\n", + "\n", + "lr = LinearRegression()\n", + "\n", + "lr.fit(data, target)\n", + "pred = lr.predict(data)\n", + "\n", + "rmse_train = np.sqrt(mean_squared_error(target, pred))\n", + "r2 = r2_score(target, pred)\n", + "print(rmse_train)\n", + "print(r2)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rmse:0.396742077005\nr2:0.606268739456\n" + ] + } + ], + "source": [ + "from sklearn.linear_model import ElasticNet\n", + "from sklearn.cross_validation import KFold\n", + "met = ElasticNet(alpha=0.1)\n", + "\n", + "kf = KFold(len(target), n_folds=5)\n", + "p = np.zeros_like(target)\n", + "\n", + "for train, test in kf:\n", + " met.fit(data[train], target[train])\n", + " p[test] = met.predict(data[test])\n", + "\n", + "print('rmse:' + str(np.sqrt(mean_squared_error(target, p))))\n", + "print('r2:' + str(r2_score(target, p)))" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 3, + "source": [ + "" + ] + }, + { + "cell_type": "heading", + "metadata": {}, + "level": 3, + "source": [ + "Hyperparameter" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "...\n0.653689239305\n" + ] + } + ], + "source": [ + "from sklearn.linear_model import ElasticNetCV\n", + "from sklearn.metrics import mean_squared_error, r2_score\n", + "import numpy as np\n", + "\n", + "met = ElasticNetCV(n_jobs=-1)\n", + "\n", + "kf = KFold(len(target), n_folds=5)\n", + "p = np.zeros_like(target)\n", + "for train, test in kf:\n", + " met.fit(data[train], target[train])\n", + " p[test] = met.predict(data[test])\n", + " print('...')\n", + " \n", + "r2_cv = r2_score(target, p)\n", + "print(r2_cv)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('dd')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2.0 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file