From a05e45295ec3f1431cf741951decc66105cb1564 Mon Sep 17 00:00:00 2001 From: benjas <909336740@qq.com> Date: Fri, 25 Dec 2020 11:05:11 +0800 Subject: [PATCH] =?UTF-8?q?Add=20=E5=9F=BA=E7=A1=80=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E6=AF=94=E8=BE=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...分析_建筑能源利用率预测.ipynb | 239 +++++++++++++++++- 1 file changed, 237 insertions(+), 2 deletions(-) diff --git a/机器学习竞赛实战_优胜解决方案/建筑能源利用率预测/建模与分析_建筑能源利用率预测.ipynb b/机器学习竞赛实战_优胜解决方案/建筑能源利用率预测/建模与分析_建筑能源利用率预测.ipynb index 28335ad..11a7735 100644 --- a/机器学习竞赛实战_优胜解决方案/建筑能源利用率预测/建模与分析_建筑能源利用率预测.ipynb +++ b/机器学习竞赛实战_优胜解决方案/建筑能源利用率预测/建模与分析_建筑能源利用率预测.ipynb @@ -909,14 +909,249 @@ "print(np.where(~np.isfinite(X_test)))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 特征标准化与归一化" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ - "## 特征" + "# Create the scaler object with a range of 0-1\n", + "scaler = MinMaxScaler(feature_range=(0, 1))\n", + "\n", + "# Fit on the training data\n", + "scaler.fit(X)\n", + "\n", + "# Transform both training data and testing data\n", + "X = scaler.transform(X)\n", + "X_test = scaler.transform(X_test)" ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Convert y to one-dimensional array (vector)\n", + "y = np.array(train_labels).reshape((-1, ))\n", + "y_test = np.array(test_labels).reshape((-1, ))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 选择的机器学习算法(回归问题)\n", + " 1. Linear Regression\n", + " 2. Support Vector Machine Regression\n", + " 3. Random Forest Regression\n", + " 4. Gradient Boosting Regression\n", + " 5. K-Nearest Neighbors Regression\n", + "\n", + "这里先使用默认参数,后续再调参" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Function to calculation mean absolute error\n", + "def mae (y_true,y_pred):\n", + " return np.mean(abs(y_true - y_pred))\n", + "\n", + "# Takes in a model, trains the model, and evaluates the model on the test set\n", + "def fit_and_evaluate(model):\n", + " \n", + " # Train the model\n", + " model.fit(X,y)\n", + " \n", + " # Make predictions and evalute\n", + " model_pred = model.predict(X_test)\n", + " model_mae = mae(y_test,model_pred)\n", + " \n", + " # Return the performance metric\n", + " return model_mae" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Linear Regression Performance on the test set: MAE = 13.4651\n" + ] + } + ], + "source": [ + "lr = LinearRegression()\n", + "lr_mae = fit_and_evaluate(lr)\n", + "\n", + "print('Linear Regression Performance on the test set: MAE = %0.4f'% lr_mae)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Support Vector Machine Regression Performance on the test set: MAE = 10.9337\n" + ] + } + ], + "source": [ + "svm = SVR(C=1000,gamma =0.1)\n", + "svm_mae = fit_and_evaluate(svm)\n", + "\n", + "print('Support Vector Machine Regression Performance on the test set: MAE = %0.4f' % svm_mae)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "D:\\Anaconda3\\lib\\site-packages\\sklearn\\ensemble\\forest.py:245: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22.\n", + " \"10 in version 0.20 to 100 in 0.22.\", FutureWarning)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Random Forest Regression Performance on the test set: MAE = 10.0073\n" + ] + } + ], + "source": [ + "random_forest = RandomForestRegressor(random_state = 60)\n", + "random_forest_mae = fit_and_evaluate(random_forest)\n", + "\n", + "print('Random Forest Regression Performance on the test set: MAE = %0.4f' % random_forest_mae)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gradient Boosted Regression Performance on the test set: MAE = 10.0144\n" + ] + } + ], + "source": [ + "gradient_boosted = GradientBoostingRegressor(random_state=60)\n", + "gradient_boosted_mae = fit_and_evaluate(gradient_boosted)\n", + "\n", + "print('Gradient Boosted Regression Performance on the test set: MAE = %0.4f' % gradient_boosted_mae)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K-Nearest Neighbors Regression Performance on the test set: MAE = 13.0131\n" + ] + } + ], + "source": [ + "knn = KNeighborsRegressor(n_neighbors=10)\n", + "knn_mae = fit_and_evaluate(knn)\n", + "\n", + "print('K-Nearest Neighbors Regression Performance on the test set: MAE = %0.4f' % knn_mae)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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58/nq6++4rPPPiMxMZEWLVqQPXt2QkJCmDFjRqprLF++nIkTJ/KPf/yDDz/8kJs3bzJ69GiCgoJM6g0fPpxJkyZhZWVF8+bNad68OdmyZWPFihX06dMn1XVXrFjBxo0badGiBW+//Tbly5dPVefevXv06dOHtWvXGs//nXfeYf369fj6+nLjxg2jbsr83127dlGpUiXjg8bMmTP597//zf37902ufefOHbp27cqJEydo3LgxNWrU4M8//6R3796cO3cuw9fmWV6L48eP0717dywtLWnRogUlS5Zk48aN9OrVi8TExMfe72mFhITQp08fTp8+Tb169WjWrBmXL19m4MCBLF682KgXExNDz5492bVrFx988AHt2rXD3d2dkJAQevbsSUJCAlZWVvj6+hq98f/6179o2LDhE8Xh5eWFjY0NYWFhqcpCQ0PJly9fmq99iq1bt3Lr1i3q1q0LQO3atbGysmLVqlUmf6/lzaQeThF5JrVq1WLt2rVs3brVZM7Xpk2bcHR0pFKlSvzyyy8m50RHRzNlyhQKFCjAzJkzcXV1BeDu3bv079+fDRs2UK1aNRo1asStW7eMYew5c+aQP39+AFq3bk23bt1SxTNu3DguX77MhAkTTHp4lixZwsSJE5k1axa9e/d+qjZeunQJgCJFijzVeQcOHGDx4sW89dZbTJ061UhEr127Ro8ePVi0aBHVqlXjvffeM87566+/THoLmzdvTqtWrVi1ahXt27fH398fSF7Z27RpU9avX0+/fv1M7nvs2DG++uorateuDUCXLl2MuXQNGjSgSJEiHDp0iNDQUBo0aMDo0aONc+Pj4+nYsSNHjx4lKioKd3d3o+zatWssWrQowzmbe/bs4fjx4/j6+prMYwwODmbq1KmsX7+eVq1aERsby9ixY7Gzs2PmzJmUKVPGuP/o0aNZt24dixYtMukRu3HjBu+88w5ff/21seK5RIkSzJw5kzVr1qT5fnie1+LkyZP06tWLTz75BEheBNe7d292797Nvn37+OCDD9K939OKjo5m8uTJlChRgu+//54cOXIA0L17d/z8/Pjuu+/w9PTE3d2ddevWcfnyZcaMGUP9+vWNa4wdO5ZVq1axb98+PDw86Nq1K7t27eLSpUt07tw53RGBRzk5OfHBBx+wc+dO4uLijB70+Ph4tmzZQqNGjTI8/+HhdICcOXNS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ZXJenz59KFOmDEuXLmXdunVYW1tTunRpBg4c+Njvln5WDRs2xNXVleDgYG7cuMFbb73FiBEjjC19ADw9Pfnyyy9ZuHAh69atw87ODldXVwYNGkT58uX55JNP2LFjh8k+j0/CxsaGyZMns3DhQrZs2UJISAi2traUL1+eTp06mQzJent7M2vWLObOncvOnTu5f/8+bm5u9O7dmzZt2rzwPRcz47V4Gp06daJ48eL89NNPhIaGkpiYSOHChenfvz8tWrQw3ls5c+bkhx9+YO7cufz+++/s2bMHJycnqlevjq+vL0WLFjWu6evry5kzZ9i5cyfnz59/6oSzVq1aTJkyhTx58mT4FbUpe28+rpe4cOHCvPvuuxw4cIANGzbQrFkzo+zRXvFH5c6dWwlnFmBx/fp1bf8vIvIaS/lqyzZt2qTaDF5E5FWgOZwiIiIiYlZKOEVERETErJRwioiIiIhZaQ6niIiIiJiVejhFRERExKyUcIqIiIiIWSnhFBERERGzUsIpksWdOHEis0PI8vSMzUvP1/z0jM3vTX/GSjhFRERExKyUcIqIiIiIWSnhFBERERGzUsIpIiIiImalhFNEREREzEoJp4iIiIiYlRJOERERETErJZwiIiIiYlbWmR2AiIiIvL6SkpK4c+cO8fHxmR3KK83Ozo4bN25kdhhPzMLCAjs7O7Jly/ZCrqeEU14J4xs3zuwQsqy7d+9ib2+f2WFkaXrG5qXna3538+Zl5Pz5T31eUlIS169fx9HREQcHBywsLF58cFmEra0tdnZ2mR3GE0tMTOTOnTvExcWRPXv2535tlXDKK2Hsb79ldggiIm+s/u+990zn3blzB0dHxxfWCyavDktLS5ycnLhz5w737t177mRZczhFRETkmcTHx2NjY5PZYYgZ2dvbc+/evee+jhJOEREReWYaRs/aXtTrq4RTRERERMxKCaeIiIiImNUbu2jIx8eHCxcuGL9bWFiQPXt23n33XQYOHEj+/PnNct8mTZrg5+dHkyZNzHL9FKtXr2b06NFpln311VfUrl3brPd/VHR0NJGRkXh6er7U+4qIiEjme2MTTgB/f3/q168PJC//j4yM5OuvvyYgIICZM2dmcnTPz8XFhYULF6Y6niNHjpcey9ixY6lQoYISThERkTfQG51wOjo64uLiYvyeL18+unXrxsiRI4mNjcXJySkT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jBjBuHHjaNOmDS4uLjRr1gxra2siIiLw8vJi4MCBTJgwgd69e5MjRw4+/vhjpk6dmua1Ro0axcSJE43FMh4eHgwYMOCJ2lCyZEkqV65M165dGTt2LN7e3qnqhIaGEhoaCvz/PUCbNm2Kr68vkLwR/eTJk5k6dSqLFy+mQIEC+Pv706xZMyB54/iYmBiCgoK4cuUKpUuXZtq0aZQoUQKAiRMnMnnyZDp06ICtrS1169alS5cuADRu3JiwsDDat2/P+vXrM2xrjhw5mDp1KuPGjaNDhw5UrFiRhg0bPtFzEBERkazH4vr169rRWzKdc86cmR2CiMgbq/977zHy/zo0xDze9EVDWWJIXUREREReXUo4RURERMSslHCKiIiIiFkp4RQRERERs1LCKSIiIiJmlSW2RZLX3/Bq1TI7hCzr7t27xj6vYh56xual5/sS5M2b2RFIFqeEU14JA9esyewQsqw3fSuOl0HP2Lz0fM3vxIkTmR2CZHEaUhcRERERs1LCKSIiIiJmpYRTRERERMxKCaeIiIiImJUSThERERExKyWcIiIiImJWSjhFRERExKyUcIqIiIiIWSnhFBERERGzUsIpIiIiImalhFNEREREzEoJp4iIiIiYlRJOERERETErJZwiIiIiYlZKOEVERETErJRwioiIiIhZKeEUEREREbNSwikiIiIiZqWEU0RERETMSgmniIiIiJiVEk4RERERMSvrzA5ABGB848aZHUKWdffuXezt7TM7jCxNz9i89HzN71V4xjYlStBn6tRMjUHMRwmnvBLG/vZbZocgIiKZaHhmByBmpSF1ERERETErJZwiIiIiYlZKOEVERETErJRwioiIiIhZPTbhjI+PZ86cOXz00UdUq1aNxo0bExgYyNWrV19GfM8kIiKCAwcOpDp++/ZtvLy8WLZsWZrnffvtt3Ts2PG57793715OnTr13NdJ4eHhgYeHB9HR0anKfv75Zzw8PJg5c+Zz38fPzy/D63h4eLBnz57nvo+IiIi8WR6bcM6YMYP169czePBgli1bxtixYzl58iR9+vQhKSnpZcT41AYOHEhUVFSq446OjlSvXp2wsLBUZUlJSYSGhlK/fv3nvn+PHj24cuXKc1/nYdbW1mzbti3V8S1btmBhYfFC75WetWvXUrFixZdyLxEREck6Hptwrlq1iq5du1KpUiUKFixI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BMqbwfn/pmeIiMibaXi1agxcsyazwzAbzeEUERERETEjJZwiIiIiYlYvZQw75esQ0/L+++9nWC4iIiIirzf1cIqIiIiIWSnhFBERERGz0rJweSUMr1Yts0PIsu7evYu9vX1mh5Gl6Rmbl56v+b0Kz9imRIlMvb+YlxJOeSVk5a0wMtubvhXHy6BnbF56vuanZyzmpiF1ERERETErJZwiIiIiYlZKOEVERETErJRwioiIiIhZKeEUEREREbNSwikiIiIiZqWEU0RERETMSgmniIiIiJiVEk4RERERMSslnCIiIiJiVko4RURERMSslHCKiIiIiFkp4RQRERERs1LCKSIiIiJmpYRTRERERMxKCaeIiIiImJUSThERERExKyWcIiIiImJWSjhFRERExKyUcIqIiIiIWSnhFBERERGzUsIpIiIiImZlndkBiACMb9w4s0PIsu7evYu9vX1mh5Gl6Rmbl56v+ekZm9+LesY2JUrQZ+rUFxDRy6WEU14JY3/7LbNDEBEReeUNz+wAnpGG1EVERETErJRwioiIiIhZKeEUEREREbNSwikiIiIiZvVSE04PDw/27NljcuzAgQN4eXkxYcKEdM/z8fGhc+fOJCUlmRzft28fHh4exMfHmyXe5xEREcGBAwfSLDt//jweHh5MmzYtVVlQUBCfffbZE93jRdb18/Nj5syZT3QtERERkaeRqT2cJ06coH///tStW5f+/ftnWDc8PJxffvnlJUX2/AYOHEhUVFSGdX766SdOnTr1zPfo0KFDhom6iIiIyKsg0xLO6Oho/P398fDwYNiwYVhYWGRYv2DBgnz33Xdcv379JUVofnnz5uWbb7555vMdHBxwdnZ+gRGJiIiIvHiZknBevXqV3r17U7JkScaMGYOVldVjz2nXrh2Ojo5pDkOniI2NJSAgAG9vbxo0aEBgYCC3b982yrdt28Ynn3yCp6cn3t7eDB06lNjYWCB5yLl///50796d2rVrs3PnTu7fv8+kSZOoV68ederUYciQIVy5csW43rJly2jWrBmenp60a9eObdu2AcnD0xcuXCAwMJBRo0alG2+fPn34888/WbNmTbp1Tp06Rffu3fHy8uKjjz5i8eLFxtSCR4fJd+3aRdu2bfHy8sLf35/x48eb3D8+Pp4JEybg7e1N/fr1WbRokcm9YmJi6N69O56ennTu3Jkz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O3PkyBGWLl1KfHw806ZNo0qVKjz11FPFeRoPrS1btrB9+3bGjBlD5cqVjT+PL1++DJj3b/Pmzfn000/ZtWsXiYmJzJo1iytXrtClS5fiPA2LsEpNTTVfJSzygKSnpzNz5ky2bduGk5MTQUFBBAUFAeDr60toaCidOnUC4OjRo7z33nvGZx6OGzeOevXqFWf6D7358+ezYsWKfI/t3r2bZs2amfTx6tWrWbVqFefOncPb25vhw4ffdVRJ4Pjx40RGRnL06FHKlStH9+7dee2117CystJ1/ID4+/vz3nvvmd3Ne3v/6hq+d76+vixcuND4RItLly4xffp09u3bh5ubG0OGDOG5554DICUlhW7duvHBBx/wxBNPADd+lkRERHD27FkaNGjAhAkTqF69erGdz8Pm1v4dP348sbGxZjGVK1cmJibGrH9zcnL46KOP2LhxI6mpqTRo0IBRo0ZRu3btYjgTy1LBKSIiIiIWpSl1EREREbEoFZwiIiIiYlEqOEVERETEolRwioiIiIhFqeAUEREREYtSwSkiIiVeft8DLiIPDxWcIiJ/wZAhQ/D19eWVV14pMCYyMhJfX1+GDBlShJndm+effx5fX1/27duX7/GuXbsSGhpaJLn8lc+6evUqYWFh/Pzzz/f9+WFhYfj6+t7xJSJ/je3dQ0REJD/W1tYcP36cpKQkPD09TY7l5eWxdevWYsqscPbv309ycjLe3t58+eWXJbKgiouL4+uvvzY+uPx+VahQwezrM0Xk/qngFBH5i+rWrUtSUhJbt25lwIABJsf+85//cPnyZWrWrFlM2d3dhg0beOyxx+jcuTPz5s3j/PnzVKpUqbjTKlZ2dnY0atSouNMQKXU0pS4i8hfZ29vTvHnzfEcyN2/eTNOmTXF2djY7tnHjRl566SX8/Pzo1KkTixYtMn638k3bt28nODiYli1b4ufnR69evfj888+Nx1NSUvD19WXbtm28++67BAYGEhgYyIQJE4zf23wn169f5/vvv6d58+a0adMGa2trvvrqq3xjc3JyiIiIoHXr1jz77LNMmjSJixcvGo9nZGQwd+5cOnfujJ+fHz169CAqKors7GxjzLVr14iMjKR79+40b96cF198kfXr198xR19fXz744AOTfevXr8fX15eUlBRiYmJ4/fXXAXjzzTcJCwszxhWmj+/HkCFDmDRpEu++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v3//Akf5WrRowZYtW6hfvz61atUiNjaWw4cPm8SUL18egN27d/PII4/g7e1dqD4uSFZWltmTAG7l7e1t/MzCGjp0KMOHD2fYsGG88MILZGVl8cknn5CRkcGgQYPuqS2RkkoFp4jIA9C4cWMqVaqElZXVHR9nExwcTMWKFVmzZg2ff/455cuX54knnuD11183rnMMDQ0lPDzcePOKp6cn48ePZ8uWLXcshu7m/Pnz7Nmzhy5duuQ7AgvQunVr5s2bx9q1a40FZ/fu3cnIyGDChAnY2NjQrl073nrrLaysrACYMGECH374IatXr+bChQu4uLgQEBDA0KFDAXBwcODDDz9k0aJFLF26lGvXruHp6ck777xDt27dCsw3JCSEnJwcoqKisLKywt/fnwkTJpisz6xVqxbPPfcca9euJSEhgcjIyEL1cUEuX75McHBwgcfnz59P06ZN79jG7Xx9fVm4cCFRUVGEhoZiZ2dH48aNCQsL001C8rdhlZqaen/zMyIiIiIid6A1nCIiIiJiUSo4RURERMSiVHCKiIiIiEWp4BQRERERi1LBKSIiIiIWpYJTRERERCxKBaeIiIiIWJQKThERERGxKBWcIiIiImJR/w8NR99xBPZ7NgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.style.use('fivethirtyeight')\n", + "figsize(8, 4)\n", + "\n", + "# Dataframe to hold the results\n", + "model_comparison = pd.DataFrame({'model':['Linear Regression',\n", + " 'Support Vector Machine',\n", + " 'Random Forest',\n", + " 'Gradient Boosted',\n", + " 'K-Nearest Neighbors'],\n", + " 'mae':[lr_mae,\n", + " svm_mae,\n", + " random_forest_mae, \n", + " gradient_boosted_mae, \n", + " knn_mae]})\n", + "# Horizontal bar chart of test mae\n", + "model_comparison.sort_values('mae',ascending = False).plot(x = 'model',\n", + " y = 'mae',\n", + " kind = 'barh',\n", + " color = 'red', \n", + " edgecolor = 'black')\n", + "# Plot formatting\n", + "plt.ylabel('');plt.yticks(size = 14);plt.xlabel('Mean Absolute Error');plt.xticks(size = 14)\n", + "plt.title('Model Comparison on Test MAE', size = 20);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "集成算法的效果更好,这里由于参数只使用默认的,对SVM等这种参数影响较大的模型不太公平。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 调参" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": {