{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 随机森林分类器" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 一些准备工作和函数定义\n", "先定义了一个地形数据的产生器:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2019-08-11T14:01:07.977499Z", "start_time": "2019-08-11T14:01:07.958774Z" }, "code_folding": [ 4 ] }, "outputs": [], "source": [ "#!/usr/bin/python\n", "import random\n", "\n", "\n", "def makeTerrainData(n_points=5000):\n", " ###############################################################################\n", " # make the toy dataset\n", " random.seed(42)\n", " grade = [random.random() for ii in range(0, n_points)]\n", " bumpy = [random.random() for ii in range(0, n_points)]\n", " error = [random.random() for ii in range(0, n_points)]\n", " y = [round(grade[ii]*bumpy[ii]+0.3+0.1*error[ii])\n", " for ii in range(0, n_points)]\n", " for ii in range(0, len(y)):\n", " if grade[ii] > 0.8 or bumpy[ii] > 0.8:\n", " y[ii] = 1.0\n", "\n", "# split into train/test sets\n", " X = [[gg, ss] for gg, ss in zip(grade, bumpy)]\n", " split = int(0.75*n_points)\n", " X_train = X[0:split]\n", " X_test = X[split:]\n", " y_train = y[0:split]\n", " y_test = y[split:]\n", "\n", " grade_sig = [X_train[ii][0]\n", " for ii in range(0, len(X_train)) if y_train[ii] == 0]\n", " bumpy_sig = [X_train[ii][1]\n", " for ii in range(0, len(X_train)) if y_train[ii] == 0]\n", " grade_bkg = [X_train[ii][0]\n", " for ii in range(0, len(X_train)) if y_train[ii] == 1]\n", " bumpy_bkg = [X_train[ii][1]\n", " for ii in range(0, len(X_train)) if y_train[ii] == 1]\n", "\n", " training_data = {\"fast\": {\"grade\": grade_sig, \"bumpiness\": bumpy_sig}, \"slow\": {\n", " \"grade\": grade_bkg, \"bumpiness\": bumpy_bkg}}\n", "\n", " grade_sig = [X_test[ii][0]\n", " for ii in range(0, len(X_test)) if y_test[ii] == 0]\n", " bumpy_sig = [X_test[ii][1]\n", " for ii in range(0, len(X_test)) if y_test[ii] == 0]\n", " grade_bkg = [X_test[ii][0]\n", " for ii in range(0, len(X_test)) if y_test[ii] == 1]\n", " bumpy_bkg = [X_test[ii][1]\n", " for ii in range(0, len(X_test)) if y_test[ii] == 1]\n", "\n", " test_data = {\"fast\": {\"grade\": grade_sig, \"bumpiness\": bumpy_sig},\n", " \"low\": {\"grade\": grade_bkg, \"bumpiness\": bumpy_bkg}}\n", "\n", " return X_train, y_train, X_test, y_test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "定义出绘图函数 prettyPicture" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2019-08-11T14:01:09.056760Z", "start_time": "2019-08-11T14:01:08.823861Z" }, "code_folding": [ 9, 48 ] }, "outputs": [], "source": [ "#!/usr/bin/python\n", "\n", "import base64\n", "import json\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pylab as pl\n", "\n", "\n", "def prettyPicture(clf, X_test, y_test):\n", " x_min = 0.0\n", " x_max = 1.0\n", " y_min = 0.0\n", " y_max = 1.0\n", "\n", " # Plot the decision boundary. For that, we will assign a color to each\n", " # point in the mesh [x_min, m_max]x[y_min, y_max].\n", " h = .01 # step size in the mesh\n", " xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n", " np.arange(y_min, y_max, h))\n", " Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n", "\n", " # Put the result into a color plot\n", " Z = Z.reshape(xx.shape)\n", " plt.xlim(xx.min(), xx.max())\n", " plt.ylim(yy.min(), yy.max())\n", "\n", " plt.pcolormesh(xx, yy, Z, cmap=pl.cm.seismic)\n", "\n", " # Plot also the test points\n", " grade_sig = [X_test[ii][0]\n", " for ii in range(0, len(X_test)) if y_test[ii] == 0]\n", " bumpy_sig = [X_test[ii][1]\n", " for ii in range(0, len(X_test)) if y_test[ii] == 0]\n", " grade_bkg = [X_test[ii][0]\n", " for ii in range(0, len(X_test)) if y_test[ii] == 1]\n", " bumpy_bkg = [X_test[ii][1]\n", " for ii in range(0, len(X_test)) if y_test[ii] == 1]\n", "\n", " plt.scatter(grade_sig, bumpy_sig, color=\"b\", label=\"fast\")\n", " plt.scatter(grade_bkg, bumpy_bkg, color=\"r\", label=\"slow\")\n", " plt.legend()\n", " plt.xlabel(\"bumpiness\")\n", " plt.ylabel(\"grade\")\n", "\n", " #plt.savefig(\"test.png\",dpi=300)\n", "\n", "\n", "def output_image(name, format, bytes):\n", " image_start = \"BEGIN_IMAGE_f9825uweof8jw9fj4r8\"\n", " image_end = \"END_IMAGE_0238jfw08fjsiufhw8frs\"\n", " data = {}\n", " data['name'] = name\n", " data['format'] = format\n", " data['bytes'] = base64.encodestring(bytes)\n", " print(image_start+json.dumps(data)+image_end)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 主要代码如下:\n", "导入 *matplotlib* 并且使用 *%matplotlib inline* 魔法语句强制在 notebook 中绘图输出" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2019-08-11T14:01:10.211414Z", "start_time": "2019-08-11T14:01:10.206082Z" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2019-08-11T14:14:56.911309Z", "start_time": "2019-08-11T14:14:45.097381Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training data lenth is 3750\n", "training time: 0.979 s\n", "predicting time: 0.072 s\n", "1199 1250\n", "Estimator num is 400\n", "The accuracy is 95.92 %\n", "training time: 0.975 s\n", "predicting time: 0.075 s\n", "1202 1250\n", "Estimator num is 410\n", "The accuracy is 96.16 %\n", "training time: 1.01 s\n", "predicting time: 0.077 s\n", "1200 1250\n", "Estimator num is 420\n", "The accuracy is 96.0 %\n", "training time: 1.05 s\n", "predicting time: 0.087 s\n", "1201 1250\n", "Estimator num is 430\n", "The accuracy is 96.08 %\n", "training time: 1.05 s\n", "predicting time: 0.08 s\n", "1200 1250\n", "Estimator num is 440\n", "The accuracy is 96.0 %\n", "training time: 1.078 s\n", "predicting time: 0.082 s\n", "1199 1250\n", "Estimator num is 450\n", "The accuracy is 95.92 %\n", "training time: 1.154 s\n", "predicting time: 0.116 s\n", "1200 1250\n", "Estimator num is 460\n", "The accuracy is 96.0 %\n", "training time: 1.14 s\n", "predicting time: 0.087 s\n", "1201 1250\n", "Estimator num is 470\n", "The accuracy is 96.08 %\n", "training time: 1.167 s\n", "predicting time: 0.086 s\n", "1201 1250\n", "Estimator num is 480\n", "The accuracy is 96.08 %\n", "training time: 1.177 s\n", "predicting time: 0.088 s\n", "1201 1250\n", "Estimator num is 490\n", "The accuracy is 96.08 %\n", "The max acc is 96.16\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from time import time\n", "from sklearn.ensemble import RandomForestClassifier\n", "features_train, labels_train, features_test, labels_test = makeTerrainData()\n", "print(\"Training data lenth is\", len(features_train))\n", "acc_list = []\n", "estimators_list = []\n", "erange = range(400,500,10)\n", "for estimators in erange:\n", " clf = RandomForestClassifier(n_estimators=estimators)\n", " t0 = time()\n", " clf = clf.fit(features_train, labels_train)\n", " print(\"training time:\", round(time()-t0, 3), \"s\")\n", "\n", " t1 = time()\n", " result = clf.predict(features_test)\n", " print(\"predicting time:\", round(time()-t1, 3), \"s\")\n", "\n", " corr = 0\n", " for x in range(0, len(result)):\n", " if result[x] == labels_test[x]:\n", " corr = corr + 1\n", " print(corr, len(result))\n", " num = float(len(result))\n", " acc = 0.0\n", " acc = round(corr/num*100, 3)\n", " print(\"Estimator num is\", estimators)\n", " print(\"The accuracy is\", acc, \"%\")\n", " acc_list.append(acc)\n", " estimators_list.append(estimators)\n", "print (\"The max acc is\", max(acc_list))\n", "plt.figure()\n", "plt.plot(estimators_list, acc_list, \"o--\")\n", "#prettyPicture(clf, features_test, labels_test)\n", "#plt.legend()\n", "plt.xlabel(\"Num of estimator\")\n", "plt.ylabel(\"Accuracy\")\n", "plt.savefig(\"Random_Forest_acc.png\",dpi=200)" ] } ], "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.7.3" }, "toc-showmarkdowntxt": false }, "nbformat": 4, "nbformat_minor": 4 }