├── .ipynb_checkpoints ├── 回归拟合-checkpoint.ipynb ├── 数据可视化-checkpoint.ipynb ├── 数据概览-checkpoint.ipynb ├── 数据读取-checkpoint.ipynb ├── 最小二乘法和脊回归-checkpoint.ipynb └── 核脊回归和svr回归-checkpoint.ipynb ├── CCPP ├── Folds5x2_pp.ods ├── Folds5x2_pp.xlsx ├── Readme.txt └── Readme.txt~ ├── README.md ├── 回归拟合.ipynb ├── 数据可视化.ipynb ├── 数据概览.ipynb ├── 数据读取.ipynb ├── 最小二乘法和脊回归.ipynb ├── 核脊回归和svr回归.ipynb └── 流程 /.ipynb_checkpoints/数据可视化-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 数据可视化" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "data": { 17 | "image/png": "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\n", 18 | "text/plain": [ 19 | "" 20 | ] 21 | }, 22 | "metadata": {}, 23 | "output_type": "display_data" 24 | } 25 | ], 26 | "source": [ 27 | "import numpy as np\n", 28 | "import matplotlib.pyplot as plt\n", 29 | "import xlrd\n", 30 | "import math\n", 31 | "from sklearn import linear_model\n", 32 | "data = xlrd.open_workbook('./CCPP/Folds5x2_pp.xlsx')\n", 33 | "\n", 34 | "#读取数据,将xls中的数据读取出来\n", 35 | "sheet1 = data.sheet_by_name('Sheet1')\n", 36 | "\n", 37 | "sheet2 = data.sheet_by_name('Sheet2')\n", 38 | "sheet3 = data.sheet_by_name('Sheet3')\n", 39 | "sheet4 = data.sheet_by_name('Sheet4')\n", 40 | "sheet5 = data.sheet_by_name('Sheet5')\n", 41 | "\n", 42 | "#训练集\n", 43 | "AT_tran = sheet1.col_values(0) + sheet2.col_values(0) + sheet3.col_values(0) + sheet4.col_values(0)\n", 44 | "V_tran = sheet1.col_values(1) + sheet2.col_values(1) + sheet3.col_values(1) + sheet4.col_values(1)\n", 45 | "AP_tran = sheet1.col_values(2) + sheet2.col_values(2) + sheet3.col_values(2) + sheet4.col_values(2)\n", 46 | "RH_tran = sheet1.col_values(3) + sheet2.col_values(3) + sheet3.col_values(3) + sheet4.col_values(3)\n", 47 | "PE_tran = sheet1.col_values(4) + sheet2.col_values(4) + sheet3.col_values(4) + sheet4.col_values(4)\n", 48 | "\n", 49 | "#测试集\n", 50 | "AT_test = sheet5.col_values(0)\n", 51 | "V_test = sheet5.col_values(1)\n", 52 | "AP_test = sheet5.col_values(2)\n", 53 | "RH_test = sheet5.col_values(3)\n", 54 | "PE_test = sheet5.col_values(4)\n", 55 | "\n", 56 | "\n", 57 | "n = len(AT_tran) #数据个数\n", 58 | "N = len(sheet1.col_values(1))\n", 59 | "\n", 60 | "datas = {'AT':AT_tran, 'V':V_tran, 'AP':AP_tran, 'RH':RH_tran, 'PE':PE_tran}\n", 61 | "#散点矩阵图\n", 62 | "\n", 63 | "data = {0:AT_tran,1:V_tran, 2:AP_tran, 3:RH_tran, 4:PE_tran }\n", 64 | "fig, axes = plt.subplots(5,5, subplot_kw = {'xticks':[], 'yticks':[]})\n", 65 | "title = [ 'AT', 'V', 'AP', 'RH', 'PE']\n", 66 | "i = 0;\n", 67 | "\n", 68 | "\n", 69 | "for ax in axes.flat:\n", 70 | " k = int(i/5)\n", 71 | " j = 4 - ( i % 5)\n", 72 | " if k == 0:\n", 73 | " ax.set_title(title[j])\n", 74 | " if j == 4:\n", 75 | " ax.set_ylabel(title[k])\n", 76 | " ax.plot(sheet1.col_values(k), sheet1.col_values(j), 'o', alpha = 0.3, markersize = 2)\n", 77 | "\n", 78 | " #ax.plot(data[k], data[j], 'o', alpha = 0.015, markersize = 2)\n", 79 | " i += 1\n", 80 | "plt.show()" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": null, 86 | "metadata": { 87 | "collapsed": true 88 | }, 89 | "outputs": [], 90 | "source": [] 91 | } 92 | ], 93 | "metadata": { 94 | "kernelspec": { 95 | "display_name": "Python 3", 96 | "language": "python", 97 | "name": "python3" 98 | }, 99 | "language_info": { 100 | "codemirror_mode": { 101 | "name": "ipython", 102 | "version": 3 103 | }, 104 | "file_extension": ".py", 105 | "mimetype": "text/x-python", 106 | "name": "python", 107 | "nbconvert_exporter": "python", 108 | "pygments_lexer": "ipython3", 109 | "version": "3.6.3" 110 | } 111 | }, 112 | "nbformat": 4, 113 | "nbformat_minor": 2 114 | } 115 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/数据概览-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "前五个数据\n", 13 | " AP AT PE RH V\n", 14 | "0 AP AT PE RH V\n", 15 | "1 1024.07 14.96 463.26 73.17 41.76\n", 16 | "2 1020.04 25.18 444.37 59.08 62.96\n", 17 | "3 1012.16 5.11 488.56 92.14 39.4\n", 18 | "4 1010.24 20.86 446.48 76.64 57.32\n", 19 | "简单统计描述\n", 20 | " AP AT PE RH V\n", 21 | "count 47845.00 47845.00 47845.0 47845.00 47845.00\n", 22 | "unique 2518.00 2774.00 4837.0 4547.00 635.00\n", 23 | "top 1013.88 25.21 468.8 100.09 41.17\n", 24 | "freq 80.00 70.00 45.0 130.00 305.00\n", 25 | "协方差矩阵\n", 26 | "Empty DataFrame\n", 27 | "Columns: []\n", 28 | "Index: []\n", 29 | "相关系数矩阵\n", 30 | "Empty DataFrame\n", 31 | "Columns: []\n", 32 | "Index: []\n" 33 | ] 34 | } 35 | ], 36 | "source": [ 37 | "import xlrd\n", 38 | "import pandas as pd\n", 39 | "\n", 40 | "def getData():\n", 41 | " data = xlrd.open_workbook('./CCPP/Folds5x2_pp.xlsx')\n", 42 | "\n", 43 | " sheet1 = data.sheet_by_name('Sheet1')\n", 44 | " sheet2 = data.sheet_by_name('Sheet2')\n", 45 | " sheet3 = data.sheet_by_name('Sheet3')\n", 46 | " sheet4 = data.sheet_by_name('Sheet4')\n", 47 | " sheet5 = data.sheet_by_name('Sheet5')\n", 48 | "\n", 49 | " AT_tran = sheet1.col_values(0) + sheet2.col_values(0) + sheet3.col_values(0) + sheet4.col_values(0) + sheet5.col_values(0)\n", 50 | " V_tran = sheet1.col_values(1) + sheet2.col_values(1) + sheet3.col_values(1) + sheet4.col_values(1) + sheet5.col_values(1)\n", 51 | " AP_tran = sheet1.col_values(2) + sheet2.col_values(2) + sheet3.col_values(2) + sheet4.col_values(2) + sheet5.col_values(2)\n", 52 | " RH_tran = sheet1.col_values(3) + sheet2.col_values(3) + sheet3.col_values(3) + sheet4.col_values(3) + sheet5.col_values(3)\n", 53 | " PE_tran = sheet1.col_values(4) + sheet2.col_values(4) + sheet3.col_values(4) + sheet4.col_values(4) + sheet5.col_values(4)\n", 54 | "\n", 55 | " tran = {'AT':AT_tran,'V':V_tran,'AP':AP_tran,'RH':RH_tran,'PE':PE_tran}\n", 56 | "\n", 57 | " return tran\n", 58 | "\n", 59 | "tran = getData()\n", 60 | "\n", 61 | "#将数据转换成数据框的格式\n", 62 | "df2 = pd.DataFrame({'AT':tran['AT'], 'V':tran['V'], 'AP':tran['AP'], 'RH':tran['RH'], 'PE':tran['PE']})\n", 63 | "\n", 64 | "print(\"前五个数据\")\n", 65 | "print(df2.head())\n", 66 | "\n", 67 | "print(\"简单统计描述\")\n", 68 | "print(df2.describe())\n", 69 | "\n", 70 | "print(\"协方差矩阵\")\n", 71 | "print(df2.cov())\n", 72 | "\n", 73 | "print(\"相关系数矩阵\")\n", 74 | "print(df2.corr())" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": null, 80 | "metadata": { 81 | "collapsed": true 82 | }, 83 | "outputs": [], 84 | "source": [] 85 | } 86 | ], 87 | "metadata": { 88 | "kernelspec": { 89 | "display_name": "Python 3", 90 | "language": "python", 91 | "name": "python3" 92 | }, 93 | "language_info": { 94 | "codemirror_mode": { 95 | "name": "ipython", 96 | "version": 3 97 | }, 98 | "file_extension": ".py", 99 | "mimetype": "text/x-python", 100 | "name": "python", 101 | "nbconvert_exporter": "python", 102 | "pygments_lexer": "ipython3", 103 | "version": "3.6.3" 104 | } 105 | }, 106 | "nbformat": 4, 107 | "nbformat_minor": 2 108 | } 109 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/最小二乘法和脊回归-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 最小二乘法和脊回归" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "name": "stdout", 17 | "output_type": "stream", 18 | "text": [ 19 | "================最小二乘发回归=================\n", 20 | "××××××××××××××××平均绝对偏差*****************\n", 21 | "AT [[-2.17131996]]\n", 22 | "AT [ 497.03411989]\n", 23 | "AT训练误差: 4.2879818941\n", 24 | "AT测试误差: 4.2879818941\n", 25 | "V [[-1.16813513]]\n", 26 | "V [ 517.80152631]\n", 27 | "V训练误差: 6.57649440109\n", 28 | "V测试误差: 6.57649440109\n", 29 | "AP [[ 1.48987167]]\n", 30 | "AP [-1055.26098898]\n", 31 | "AP训练误差: 11.9575739793\n", 32 | "AP测试误差: 11.9575739793\n", 33 | "RH [[ 0.4556501]]\n", 34 | "RH [ 420.96176616]\n", 35 | "RH训练误差: 13.1940215836\n", 36 | "RH测试误差: 13.1940215836\n", 37 | "AT-V [[-1.70426591 -0.32448652]]\n", 38 | "AT-V [ 505.47743382]\n", 39 | "AT-V训练误差: 3.91742599695\n", 40 | "AT-V测试误差: 3.91742599695\n", 41 | "AT-AP [[-2.11306594 0.14402919]]\n", 42 | "AT-AP [ 349.95047262]\n", 43 | "AT-AP训练误差: 4.27818773199\n", 44 | "AT-AP测试误差: 4.27818773199\n", 45 | "AT-RH [[-2.39070329 -0.20640286]]\n", 46 | "AT-RH [ 516.47645545]\n", 47 | "AT-RH训练误差: 3.79779100865\n", 48 | "AT-RH测试误差: 3.79779100865\n", 49 | "V-AP [[-1.06177593 0.55039349]]\n", 50 | "V-AP [-45.66559505]\n", 51 | "V-AP训练误差: 6.1510549951\n", 52 | "V-AP测试误差: 6.1510549951\n", 53 | "V-RH [[-1.06177593 0.55039349]]\n", 54 | "V-RH [-45.66559505]\n", 55 | "V-RH训练误差: 6.1510549951\n", 56 | "V-RH测试误差: 6.1510549951\n", 57 | "AT-V-AP [[-1.63477738 -0.32832324 0.15815192]]\n", 58 | "AT-V-AP [ 344.0713874]\n", 59 | "AT-V-AP训练误差: 3.87548882213\n", 60 | "AT-V-AP测试误差: 3.87548882213\n", 61 | "AT-V-RH [[-2.01872702 -0.22814053 -0.16538342]]\n", 62 | "AT-V-RH [ 518.54892503]\n", 63 | "AT-V-RH训练误差: 3.62489930643\n", 64 | "AT-V-RH测试误差: 3.62489930643\n", 65 | "V-AP-RH [[-1.00142746 0.56445742 0.16067624]]\n", 66 | "V-AP-RH [-74.97228155]\n", 67 | "V-AP-RH训练误差: 5.89730955706\n", 68 | "V-AP-RH测试误差: 5.89730955706\n", 69 | "AT-V-AP-RH [[-1.97751311 -0.23391642 0.06208294 -0.1580541 ]]\n", 70 | "AT-V-AP-RH [ 454.60927432]\n", 71 | "AT-V-AP-RH训练误差: 3.6252158076\n", 72 | "AT-V-AP-RH测试误差: 17.3433313624\n", 73 | "******************均方差********************\n", 74 | "AT [[-2.17131996]]\n", 75 | "AT [ 497.03411989]\n", 76 | "AT训练误差: 29.4317020111\n", 77 | "AT测试误差: 29.4317020111\n", 78 | "V [[-1.16813513]]\n", 79 | "V [ 517.80152631]\n", 80 | "V训练误差: 70.9146510302\n", 81 | "V测试误差: 70.9146510302\n", 82 | "AP [[ 1.48987167]]\n", 83 | "AP [-1055.26098898]\n", 84 | "AP训练误差: 212.972499833\n", 85 | "AP测试误差: 212.972499833\n", 86 | "RH [[ 0.4556501]]\n", 87 | "RH [ 420.96176616]\n", 88 | "RH训练误差: 246.999228093\n", 89 | "RH测试误差: 246.999228093\n", 90 | "AT-V [[-1.70426591 -0.32448652]]\n", 91 | "AT-V [ 505.47743382]\n", 92 | "AT-V训练误差: 24.5439582492\n", 93 | "AT-V测试误差: 24.5439582492\n", 94 | "AT-AP [[-2.11306594 0.14402919]]\n", 95 | "AT-AP [ 349.95047262]\n", 96 | "AT-AP训练误差: 28.8885956132\n", 97 | "AT-AP测试误差: 28.8885956132\n", 98 | "AT-RH [[-2.39070329 -0.20640286]]\n", 99 | "AT-RH [ 516.47645545]\n", 100 | "AT-RH训练误差: 23.0240210796\n", 101 | "AT-RH测试误差: 23.0240210796\n", 102 | "V-AP [[-1.06177593 0.55039349]]\n", 103 | "V-AP [-45.66559505]\n", 104 | "V-AP训练误差: 62.0582128686\n", 105 | "V-AP测试误差: 62.0582128686\n", 106 | "V-RH [[-1.06177593 0.55039349]]\n", 107 | "V-RH [-45.66559505]\n", 108 | "V-RH训练误差: 62.0582128686\n", 109 | "V-RH测试误差: 62.0582128686\n", 110 | "AT-V-AP [[-1.63477738 -0.32832324 0.15815192]]\n", 111 | "AT-V-AP [ 344.0713874]\n", 112 | "AT-V-AP训练误差: 23.8898051841\n", 113 | "AT-V-AP测试误差: 23.8898051841\n", 114 | "AT-V-RH [[-2.01872702 -0.22814053 -0.16538342]]\n", 115 | "AT-V-RH [ 518.54892503]\n", 116 | "AT-V-RH训练误差: 20.8609674847\n", 117 | "AT-V-RH测试误差: 20.8609674847\n", 118 | "V-AP-RH [[-1.00142746 0.56445742 0.16067624]]\n", 119 | "V-AP-RH [-74.97228155]\n", 120 | "V-AP-RH训练误差: 57.0975504625\n", 121 | "V-AP-RH测试误差: 57.0975504625\n", 122 | "AT-V-AP-RH [[-1.97751311 -0.23391642 0.06208294 -0.1580541 ]]\n", 123 | "AT-V-AP-RH [ 454.60927432]\n", 124 | "AT-V-AP-RH训练误差: 20.7673975325\n", 125 | "AT-V-AP-RH测试误差: 457.024352216\n", 126 | "================最小二乘发回归=================\n", 127 | "================脊回归=================\n", 128 | "××××××××××××××××平均绝对偏差*****************\n", 129 | "AT [[-2.1713186]]\n", 130 | "AT [ 497.03409312]\n", 131 | "AT训练误差: 4.28798230479\n", 132 | "AT测试误差: 4.28798230479\n", 133 | "V [[-1.16813487]]\n", 134 | "V [ 517.80151262]\n", 135 | "V训练误差: 6.57649436042\n", 136 | "V测试误差: 6.57649436042\n", 137 | "AP [[ 1.4898702]]\n", 138 | "AP [-1055.25949764]\n", 139 | "AP训练误差: 11.9575751146\n", 140 | "AP测试误差: 11.9575751146\n", 141 | "RH [[ 0.45565003]]\n", 142 | "RH [ 420.96177162]\n", 143 | "RH训练误差: 13.1940217153\n", 144 | "RH测试误差: 13.1940217153\n", 145 | "AT-V [[-1.70426254 -0.32448811]]\n", 146 | "AT-V [ 505.47745437]\n", 147 | "AT-V训练误差: 3.91742640857\n", 148 | "AT-V测试误差: 3.91742640857\n", 149 | "AT-AP [[-2.11306423 0.14403014]]\n", 150 | "AT-AP [ 349.94948091]\n", 151 | "AT-AP训练误差: 4.27818835644\n", 152 | "AT-AP测试误差: 4.27818835644\n", 153 | "AT-RH [[-2.39070111 -0.20640223]]\n", 154 | "AT-RH [ 516.47636603]\n", 155 | "AT-RH训练误差: 3.79779150346\n", 156 | "AT-RH测试误差: 3.79779150346\n", 157 | "V-AP [[-1.06177579 0.55039308]]\n", 158 | "V-AP [-45.66518635]\n", 159 | "V-AP训练误差: 6.15105489569\n", 160 | "V-AP测试误差: 6.15105489569\n", 161 | "V-RH [[-1.06177579 0.55039308]]\n", 162 | "V-RH [-45.66518635]\n", 163 | "V-RH训练误差: 6.15105489569\n", 164 | "V-RH测试误差: 6.15105489569\n", 165 | "AT-V-AP [[-1.63477384 -0.32832477 0.15815265]]\n", 166 | "AT-V-AP [ 344.07065612]\n", 167 | "AT-V-AP训练误差: 3.87548913944\n", 168 | "AT-V-AP测试误差: 3.87548913944\n", 169 | "AT-V-RH [[-2.01872095 -0.22814312 -0.16538242]]\n", 170 | "AT-V-RH [ 518.54887327]\n", 171 | "AT-V-RH训练误差: 3.62489978236\n", 172 | "AT-V-RH测试误差: 3.62489978236\n", 173 | "V-AP-RH [[-1.00142732 0.56445698 0.16067627]]\n", 174 | "V-AP-RH [-74.97184625]\n", 175 | "V-AP-RH训练误差: 5.89730954224\n", 176 | "V-AP-RH测试误差: 5.89730954224\n", 177 | "AT-V-AP-RH [[-1.977506 -0.23391912 0.06208473 -0.15805291]]\n", 178 | "AT-V-AP-RH [ 454.60737973]\n", 179 | "AT-V-AP-RH训练误差: 3.62521649597\n", 180 | "AT-V-AP-RH测试误差: 17.3432765004\n", 181 | "******************均方差********************\n", 182 | "AT [[-2.1713186]]\n", 183 | "AT [ 497.03409312]\n", 184 | "AT训练误差: 29.4317020112\n", 185 | "AT测试误差: 29.4317020112\n", 186 | "V [[-1.16813487]]\n", 187 | "V [ 517.80151262]\n", 188 | "V训练误差: 70.9146510302\n", 189 | "V测试误差: 70.9146510302\n", 190 | "AP [[ 1.4898702]]\n", 191 | "AP [-1055.25949764]\n", 192 | "AP训练误差: 212.972499833\n", 193 | "AP测试误差: 212.972499833\n", 194 | "RH [[ 0.45565003]]\n", 195 | "RH [ 420.96177162]\n", 196 | "RH训练误差: 246.999228093\n", 197 | "RH测试误差: 246.999228093\n", 198 | "AT-V [[-1.70426254 -0.32448811]]\n", 199 | "AT-V [ 505.47745437]\n", 200 | "AT-V训练误差: 24.5439582494\n", 201 | "AT-V测试误差: 24.5439582494\n", 202 | "AT-AP [[-2.11306423 0.14403014]]\n", 203 | "AT-AP [ 349.94948091]\n", 204 | "AT-AP训练误差: 28.8885956134\n", 205 | "AT-AP测试误差: 28.8885956134\n", 206 | "AT-RH [[-2.39070111 -0.20640223]]\n", 207 | "AT-RH [ 516.47636603]\n", 208 | "AT-RH训练误差: 23.0240210798\n", 209 | "AT-RH测试误差: 23.0240210798\n", 210 | "V-AP [[-1.06177579 0.55039308]]\n", 211 | "V-AP [-45.66518635]\n", 212 | "V-AP训练误差: 62.0582128686\n", 213 | "V-AP测试误差: 62.0582128686\n", 214 | "V-RH [[-1.06177579 0.55039308]]\n", 215 | "V-RH [-45.66518635]\n", 216 | "V-RH训练误差: 62.0582128686\n", 217 | "V-RH测试误差: 62.0582128686\n", 218 | "AT-V-AP [[-1.63477384 -0.32832477 0.15815265]]\n", 219 | "AT-V-AP [ 344.07065612]\n", 220 | "AT-V-AP训练误差: 23.8898051843\n", 221 | "AT-V-AP测试误差: 23.8898051843\n", 222 | "AT-V-RH [[-2.01872095 -0.22814312 -0.16538242]]\n", 223 | "AT-V-RH [ 518.54887327]\n", 224 | "AT-V-RH训练误差: 20.8609674851\n", 225 | "AT-V-RH测试误差: 20.8609674851\n", 226 | "V-AP-RH [[-1.00142732 0.56445698 0.16067627]]\n", 227 | "V-AP-RH [-74.97184625]\n", 228 | "V-AP-RH训练误差: 57.0975504625\n", 229 | "V-AP-RH测试误差: 57.0975504625\n", 230 | "AT-V-AP-RH [[-1.977506 -0.23391912 0.06208473 -0.15805291]]\n", 231 | "AT-V-AP-RH [ 454.60737973]\n", 232 | "AT-V-AP-RH训练误差: 20.767397533\n", 233 | "AT-V-AP-RH测试误差: 457.021485826\n", 234 | "================脊回归=================\n" 235 | ] 236 | } 237 | ], 238 | "source": [ 239 | "import xlrd\n", 240 | "from sklearn import linear_model\n", 241 | "#import pandas as pd\n", 242 | "from sklearn.metrics import mean_absolute_error\n", 243 | "from sklearn.metrics import mean_squared_error\n", 244 | "\n", 245 | "def get_error2(tranData, testData, name, func,evaluation): \n", 246 | "#tranData这个数据集是训练集\n", 247 | "#testData是测试集\n", 248 | "#name是数据集中变量名\n", 249 | "#func为回归函数\n", 250 | "#evaluation为误差判断函数\n", 251 | "\n", 252 | " error = {}\n", 253 | "\n", 254 | "# print name\n", 255 | " Y = tranData['PE']\n", 256 | " Y1 =testData['PE']\n", 257 | " for i in name:\n", 258 | "\n", 259 | " X = tranData[i]\n", 260 | " X1 = testData[i]\n", 261 | " clf = func()\n", 262 | " clf.fit( X ,Y)\n", 263 | " print(i, clf.coef_)\n", 264 | " print(i, clf.intercept_)\n", 265 | " error[i+\"训练误差\"]=evaluation(Y,clf.predict(X))\n", 266 | " print(i+\"训练误差:\", str(error[i+\"训练误差\"]))\n", 267 | " error[i+\"测试误差\"]= evaluation(Y1, clf.predict(X1))\n", 268 | " print(i+\"测试误差:\", error[i+\"测试误差\"])\n", 269 | "\n", 270 | " return error\n", 271 | "\n", 272 | "def getData():\n", 273 | " data = xlrd.open_workbook('./CCPP/Folds5x2_pp.xlsx')\n", 274 | "\n", 275 | " #读取数据,将xls中的数据读取出来\n", 276 | " sheet1 = data.sheet_by_name('Sheet1')\n", 277 | " sheet2 = data.sheet_by_name('Sheet2')\n", 278 | " sheet3 = data.sheet_by_name('Sheet3')\n", 279 | " sheet4 = data.sheet_by_name('Sheet4')\n", 280 | " sheet5 = data.sheet_by_name('Sheet5')\n", 281 | "\n", 282 | " #训练集\n", 283 | " AT_tran = sheet1.col_values(0)[1:] + sheet2.col_values(0)[1:] + sheet3.col_values(0)[1:] \n", 284 | " V_tran = sheet1.col_values(1)[1:] + sheet2.col_values(1)[1:] + sheet3.col_values(1)[1:]\n", 285 | " AP_tran = sheet1.col_values(2)[1:] + sheet2.col_values(2)[1:] + sheet3.col_values(2) [1:]\n", 286 | " RH_tran = sheet1.col_values(3)[1:] + sheet2.col_values(3)[1:] + sheet3.col_values(3)[1:] \n", 287 | " PE_tran = sheet1.col_values(4)[1:] + sheet2.col_values(4)[1:] + sheet3.col_values(4)[1:]\n", 288 | "\n", 289 | " #测试集\n", 290 | " AT_test = sheet4.col_values(0)[1:] + sheet5.col_values(0)[1:]\n", 291 | " V_test = sheet4.col_values(1)[1:] + sheet5.col_values(1)[1:]\n", 292 | " AP_test = sheet4.col_values(2)[1:] + sheet5.col_values(2)[1:]\n", 293 | " RH_test = sheet4.col_values(3)[1:] + sheet5.col_values(3)[1:]\n", 294 | " PE_test = sheet4.col_values(4)[1:] + sheet5.col_values(4)[1:]\n", 295 | "\n", 296 | " tran = {'AT':AT_tran,'V':V_tran,'AP':AP_tran,'RH':RH_tran,'PE':PE_tran}\n", 297 | " test = {'AT':AT_test,'V':V_test,'AP':AP_test,'RH':RH_test,'PE':PE_test}\n", 298 | "\n", 299 | " return tran, test\n", 300 | "\n", 301 | "\n", 302 | "#拟合函数\n", 303 | "def getResultError2(tran, test, regFunc, errFunc):\n", 304 | "#tran训练集\n", 305 | "#test测试集\n", 306 | "#regFunc回归函数\n", 307 | "#errFunc误差测量函数\n", 308 | "#parameter参数\n", 309 | " name1 = ['AT', 'V', 'AP', 'RH']\n", 310 | " tran1 = {'AT':[[x] for x in tran['AT']], 'V':[[x] for x in tran['V']], 'AP':[[x] for x in tran['AP']],'RH':[[x] for x in tran['RH']], 'PE':[[x] for x in tran['PE']]}\n", 311 | " test1 = {'AT':[[x] for x in test['AT']], 'V':[[x] for x in test['V']], 'AP':[[x] for x in test['AP']],'RH':[[x] for x in test['RH']], 'PE':[[x] for x in test['PE']]}\n", 312 | " error1 = get_error2(tran1, test1, name1, regFunc, errFunc)\n", 313 | "\n", 314 | " #数据子集有两个属性\n", 315 | " tran2 = {'AT-V':[[x, y] for x, y in zip(tran['AT'], tran['V'])],'AT-AP':[[x, y] for x, y in zip(tran['AT'], tran['AP'])], 'AT-RH':[[x, y] for x, y in zip(tran['AT'], tran['RH'])], 'V-AP':[[x, y] for x, y in zip(tran['V'], tran['AP'])], 'V-RH':[[x, y] for x, y in zip(tran['V'], tran['AP'])] ,'PE':[[x] for x in tran['PE']]}\n", 316 | " test2 = {'AT-V': [[x, y] for x, y in zip(test['AT'],test['V'])],'AT-AP':[[x, y] for x, y in zip(test['AT'], test['AP'])], 'AT-RH': [[x, y] for x, y in zip(test['AT'], test['RH'])], 'V-AP':[[x, y ] for x, y in zip(test['V'], test['AP'])], 'V-RH':[[x, y] for x, y in zip(test['V'], test['AP'])],'PE': [[x] for x in test['PE']]}\n", 317 | "\n", 318 | " name2 = [ 'AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 319 | " error2 = get_error2(tran2, test2, name2, regFunc, errFunc)\n", 320 | "\n", 321 | "\n", 322 | " #数据子集有三个属性\n", 323 | " tran3 = {'AT-V-AP':[[x, y, z] for x, y, z in zip(tran['AT'], tran['V'] , tran['AP'])],'AT-V-RH':[[x, y, z] for x, y, z in zip(tran['AT'], tran['V'], tran['RH'])], 'V-AP-RH':[[x, y, z] for x, y, z in zip(tran['V'], tran['AP'], tran['RH'])], 'PE':[[x] for x in tran['PE']]}\n", 324 | " test3 = {'AT-V-AP':[[x, y, z] for x, y, z in zip(test['AT'],test['V'] , test['AP'])],'AT-V-RH':[[x, y, z] for x, y, z in zip(test['AT'],test['V'], test['RH'])], 'V-AP-RH':[[x, y, z] for x, y, z in zip(test['V'], test['AP'], test['RH'])], 'PE':[[x] for x in test['PE']]}\n", 325 | " name3 = [ 'AT-V-AP', 'AT-V-RH', 'V-AP-RH' ]\n", 326 | " error3 = get_error2(tran3, test3, name3, regFunc, errFunc)\n", 327 | "\n", 328 | " #数据子集有四个属性\n", 329 | " tran4 = {'AT-V-AP-RH':[[x, y, z, w] for x, y, z, w in zip(tran['AT'], tran['V'] , tran['AP'], tran['RH'])], 'PE':[[x] for x in tran['PE']]}\n", 330 | " test4 = {'AT-V-AP-RH':[[x, y, z, w] for x, y, z, w in zip(tran['AT'],test['V'] , test['AP'], test['RH'])], 'PE':[[x] for x in test['PE']]}\n", 331 | " name4 = [ 'AT-V-AP-RH' ]\n", 332 | " error4 = get_error2(tran4, test4, name4, regFunc, errFunc)\n", 333 | "\n", 334 | " finalError = {1:error1, 2:error2, 3:error3, 4:error4}\n", 335 | " return finalError\n", 336 | "\n", 337 | "if __name__ == '__main__':\n", 338 | "\n", 339 | " tran, test = getData()\n", 340 | "\n", 341 | " print(\"================最小二乘发回归=================\")\n", 342 | " print(\"××××××××××××××××平均绝对偏差*****************\")\n", 343 | " linearAbsoluteError = getResultError2(tran, test, linear_model.LinearRegression , mean_absolute_error)\n", 344 | " #linear_model.LinearRegression为scikit-learn中的最小二乘法中的函数,mean_absolute_error绝对误差衡量函数。在python中,函数也是可以传入函数中的。\n", 345 | " print(\"******************均方差********************\")\n", 346 | " linearSquareError = getResultError2(tran, test, linear_model.LinearRegression , mean_squared_error)\n", 347 | " #mean_squared_error标准差衡量函数\n", 348 | " print(\"================最小二乘发回归=================\")\n", 349 | "\n", 350 | " print(\"================脊回归=================\")\n", 351 | " print(\"××××××××××××××××平均绝对偏差*****************\")\n", 352 | " linearAbsoluteError = getResultError2(tran, test, linear_model.Ridge , mean_absolute_error)\n", 353 | " print (\"******************均方差********************\")\n", 354 | " linearSquareError = getResultError2(tran, test, linear_model.Ridge , mean_squared_error)\n", 355 | " print(\"================脊回归=================\")" 356 | ] 357 | } 358 | ], 359 | "metadata": { 360 | "kernelspec": { 361 | "display_name": "Python 3", 362 | "language": "python", 363 | "name": "python3" 364 | }, 365 | "language_info": { 366 | "codemirror_mode": { 367 | "name": "ipython", 368 | "version": 3 369 | }, 370 | "file_extension": ".py", 371 | "mimetype": "text/x-python", 372 | "name": "python", 373 | "nbconvert_exporter": "python", 374 | "pygments_lexer": "ipython3", 375 | "version": "3.6.3" 376 | } 377 | }, 378 | "nbformat": 4, 379 | "nbformat_minor": 2 380 | } 381 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/核脊回归和svr回归-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 核脊回归和svr回归" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "由于数据量大,取前1000个数据进行训练和测试" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 2, 20 | "metadata": { 21 | "scrolled": false 22 | }, 23 | "outputs": [ 24 | { 25 | "name": "stdout", 26 | "output_type": "stream", 27 | "text": [ 28 | "================核脊回归=================\n", 29 | "××××××××××××××××平均绝对偏差*****************\n", 30 | "['AT', 'V', 'AP', 'RH']\n", 31 | "AT训练误差: 3.99796431175\n", 32 | "AT测试误差: 4.03701580275\n", 33 | "V训练误差: 5.7325798181\n", 34 | "V测试误差: 5.80446689922\n", 35 | "AP训练误差: 11.6298686972\n", 36 | "AP测试误差: 11.6781718226\n", 37 | "RH训练误差: 13.0653201088\n", 38 | "RH测试误差: 13.3599670137\n", 39 | "['AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 40 | "AT-V训练误差: 3.36933102954\n", 41 | "AT-V测试误差: 3.63348855947\n", 42 | "AT-AP训练误差: 3.71918608634\n", 43 | "AT-AP测试误差: 3.81481067513\n", 44 | "AT-RH训练误差: 3.27508650651\n", 45 | "AT-RH测试误差: 3.74908281588\n", 46 | "V-AP训练误差: 5.05626671802\n", 47 | "V-AP测试误差: 5.15759281852\n", 48 | "V-RH训练误差: 5.05626671802\n", 49 | "V-RH测试误差: 5.15759281852\n", 50 | "['AT-V-AP', 'AT-V-RH', 'V-AP-RH']\n", 51 | "AT-V-AP训练误差: 2.78884650917\n", 52 | "AT-V-AP测试误差: 3.57820272011\n", 53 | "AT-V-RH训练误差: 2.52588050585\n", 54 | "AT-V-RH测试误差: 4.34049486719\n", 55 | "V-AP-RH训练误差: 3.43596692776\n", 56 | "V-AP-RH测试误差: 6.92861317549\n", 57 | "['AT-V-AP-RH']\n", 58 | "AT-V-AP-RH训练误差: 1.52445950309\n", 59 | "AT-V-AP-RH测试误差: 76.3974094413\n", 60 | "******************均方差********************\n", 61 | "['AT', 'V', 'AP', 'RH']\n", 62 | "AT训练误差: 25.8590545816\n", 63 | "AT测试误差: 29.4567452126\n", 64 | "V训练误差: 52.864160629\n", 65 | "V测试误差: 57.7454505856\n", 66 | "AP训练误差: 204.214489698\n", 67 | "AP测试误差: 198.821747641\n", 68 | "RH训练误差: 243.209824161\n", 69 | "RH测试误差: 247.658647421\n", 70 | "['AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 71 | "AT-V训练误差: 18.3074161096\n", 72 | "AT-V测试误差: 26.7976300733\n", 73 | "AT-AP训练误差: 22.4114486826\n", 74 | "AT-AP测试误差: 27.5345407252\n", 75 | "AT-RH训练误差: 17.5929618155\n", 76 | "AT-RH测试误差: 28.6509249751\n", 77 | "V-AP训练误差: 42.5441108207\n", 78 | "V-AP测试误差: 47.4883111903\n", 79 | "V-RH训练误差: 42.5441108207\n", 80 | "V-RH测试误差: 47.4883111903\n", 81 | "['AT-V-AP', 'AT-V-RH', 'V-AP-RH']\n", 82 | "AT-V-AP训练误差: 13.3145527712\n", 83 | "AT-V-AP测试误差: 27.0417502942\n", 84 | "AT-V-RH训练误差: 10.8007680001\n", 85 | "AT-V-RH测试误差: 87.7580947575\n", 86 | "V-AP-RH训练误差: 22.3414879425\n", 87 | "V-AP-RH测试误差: 262.139350989\n", 88 | "['AT-V-AP-RH']\n", 89 | "AT-V-AP-RH训练误差: 4.55844191619\n", 90 | "AT-V-AP-RH测试误差: 15626.184024\n", 91 | "================核脊回归=================\n", 92 | "================svr回归=================\n", 93 | "××××××××××××××××平均绝对偏差*****************\n", 94 | "['AT', 'V', 'AP', 'RH']\n", 95 | "AT训练误差: 3.9928999607\n", 96 | "AT测试误差: 4.03630894543\n", 97 | "V训练误差: 5.5376822808\n", 98 | "V测试误差: 5.70287410584\n", 99 | "AP训练误差: 11.3833574929\n", 100 | "AP测试误差: 11.1204673983\n", 101 | "RH训练误差: 12.9466920852\n", 102 | "RH测试误差: 13.1061384793\n", 103 | "['AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 104 | "AT-V训练误差: 3.35816528395\n", 105 | "AT-V测试误差: 3.50210536025\n", 106 | "AT-AP训练误差: 3.77263283122\n", 107 | "AT-AP测试误差: 3.81460931223\n", 108 | "AT-RH训练误差: 3.39062661207\n", 109 | "AT-RH测试误差: 3.60532855144\n", 110 | "V-AP训练误差: 5.17114382858\n", 111 | "V-AP测试误差: 5.25667737383\n", 112 | "V-RH训练误差: 5.17114382858\n", 113 | "V-RH测试误差: 5.25667737383\n", 114 | "['AT-V-AP', 'AT-V-RH', 'V-AP-RH']\n", 115 | "AT-V-AP训练误差: 3.04865623019\n", 116 | "AT-V-AP测试误差: 3.33592019516\n", 117 | "AT-V-RH训练误差: 2.95125393581\n", 118 | "AT-V-RH测试误差: 3.43215728942\n", 119 | "V-AP-RH训练误差: 4.34913654138\n", 120 | "V-AP-RH测试误差: 5.05579515852\n", 121 | "['AT-V-AP-RH']\n", 122 | "AT-V-AP-RH训练误差: 2.52359045107\n", 123 | "AT-V-AP-RH测试误差: 11.9715633051\n", 124 | "******************均方差********************\n", 125 | "['AT', 'V', 'AP', 'RH']\n", 126 | "AT训练误差: 26.3392305282\n", 127 | "AT测试误差: 29.4231722273\n", 128 | "V训练误差: 52.0641350594\n", 129 | "V测试误差: 57.3161927423\n", 130 | "AP训练误差: 215.256097391\n", 131 | "AP测试误差: 200.455894676\n", 132 | "RH训练误差: 249.70776054\n", 133 | "RH测试误差: 248.72538896\n", 134 | "['AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 135 | "AT-V训练误差: 19.5775692563\n", 136 | "AT-V测试误差: 24.6551637621\n", 137 | "AT-AP训练误差: 23.9474825408\n", 138 | "AT-AP测试误差: 27.6188016036\n", 139 | "AT-RH训练误差: 19.7517767984\n", 140 | "AT-RH测试误差: 24.3806367872\n", 141 | "V-AP训练误差: 46.4135379545\n", 142 | "V-AP测试误差: 49.2758816906\n", 143 | "V-RH训练误差: 46.4135379545\n", 144 | "V-RH测试误差: 49.2758816906\n", 145 | "['AT-V-AP', 'AT-V-RH', 'V-AP-RH']\n", 146 | "AT-V-AP训练误差: 16.5349579509\n", 147 | "AT-V-AP测试误差: 22.9836414349\n", 148 | "AT-V-RH训练误差: 16.2169000427\n", 149 | "AT-V-RH测试误差: 23.4573215318\n", 150 | "V-AP-RH训练误差: 38.0751155058\n", 151 | "V-AP-RH测试误差: 45.9809734763\n", 152 | "['AT-V-AP-RH']\n", 153 | "AT-V-AP-RH训练误差: 13.110970175\n", 154 | "AT-V-AP-RH测试误差: 213.570513444\n", 155 | "================svr回归=================\n" 156 | ] 157 | } 158 | ], 159 | "source": [ 160 | "import xlrd\n", 161 | "import numpy as np\n", 162 | "from sklearn.metrics import mean_absolute_error\n", 163 | "from sklearn.metrics import mean_squared_error\n", 164 | "from sklearn.svm import SVR\n", 165 | "from sklearn.grid_search import GridSearchCV\n", 166 | "from sklearn.kernel_ridge import KernelRidge\n", 167 | "\n", 168 | "rng = np.random.RandomState(0)\n", 169 | "\n", 170 | "def getData():\n", 171 | " data = xlrd.open_workbook('./CCPP/Folds5x2_pp.xlsx')\n", 172 | "\n", 173 | " #读取数据,将xls中的数据读取出来\n", 174 | " sheet1 = data.sheet_by_name('Sheet1')\n", 175 | " #x = sheet1.col_values(0)\n", 176 | " #y = sheet1.col_values(4)\n", 177 | " #plt.plot(x, y, 'o')\n", 178 | " #sheet2 = data.sheet_by_name('Sheet2')\n", 179 | " # sheet3 = data.sheet_by_name('Sheet3')\n", 180 | " sheet4 = data.sheet_by_name('Sheet4')\n", 181 | " # sheet5 = data.sheet_by_name('Sheet5')\n", 182 | "\n", 183 | " #训练集\n", 184 | " AT_tran = sheet1.col_values(0)[1:1000]# + sheet2.col_values(0) + sheet3.col_values(0) \n", 185 | " V_tran = sheet1.col_values(1)[1:1000] #+ sheet2.col_values(1) + sheet3.col_values(1) \n", 186 | " AP_tran = sheet1.col_values(2)[1:1000] #+ sheet2.col_values(2) + sheet3.col_values(2) \n", 187 | " RH_tran = sheet1.col_values(3)[1:1000] #+ sheet2.col_values(3) + sheet3.col_values(3) \n", 188 | " PE_tran = sheet1.col_values(4)[1:1000] #+ sheet2.col_values(4) + sheet3.col_values(4) \n", 189 | "\n", 190 | " #测试集\n", 191 | " AT_test = sheet4.col_values(0)[1:1000] #+ sheet5.col_values(0)\n", 192 | " V_test = sheet4.col_values(1)[1:1000] #+ sheet5.col_values(1)\n", 193 | " AP_test = sheet4.col_values(2)[1:1000] #+ sheet5.col_values(2)\n", 194 | " RH_test = sheet4.col_values(3)[1:1000] #+ sheet5.col_values(3)\n", 195 | " PE_test = sheet4.col_values(4)[1:1000] #+ sheet5.col_values(4)\n", 196 | "\n", 197 | " tran = {'AT':AT_tran,'V':V_tran,'AP':AP_tran,'RH':RH_tran,'PE':PE_tran}\n", 198 | " test = {'AT':AT_test,'V':V_test,'AP':AP_test,'RH':RH_test,'PE':PE_test}\n", 199 | "\n", 200 | " return tran, test\n", 201 | "\n", 202 | "def get_kernelRidge_error(tranData, testData, name,evaluation): \n", 203 | " error = {}\n", 204 | " f = GridSearchCV(KernelRidge(kernel='rbf', gamma=0.1), cv=5,\n", 205 | " param_grid={\"alpha\": [1e0, 0.1, 1e-2, 1e-3],\n", 206 | " \"gamma\": np.logspace(-2, 2, 5)})\n", 207 | " print(name)\n", 208 | " Y = tranData['PE']\n", 209 | " Y1 =testData['PE']\n", 210 | " for i in name:\n", 211 | "\n", 212 | " X = tranData[i]\n", 213 | " X1 = testData[i]\n", 214 | "\n", 215 | " f.fit(X, Y)\n", 216 | "\n", 217 | " error[i+\"训练误差\"]=evaluation(Y,f.predict(X))\n", 218 | " print(i+\"训练误差:\", str(error[i+\"训练误差\"]))\n", 219 | " error[i+\"测试误差\"]= evaluation(Y1, f.predict(X1))\n", 220 | " print(i+\"测试误差:\", error[i+\"测试误差\"])\n", 221 | "\n", 222 | " return error\n", 223 | "\n", 224 | "def get_svr_error(tranData, testData, name,evaluation):\n", 225 | " error = {}\n", 226 | " f = GridSearchCV(SVR(kernel='rbf', gamma=0.1), cv=5,\n", 227 | " param_grid={\"C\": [1e0, 1e1, 1e2, 1e3],\n", 228 | " \"gamma\": np.logspace(-2, 2, 5)})\n", 229 | " print(name)\n", 230 | " Y = tranData['PE']\n", 231 | " Y1 =testData['PE']\n", 232 | " for i in name:\n", 233 | "\n", 234 | " X = tranData[i]\n", 235 | " X1 = testData[i]\n", 236 | "\n", 237 | " f.fit(X, Y)\n", 238 | "\n", 239 | " error[i+\"训练误差\"]=evaluation(Y,f.predict(X))\n", 240 | " print(i+\"训练误差:\", str(error[i+\"训练误差\"]))\n", 241 | " error[i+\"测试误差\"]= evaluation(Y1, f.predict(X1))\n", 242 | " print(i+\"测试误差:\", error[i+\"测试误差\"])\n", 243 | "\n", 244 | " return error\n", 245 | "\n", 246 | "def getResultError(tran, test, get_error , errFunc):\n", 247 | "\n", 248 | " name1 = ['AT', 'V', 'AP', 'RH']\n", 249 | " tran1 = {'AT':[[x] for x in tran['AT']], 'V':[[x] for x in tran['V']], 'AP':[[x] for x in tran['AP']],'RH':[[x] for x in tran['RH']], 'PE':[x for x in tran['PE']]}\n", 250 | " test1 = {'AT':[[x] for x in test['AT']], 'V':[[x] for x in test['V']], 'AP':[[x] for x in test['AP']],'RH':[[x] for x in test['RH']], 'PE':[x for x in test['PE']]}\n", 251 | " error1 = get_error(tran1, test1, name1, errFunc)\n", 252 | "\n", 253 | " #数据子集有两个属性\n", 254 | " tran2 = {'AT-V':[[x, y] for x, y in zip(tran['AT'], tran['V'])],'AT-AP':[[x, y] for x, y in zip(tran['AT'], tran['AP'])], 'AT-RH':[[x, y] for x, y in zip(tran['AT'], tran['RH'])], 'V-AP':[[x, y] for x, y in zip(tran['V'], tran['AP'])], 'V-RH':[[x, y] for x, y in zip(tran['V'], tran['AP'])] ,'PE':[x for x in tran['PE']]}\n", 255 | " test2 = {'AT-V': [[x, y] for x, y in zip(test['AT'],test['V'])],'AT-AP':[[x, y] for x, y in zip(test['AT'], test['AP'])], 'AT-RH': [[x, y] for x, y in zip(test['AT'], test['RH'])], 'V-AP':[[x, y ] for x, y in zip(test['V'], test['AP'])], 'V-RH':[[x, y] for x, y in zip(test['V'], test['AP'])],'PE': [x for x in test['PE']]}\n", 256 | "\n", 257 | " name2 = [ 'AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 258 | " error2 = get_error(tran2, test2, name2,errFunc)\n", 259 | "\n", 260 | " #数据子集有三个属性\n", 261 | " tran3 = {'AT-V-AP':[[x, y, z] for x, y, z in zip(tran['AT'], tran['V'] , tran['AP'])],'AT-V-RH':[[x, y, z] for x, y, z in zip(tran['AT'], tran['V'], tran['RH'])], 'V-AP-RH':[[x, y, z] for x, y, z in zip(tran['V'], tran['AP'], tran['RH'])], 'PE':[x for x in tran['PE']]}\n", 262 | " test3 = {'AT-V-AP':[[x, y, z] for x, y, z in zip(test['AT'],test['V'] , test['AP'])],'AT-V-RH':[[x, y, z] for x, y, z in zip(test['AT'],test['V'], test['RH'])], 'V-AP-RH':[[x, y, z] for x, y, z in zip(test['V'], test['AP'], test['RH'])], 'PE':[x for x in test['PE']]}\n", 263 | " name3 = [ 'AT-V-AP', 'AT-V-RH', 'V-AP-RH' ]\n", 264 | " error3 = get_error(tran3, test3, name3, errFunc)\n", 265 | "\n", 266 | " #数据子集有四个属性\n", 267 | " tran4 = {'AT-V-AP-RH':[[x, y, z, w] for x, y, z, w in zip(tran['AT'], tran['V'] , tran['AP'], tran['RH'])], 'PE':[x for x in tran['PE']]}\n", 268 | " test4 = {'AT-V-AP-RH':[[x, y, z, w] for x, y, z, w in zip(tran['AT'],test['V'] , test['AP'], test['RH'])], 'PE':[x for x in test['PE']]}\n", 269 | " name4 = [ 'AT-V-AP-RH' ]\n", 270 | " error4 = get_error(tran4, test4, name4,errFunc)\n", 271 | "\n", 272 | " finalError = {1:error1, 2:error2, 3:error3, 4:error4}\n", 273 | " return finalError\n", 274 | "\n", 275 | "if __name__ == '__main__':\n", 276 | "\n", 277 | " tran, test = getData()\n", 278 | "\n", 279 | " print(\"================核脊回归=================\")\n", 280 | " print(\"××××××××××××××××平均绝对偏差*****************\")\n", 281 | " linearAbsoluteError = getResultError(tran, test, get_kernelRidge_error, mean_absolute_error)\n", 282 | " print(\"******************均方差********************\")\n", 283 | " linearSquareError = getResultError(tran, test,get_kernelRidge_error, mean_squared_error)\n", 284 | " print (\"================核脊回归=================\")\n", 285 | "\n", 286 | " print(\"================svr回归=================\")\n", 287 | " print(\"××××××××××××××××平均绝对偏差*****************\")\n", 288 | " linearAbsoluteError = getResultError(tran, test, get_svr_error, mean_absolute_error)\n", 289 | " print (\"******************均方差********************\")\n", 290 | " linearSquareError = getResultError(tran, test,get_svr_error, mean_squared_error)\n", 291 | " print(\"================svr回归=================\")" 292 | ] 293 | } 294 | ], 295 | "metadata": { 296 | "kernelspec": { 297 | "display_name": "Python 3", 298 | "language": "python", 299 | "name": "python3" 300 | }, 301 | "language_info": { 302 | "codemirror_mode": { 303 | "name": "ipython", 304 | "version": 3 305 | }, 306 | "file_extension": ".py", 307 | "mimetype": "text/x-python", 308 | "name": "python", 309 | "nbconvert_exporter": "python", 310 | "pygments_lexer": "ipython3", 311 | "version": "3.6.3" 312 | } 313 | }, 314 | "nbformat": 4, 315 | "nbformat_minor": 2 316 | } 317 | -------------------------------------------------------------------------------- /CCPP/Folds5x2_pp.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IvanReen/Power-prediction/854bde1e005b4ba0d5d74cabedf7102b1dfc013d/CCPP/Folds5x2_pp.ods -------------------------------------------------------------------------------- /CCPP/Folds5x2_pp.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IvanReen/Power-prediction/854bde1e005b4ba0d5d74cabedf7102b1dfc013d/CCPP/Folds5x2_pp.xlsx -------------------------------------------------------------------------------- /CCPP/Readme.txt: -------------------------------------------------------------------------------- 1 | The dataset contains 9568 data points collected from a Combined Cycle Power Plant over 6 years (2006-2011), when the power plant was set to work with full load. Features consist of hourly average ambient variables Temperature (T), Ambient Pressure (AP), Relative Humidity (RH) and Exhaust Vacuum (V) to predict the net hourly electrical energy output (EP) of the plant. 2 | A combined cycle power plant (CCPP) is composed of gas turbines (GT), steam turbines (ST) and heat recovery steam generators. In a CCPP, the electricity is generated by gas and steam turbines, which are combined in one cycle, and is transferred from one turbine to another. While the Vacuum is colected from and has effect on the Steam Turbine, he other three of the ambient variables effect the GT performance. 3 | For comparability with our baseline studies, and to allow 5x2 fold statistical tests be carried out, we provide the data shuffled five times. For each shuffling 2-fold CV is carried out and the resulting 10 measurements are used for statistical testing. 4 | We provide the data both in .ods and in .xlsx formats. 5 | 6 | Relevant Papers to cite: 7 | 8 | Pınar Tüfekci, Prediction of full load electrical power output of a base load operated combined cycle power plant using machine learning methods, International Journal of Electrical Power & Energy Systems, Volume 60, September 2014, Pages 126-140, ISSN 0142-0615, http://dx.doi.org/10.1016/j.ijepes.2014.02.027. 9 | (http://www.sciencedirect.com/science/article/pii/S0142061514000908) 10 | 11 | Heysem Kaya, Pınar Tüfekci , Sadık Fikret Gürgen: Local and Global Learning Methods for Predicting Power of a Combined Gas & Steam Turbine, Proceedings of the International Conference on Emerging Trends in Computer and Electronics Engineering ICETCEE 2012, pp. 13-18 (Mar. 2012, Dubai) 12 | -------------------------------------------------------------------------------- /CCPP/Readme.txt~: -------------------------------------------------------------------------------- 1 | The dataset contains 9568 data points collected from a Combined Cycle Power Plant over 6 years (2006-2011), when the power plant was set to work with full load. Features consist of hourly average ambient variables Temperature (T), Ambient Pressure (AP), Relative Humidity (RH) and Exhaust Vacuum (V) to predict the net hourly electrical energy output (EP) of the plant. 2 | A combined cycle power plant (CCPP) is composed of gas turbines (GT), steam turbines (ST) and heat recovery steam generators. In a CCPP, the electricity is generated by gas and steam turbines, which are combined in one cycle, and is transferred from one turbine to another. While the Vacuum is colected from and has effect on the Steam Turbine, he other three of the ambient variables effect the GT performance. 3 | For comparability with our baseline studies, and to allow 5x2 fold statistical tests be carried out, we provide the data shuffled five times. For each shuffling 2-fold CV is carried out and the resulting 10 measurements are used for statistical testing. 4 | 5 | Relevant Papers to cite: 6 | 7 | Pınar Tüfekci, Prediction of full load electrical power output of a base load operated combined cycle power plant using machine learning methods, International Journal of Electrical Power & Energy Systems, Volume 60, September 2014, Pages 126-140, ISSN 0142-0615, http://dx.doi.org/10.1016/j.ijepes.2014.02.027. 8 | (http://www.sciencedirect.com/science/article/pii/S0142061514000908) 9 | 10 | Heysem Kaya, Pınar Tüfekci , Sadık Fikret Gürgen: Local and Global Learning Methods for Predicting Power of a Combined Gas & Steam Turbine, Proceedings of the International Conference on Emerging Trends in Computer and Electronics Engineering ICETCEE 2012, pp. 13-18 (Mar. 2012, Dubai) 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Power-prediction 2 | 电力预测案例 3 | 4 | 因企业数据保密,现只能使用UCI数据集来进行预测,当然思想是差不多一样的,可能企业考虑因素多,特征值多 5 | 6 | 1 简介 7 | 8 | 尝试并比较了一些机器学习回归算法拟合出一个预测模型,希望这个模型能够预测出每小时的满载电力。电厂的基本负荷运行受四个主要参数的影响,环境温度、气压、相对湿度和排汽压力。这些变量影响了电力的输出,这里电力的输出作为目标变量。这个项目的数据来自于是一家电厂过去六年的数据,包括输入变量(影响结果的参数)和目标变量。首先,在所给数据中找出最优的子集,即主要的特征。接下来,找出性能最优的回归方法,通过这种回归方法能够最好的预测出满负荷电力的输出。 9 | 10 | 2、数据 11 | 12 |   数据我是从著名的UCI数据集上面下载的。使用的是来自一家不知名的复合式发电站的六年的数据,复合式循环发电站由燃气发电机、蒸汽涡轮发电机和热力循环系统组成。在这样一个发电站中,电能是由燃气和蒸汽发电机产生的,将这两台发电机组合在一个循环中,即将两台发电机连接在一起。复合式循环发电系统中的燃气发电机不仅仅能够产生电能,也能产生大量的热能。而这些热能可以通过水冷系统供给蒸汽涡轮发电机,由此可以生产出电力。这样燃气发电机既可以生产大量的电能,产生的热能也可以供给给蒸汽发电机,产生额外的电力。这种复合式循环发电系统意见在全球大量的应用了。 13 | 14 | 数据中给的变量有五个,如下: 15 | 16 |   (1)环境温度(AT):单位:摄氏度; 变化范围:1.81℃-37.11℃ 17 | 18 |   (2)大气压(AP):单位:毫巴; 变化范围:992.89-1033.30 mbar 19 | 20 |   (3)湿度(RH):单位:百分比; 变化范围:25.56%-100.16% 21 | 22 |   (4)蒸汽压力(V):单位:cm Hg; 变化范围:25.36-81.56 cm Hg 23 | 24 |   (5)全负载电力输出(PE):单位:兆瓦特 变化范围:420.26-495.76 MW 25 | 26 | 其中(1)-(4)是输入变量,(5)为需要预测的变量 27 | 28 | 注:五张sheet表可以做交叉验证使用的,而这里我为了快点将模型建立起来,就没有使用交叉验证了。我测试三次,选用不同的sheet表作为训练集、测试集,误差相差的并不是很大。 29 | -------------------------------------------------------------------------------- /数据可视化.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 数据可视化" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "data": { 17 | "image/png": "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\n", 18 | "text/plain": [ 19 | "" 20 | ] 21 | }, 22 | "metadata": {}, 23 | "output_type": "display_data" 24 | } 25 | ], 26 | "source": [ 27 | "import numpy as np\n", 28 | "import matplotlib.pyplot as plt\n", 29 | "import xlrd\n", 30 | "import math\n", 31 | "from sklearn import linear_model\n", 32 | "data = xlrd.open_workbook('./CCPP/Folds5x2_pp.xlsx')\n", 33 | "\n", 34 | "#读取数据,将xls中的数据读取出来\n", 35 | "sheet1 = data.sheet_by_name('Sheet1')\n", 36 | "\n", 37 | "sheet2 = data.sheet_by_name('Sheet2')\n", 38 | "sheet3 = data.sheet_by_name('Sheet3')\n", 39 | "sheet4 = data.sheet_by_name('Sheet4')\n", 40 | "sheet5 = data.sheet_by_name('Sheet5')\n", 41 | "\n", 42 | "#训练集\n", 43 | "AT_tran = sheet1.col_values(0) + sheet2.col_values(0) + sheet3.col_values(0) + sheet4.col_values(0)\n", 44 | "V_tran = sheet1.col_values(1) + sheet2.col_values(1) + sheet3.col_values(1) + sheet4.col_values(1)\n", 45 | "AP_tran = sheet1.col_values(2) + sheet2.col_values(2) + sheet3.col_values(2) + sheet4.col_values(2)\n", 46 | "RH_tran = sheet1.col_values(3) + sheet2.col_values(3) + sheet3.col_values(3) + sheet4.col_values(3)\n", 47 | "PE_tran = sheet1.col_values(4) + sheet2.col_values(4) + sheet3.col_values(4) + sheet4.col_values(4)\n", 48 | "\n", 49 | "#测试集\n", 50 | "AT_test = sheet5.col_values(0)\n", 51 | "V_test = sheet5.col_values(1)\n", 52 | "AP_test = sheet5.col_values(2)\n", 53 | "RH_test = sheet5.col_values(3)\n", 54 | "PE_test = sheet5.col_values(4)\n", 55 | "\n", 56 | "\n", 57 | "n = len(AT_tran) #数据个数\n", 58 | "N = len(sheet1.col_values(1))\n", 59 | "\n", 60 | "datas = {'AT':AT_tran, 'V':V_tran, 'AP':AP_tran, 'RH':RH_tran, 'PE':PE_tran}\n", 61 | "#散点矩阵图\n", 62 | "\n", 63 | "data = {0:AT_tran,1:V_tran, 2:AP_tran, 3:RH_tran, 4:PE_tran }\n", 64 | "fig, axes = plt.subplots(5,5, subplot_kw = {'xticks':[], 'yticks':[]})\n", 65 | "title = [ 'AT', 'V', 'AP', 'RH', 'PE']\n", 66 | "i = 0;\n", 67 | "\n", 68 | "\n", 69 | "for ax in axes.flat:\n", 70 | " k = int(i/5)\n", 71 | " j = 4 - ( i % 5)\n", 72 | " if k == 0:\n", 73 | " ax.set_title(title[j])\n", 74 | " if j == 4:\n", 75 | " ax.set_ylabel(title[k])\n", 76 | " ax.plot(sheet1.col_values(k), sheet1.col_values(j), 'o', alpha = 0.3, markersize = 2)\n", 77 | "\n", 78 | " #ax.plot(data[k], data[j], 'o', alpha = 0.015, markersize = 2)\n", 79 | " i += 1\n", 80 | "plt.show()" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": null, 86 | "metadata": { 87 | "collapsed": true 88 | }, 89 | "outputs": [], 90 | "source": [] 91 | } 92 | ], 93 | "metadata": { 94 | "kernelspec": { 95 | "display_name": "Python 3", 96 | "language": "python", 97 | "name": "python3" 98 | }, 99 | "language_info": { 100 | "codemirror_mode": { 101 | "name": "ipython", 102 | "version": 3 103 | }, 104 | "file_extension": ".py", 105 | "mimetype": "text/x-python", 106 | "name": "python", 107 | "nbconvert_exporter": "python", 108 | "pygments_lexer": "ipython3", 109 | "version": "3.6.3" 110 | } 111 | }, 112 | "nbformat": 4, 113 | "nbformat_minor": 2 114 | } 115 | -------------------------------------------------------------------------------- /数据概览.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "前五个数据\n", 13 | " AP AT PE RH V\n", 14 | "0 AP AT PE RH V\n", 15 | "1 1024.07 14.96 463.26 73.17 41.76\n", 16 | "2 1020.04 25.18 444.37 59.08 62.96\n", 17 | "3 1012.16 5.11 488.56 92.14 39.4\n", 18 | "4 1010.24 20.86 446.48 76.64 57.32\n", 19 | "简单统计描述\n", 20 | " AP AT PE RH V\n", 21 | "count 47845.00 47845.00 47845.0 47845.00 47845.00\n", 22 | "unique 2518.00 2774.00 4837.0 4547.00 635.00\n", 23 | "top 1013.88 25.21 468.8 100.09 41.17\n", 24 | "freq 80.00 70.00 45.0 130.00 305.00\n", 25 | "协方差矩阵\n", 26 | "Empty DataFrame\n", 27 | "Columns: []\n", 28 | "Index: []\n", 29 | "相关系数矩阵\n", 30 | "Empty DataFrame\n", 31 | "Columns: []\n", 32 | "Index: []\n" 33 | ] 34 | } 35 | ], 36 | "source": [ 37 | "import xlrd\n", 38 | "import pandas as pd\n", 39 | "\n", 40 | "def getData():\n", 41 | " data = xlrd.open_workbook('./CCPP/Folds5x2_pp.xlsx')\n", 42 | "\n", 43 | " sheet1 = data.sheet_by_name('Sheet1')\n", 44 | " sheet2 = data.sheet_by_name('Sheet2')\n", 45 | " sheet3 = data.sheet_by_name('Sheet3')\n", 46 | " sheet4 = data.sheet_by_name('Sheet4')\n", 47 | " sheet5 = data.sheet_by_name('Sheet5')\n", 48 | "\n", 49 | " AT_tran = sheet1.col_values(0) + sheet2.col_values(0) + sheet3.col_values(0) + sheet4.col_values(0) + sheet5.col_values(0)\n", 50 | " V_tran = sheet1.col_values(1) + sheet2.col_values(1) + sheet3.col_values(1) + sheet4.col_values(1) + sheet5.col_values(1)\n", 51 | " AP_tran = sheet1.col_values(2) + sheet2.col_values(2) + sheet3.col_values(2) + sheet4.col_values(2) + sheet5.col_values(2)\n", 52 | " RH_tran = sheet1.col_values(3) + sheet2.col_values(3) + sheet3.col_values(3) + sheet4.col_values(3) + sheet5.col_values(3)\n", 53 | " PE_tran = sheet1.col_values(4) + sheet2.col_values(4) + sheet3.col_values(4) + sheet4.col_values(4) + sheet5.col_values(4)\n", 54 | "\n", 55 | " tran = {'AT':AT_tran,'V':V_tran,'AP':AP_tran,'RH':RH_tran,'PE':PE_tran}\n", 56 | "\n", 57 | " return tran\n", 58 | "\n", 59 | "tran = getData()\n", 60 | "\n", 61 | "#将数据转换成数据框的格式\n", 62 | "df2 = pd.DataFrame({'AT':tran['AT'], 'V':tran['V'], 'AP':tran['AP'], 'RH':tran['RH'], 'PE':tran['PE']})\n", 63 | "\n", 64 | "print(\"前五个数据\")\n", 65 | "print(df2.head())\n", 66 | "\n", 67 | "print(\"简单统计描述\")\n", 68 | "print(df2.describe())\n", 69 | "\n", 70 | "print(\"协方差矩阵\")\n", 71 | "print(df2.cov())\n", 72 | "\n", 73 | "print(\"相关系数矩阵\")\n", 74 | "print(df2.corr())" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": null, 80 | "metadata": { 81 | "collapsed": true 82 | }, 83 | "outputs": [], 84 | "source": [] 85 | } 86 | ], 87 | "metadata": { 88 | "kernelspec": { 89 | "display_name": "Python 3", 90 | "language": "python", 91 | "name": "python3" 92 | }, 93 | "language_info": { 94 | "codemirror_mode": { 95 | "name": "ipython", 96 | "version": 3 97 | }, 98 | "file_extension": ".py", 99 | "mimetype": "text/x-python", 100 | "name": "python", 101 | "nbconvert_exporter": "python", 102 | "pygments_lexer": "ipython3", 103 | "version": "3.6.3" 104 | } 105 | }, 106 | "nbformat": 4, 107 | "nbformat_minor": 2 108 | } 109 | -------------------------------------------------------------------------------- /最小二乘法和脊回归.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 最小二乘法和脊回归" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [ 15 | { 16 | "name": "stdout", 17 | "output_type": "stream", 18 | "text": [ 19 | "================最小二乘发回归=================\n", 20 | "××××××××××××××××平均绝对偏差*****************\n", 21 | "AT [[-2.17131996]]\n", 22 | "AT [ 497.03411989]\n", 23 | "AT训练误差: 4.2879818941\n", 24 | "AT测试误差: 4.2879818941\n", 25 | "V [[-1.16813513]]\n", 26 | "V [ 517.80152631]\n", 27 | "V训练误差: 6.57649440109\n", 28 | "V测试误差: 6.57649440109\n", 29 | "AP [[ 1.48987167]]\n", 30 | "AP [-1055.26098898]\n", 31 | "AP训练误差: 11.9575739793\n", 32 | "AP测试误差: 11.9575739793\n", 33 | "RH [[ 0.4556501]]\n", 34 | "RH [ 420.96176616]\n", 35 | "RH训练误差: 13.1940215836\n", 36 | "RH测试误差: 13.1940215836\n", 37 | "AT-V [[-1.70426591 -0.32448652]]\n", 38 | "AT-V [ 505.47743382]\n", 39 | "AT-V训练误差: 3.91742599695\n", 40 | "AT-V测试误差: 3.91742599695\n", 41 | "AT-AP [[-2.11306594 0.14402919]]\n", 42 | "AT-AP [ 349.95047262]\n", 43 | "AT-AP训练误差: 4.27818773199\n", 44 | "AT-AP测试误差: 4.27818773199\n", 45 | "AT-RH [[-2.39070329 -0.20640286]]\n", 46 | "AT-RH [ 516.47645545]\n", 47 | "AT-RH训练误差: 3.79779100865\n", 48 | "AT-RH测试误差: 3.79779100865\n", 49 | "V-AP [[-1.06177593 0.55039349]]\n", 50 | "V-AP [-45.66559505]\n", 51 | "V-AP训练误差: 6.1510549951\n", 52 | "V-AP测试误差: 6.1510549951\n", 53 | "V-RH [[-1.06177593 0.55039349]]\n", 54 | "V-RH [-45.66559505]\n", 55 | "V-RH训练误差: 6.1510549951\n", 56 | "V-RH测试误差: 6.1510549951\n", 57 | "AT-V-AP [[-1.63477738 -0.32832324 0.15815192]]\n", 58 | "AT-V-AP [ 344.0713874]\n", 59 | "AT-V-AP训练误差: 3.87548882213\n", 60 | "AT-V-AP测试误差: 3.87548882213\n", 61 | "AT-V-RH [[-2.01872702 -0.22814053 -0.16538342]]\n", 62 | "AT-V-RH [ 518.54892503]\n", 63 | "AT-V-RH训练误差: 3.62489930643\n", 64 | "AT-V-RH测试误差: 3.62489930643\n", 65 | "V-AP-RH [[-1.00142746 0.56445742 0.16067624]]\n", 66 | "V-AP-RH [-74.97228155]\n", 67 | "V-AP-RH训练误差: 5.89730955706\n", 68 | "V-AP-RH测试误差: 5.89730955706\n", 69 | "AT-V-AP-RH [[-1.97751311 -0.23391642 0.06208294 -0.1580541 ]]\n", 70 | "AT-V-AP-RH [ 454.60927432]\n", 71 | "AT-V-AP-RH训练误差: 3.6252158076\n", 72 | "AT-V-AP-RH测试误差: 17.3433313624\n", 73 | "******************均方差********************\n", 74 | "AT [[-2.17131996]]\n", 75 | "AT [ 497.03411989]\n", 76 | "AT训练误差: 29.4317020111\n", 77 | "AT测试误差: 29.4317020111\n", 78 | "V [[-1.16813513]]\n", 79 | "V [ 517.80152631]\n", 80 | "V训练误差: 70.9146510302\n", 81 | "V测试误差: 70.9146510302\n", 82 | "AP [[ 1.48987167]]\n", 83 | "AP [-1055.26098898]\n", 84 | "AP训练误差: 212.972499833\n", 85 | "AP测试误差: 212.972499833\n", 86 | "RH [[ 0.4556501]]\n", 87 | "RH [ 420.96176616]\n", 88 | "RH训练误差: 246.999228093\n", 89 | "RH测试误差: 246.999228093\n", 90 | "AT-V [[-1.70426591 -0.32448652]]\n", 91 | "AT-V [ 505.47743382]\n", 92 | "AT-V训练误差: 24.5439582492\n", 93 | "AT-V测试误差: 24.5439582492\n", 94 | "AT-AP [[-2.11306594 0.14402919]]\n", 95 | "AT-AP [ 349.95047262]\n", 96 | "AT-AP训练误差: 28.8885956132\n", 97 | "AT-AP测试误差: 28.8885956132\n", 98 | "AT-RH [[-2.39070329 -0.20640286]]\n", 99 | "AT-RH [ 516.47645545]\n", 100 | "AT-RH训练误差: 23.0240210796\n", 101 | "AT-RH测试误差: 23.0240210796\n", 102 | "V-AP [[-1.06177593 0.55039349]]\n", 103 | "V-AP [-45.66559505]\n", 104 | "V-AP训练误差: 62.0582128686\n", 105 | "V-AP测试误差: 62.0582128686\n", 106 | "V-RH [[-1.06177593 0.55039349]]\n", 107 | "V-RH [-45.66559505]\n", 108 | "V-RH训练误差: 62.0582128686\n", 109 | "V-RH测试误差: 62.0582128686\n", 110 | "AT-V-AP [[-1.63477738 -0.32832324 0.15815192]]\n", 111 | "AT-V-AP [ 344.0713874]\n", 112 | "AT-V-AP训练误差: 23.8898051841\n", 113 | "AT-V-AP测试误差: 23.8898051841\n", 114 | "AT-V-RH [[-2.01872702 -0.22814053 -0.16538342]]\n", 115 | "AT-V-RH [ 518.54892503]\n", 116 | "AT-V-RH训练误差: 20.8609674847\n", 117 | "AT-V-RH测试误差: 20.8609674847\n", 118 | "V-AP-RH [[-1.00142746 0.56445742 0.16067624]]\n", 119 | "V-AP-RH [-74.97228155]\n", 120 | "V-AP-RH训练误差: 57.0975504625\n", 121 | "V-AP-RH测试误差: 57.0975504625\n", 122 | "AT-V-AP-RH [[-1.97751311 -0.23391642 0.06208294 -0.1580541 ]]\n", 123 | "AT-V-AP-RH [ 454.60927432]\n", 124 | "AT-V-AP-RH训练误差: 20.7673975325\n", 125 | "AT-V-AP-RH测试误差: 457.024352216\n", 126 | "================最小二乘发回归=================\n", 127 | "================脊回归=================\n", 128 | "××××××××××××××××平均绝对偏差*****************\n", 129 | "AT [[-2.1713186]]\n", 130 | "AT [ 497.03409312]\n", 131 | "AT训练误差: 4.28798230479\n", 132 | "AT测试误差: 4.28798230479\n", 133 | "V [[-1.16813487]]\n", 134 | "V [ 517.80151262]\n", 135 | "V训练误差: 6.57649436042\n", 136 | "V测试误差: 6.57649436042\n", 137 | "AP [[ 1.4898702]]\n", 138 | "AP [-1055.25949764]\n", 139 | "AP训练误差: 11.9575751146\n", 140 | "AP测试误差: 11.9575751146\n", 141 | "RH [[ 0.45565003]]\n", 142 | "RH [ 420.96177162]\n", 143 | "RH训练误差: 13.1940217153\n", 144 | "RH测试误差: 13.1940217153\n", 145 | "AT-V [[-1.70426254 -0.32448811]]\n", 146 | "AT-V [ 505.47745437]\n", 147 | "AT-V训练误差: 3.91742640857\n", 148 | "AT-V测试误差: 3.91742640857\n", 149 | "AT-AP [[-2.11306423 0.14403014]]\n", 150 | "AT-AP [ 349.94948091]\n", 151 | "AT-AP训练误差: 4.27818835644\n", 152 | "AT-AP测试误差: 4.27818835644\n", 153 | "AT-RH [[-2.39070111 -0.20640223]]\n", 154 | "AT-RH [ 516.47636603]\n", 155 | "AT-RH训练误差: 3.79779150346\n", 156 | "AT-RH测试误差: 3.79779150346\n", 157 | "V-AP [[-1.06177579 0.55039308]]\n", 158 | "V-AP [-45.66518635]\n", 159 | "V-AP训练误差: 6.15105489569\n", 160 | "V-AP测试误差: 6.15105489569\n", 161 | "V-RH [[-1.06177579 0.55039308]]\n", 162 | "V-RH [-45.66518635]\n", 163 | "V-RH训练误差: 6.15105489569\n", 164 | "V-RH测试误差: 6.15105489569\n", 165 | "AT-V-AP [[-1.63477384 -0.32832477 0.15815265]]\n", 166 | "AT-V-AP [ 344.07065612]\n", 167 | "AT-V-AP训练误差: 3.87548913944\n", 168 | "AT-V-AP测试误差: 3.87548913944\n", 169 | "AT-V-RH [[-2.01872095 -0.22814312 -0.16538242]]\n", 170 | "AT-V-RH [ 518.54887327]\n", 171 | "AT-V-RH训练误差: 3.62489978236\n", 172 | "AT-V-RH测试误差: 3.62489978236\n", 173 | "V-AP-RH [[-1.00142732 0.56445698 0.16067627]]\n", 174 | "V-AP-RH [-74.97184625]\n", 175 | "V-AP-RH训练误差: 5.89730954224\n", 176 | "V-AP-RH测试误差: 5.89730954224\n", 177 | "AT-V-AP-RH [[-1.977506 -0.23391912 0.06208473 -0.15805291]]\n", 178 | "AT-V-AP-RH [ 454.60737973]\n", 179 | "AT-V-AP-RH训练误差: 3.62521649597\n", 180 | "AT-V-AP-RH测试误差: 17.3432765004\n", 181 | "******************均方差********************\n", 182 | "AT [[-2.1713186]]\n", 183 | "AT [ 497.03409312]\n", 184 | "AT训练误差: 29.4317020112\n", 185 | "AT测试误差: 29.4317020112\n", 186 | "V [[-1.16813487]]\n", 187 | "V [ 517.80151262]\n", 188 | "V训练误差: 70.9146510302\n", 189 | "V测试误差: 70.9146510302\n", 190 | "AP [[ 1.4898702]]\n", 191 | "AP [-1055.25949764]\n", 192 | "AP训练误差: 212.972499833\n", 193 | "AP测试误差: 212.972499833\n", 194 | "RH [[ 0.45565003]]\n", 195 | "RH [ 420.96177162]\n", 196 | "RH训练误差: 246.999228093\n", 197 | "RH测试误差: 246.999228093\n", 198 | "AT-V [[-1.70426254 -0.32448811]]\n", 199 | "AT-V [ 505.47745437]\n", 200 | "AT-V训练误差: 24.5439582494\n", 201 | "AT-V测试误差: 24.5439582494\n", 202 | "AT-AP [[-2.11306423 0.14403014]]\n", 203 | "AT-AP [ 349.94948091]\n", 204 | "AT-AP训练误差: 28.8885956134\n", 205 | "AT-AP测试误差: 28.8885956134\n", 206 | "AT-RH [[-2.39070111 -0.20640223]]\n", 207 | "AT-RH [ 516.47636603]\n", 208 | "AT-RH训练误差: 23.0240210798\n", 209 | "AT-RH测试误差: 23.0240210798\n", 210 | "V-AP [[-1.06177579 0.55039308]]\n", 211 | "V-AP [-45.66518635]\n", 212 | "V-AP训练误差: 62.0582128686\n", 213 | "V-AP测试误差: 62.0582128686\n", 214 | "V-RH [[-1.06177579 0.55039308]]\n", 215 | "V-RH [-45.66518635]\n", 216 | "V-RH训练误差: 62.0582128686\n", 217 | "V-RH测试误差: 62.0582128686\n", 218 | "AT-V-AP [[-1.63477384 -0.32832477 0.15815265]]\n", 219 | "AT-V-AP [ 344.07065612]\n", 220 | "AT-V-AP训练误差: 23.8898051843\n", 221 | "AT-V-AP测试误差: 23.8898051843\n", 222 | "AT-V-RH [[-2.01872095 -0.22814312 -0.16538242]]\n", 223 | "AT-V-RH [ 518.54887327]\n", 224 | "AT-V-RH训练误差: 20.8609674851\n", 225 | "AT-V-RH测试误差: 20.8609674851\n", 226 | "V-AP-RH [[-1.00142732 0.56445698 0.16067627]]\n", 227 | "V-AP-RH [-74.97184625]\n", 228 | "V-AP-RH训练误差: 57.0975504625\n", 229 | "V-AP-RH测试误差: 57.0975504625\n", 230 | "AT-V-AP-RH [[-1.977506 -0.23391912 0.06208473 -0.15805291]]\n", 231 | "AT-V-AP-RH [ 454.60737973]\n", 232 | "AT-V-AP-RH训练误差: 20.767397533\n", 233 | "AT-V-AP-RH测试误差: 457.021485826\n", 234 | "================脊回归=================\n" 235 | ] 236 | } 237 | ], 238 | "source": [ 239 | "import xlrd\n", 240 | "from sklearn import linear_model\n", 241 | "#import pandas as pd\n", 242 | "from sklearn.metrics import mean_absolute_error\n", 243 | "from sklearn.metrics import mean_squared_error\n", 244 | "\n", 245 | "def get_error2(tranData, testData, name, func,evaluation): \n", 246 | "#tranData这个数据集是训练集\n", 247 | "#testData是测试集\n", 248 | "#name是数据集中变量名\n", 249 | "#func为回归函数\n", 250 | "#evaluation为误差判断函数\n", 251 | "\n", 252 | " error = {}\n", 253 | "\n", 254 | "# print name\n", 255 | " Y = tranData['PE']\n", 256 | " Y1 =testData['PE']\n", 257 | " for i in name:\n", 258 | "\n", 259 | " X = tranData[i]\n", 260 | " X1 = testData[i]\n", 261 | " clf = func()\n", 262 | " clf.fit( X ,Y)\n", 263 | " print(i, clf.coef_)\n", 264 | " print(i, clf.intercept_)\n", 265 | " error[i+\"训练误差\"]=evaluation(Y,clf.predict(X))\n", 266 | " print(i+\"训练误差:\", str(error[i+\"训练误差\"]))\n", 267 | " error[i+\"测试误差\"]= evaluation(Y1, clf.predict(X1))\n", 268 | " print(i+\"测试误差:\", error[i+\"测试误差\"])\n", 269 | "\n", 270 | " return error\n", 271 | "\n", 272 | "def getData():\n", 273 | " data = xlrd.open_workbook('./CCPP/Folds5x2_pp.xlsx')\n", 274 | "\n", 275 | " #读取数据,将xls中的数据读取出来\n", 276 | " sheet1 = data.sheet_by_name('Sheet1')\n", 277 | " sheet2 = data.sheet_by_name('Sheet2')\n", 278 | " sheet3 = data.sheet_by_name('Sheet3')\n", 279 | " sheet4 = data.sheet_by_name('Sheet4')\n", 280 | " sheet5 = data.sheet_by_name('Sheet5')\n", 281 | "\n", 282 | " #训练集\n", 283 | " AT_tran = sheet1.col_values(0)[1:] + sheet2.col_values(0)[1:] + sheet3.col_values(0)[1:] \n", 284 | " V_tran = sheet1.col_values(1)[1:] + sheet2.col_values(1)[1:] + sheet3.col_values(1)[1:]\n", 285 | " AP_tran = sheet1.col_values(2)[1:] + sheet2.col_values(2)[1:] + sheet3.col_values(2) [1:]\n", 286 | " RH_tran = sheet1.col_values(3)[1:] + sheet2.col_values(3)[1:] + sheet3.col_values(3)[1:] \n", 287 | " PE_tran = sheet1.col_values(4)[1:] + sheet2.col_values(4)[1:] + sheet3.col_values(4)[1:]\n", 288 | "\n", 289 | " #测试集\n", 290 | " AT_test = sheet4.col_values(0)[1:] + sheet5.col_values(0)[1:]\n", 291 | " V_test = sheet4.col_values(1)[1:] + sheet5.col_values(1)[1:]\n", 292 | " AP_test = sheet4.col_values(2)[1:] + sheet5.col_values(2)[1:]\n", 293 | " RH_test = sheet4.col_values(3)[1:] + sheet5.col_values(3)[1:]\n", 294 | " PE_test = sheet4.col_values(4)[1:] + sheet5.col_values(4)[1:]\n", 295 | "\n", 296 | " tran = {'AT':AT_tran,'V':V_tran,'AP':AP_tran,'RH':RH_tran,'PE':PE_tran}\n", 297 | " test = {'AT':AT_test,'V':V_test,'AP':AP_test,'RH':RH_test,'PE':PE_test}\n", 298 | "\n", 299 | " return tran, test\n", 300 | "\n", 301 | "\n", 302 | "#拟合函数\n", 303 | "def getResultError2(tran, test, regFunc, errFunc):\n", 304 | "#tran训练集\n", 305 | "#test测试集\n", 306 | "#regFunc回归函数\n", 307 | "#errFunc误差测量函数\n", 308 | "#parameter参数\n", 309 | " name1 = ['AT', 'V', 'AP', 'RH']\n", 310 | " tran1 = {'AT':[[x] for x in tran['AT']], 'V':[[x] for x in tran['V']], 'AP':[[x] for x in tran['AP']],'RH':[[x] for x in tran['RH']], 'PE':[[x] for x in tran['PE']]}\n", 311 | " test1 = {'AT':[[x] for x in test['AT']], 'V':[[x] for x in test['V']], 'AP':[[x] for x in test['AP']],'RH':[[x] for x in test['RH']], 'PE':[[x] for x in test['PE']]}\n", 312 | " error1 = get_error2(tran1, test1, name1, regFunc, errFunc)\n", 313 | "\n", 314 | " #数据子集有两个属性\n", 315 | " tran2 = {'AT-V':[[x, y] for x, y in zip(tran['AT'], tran['V'])],'AT-AP':[[x, y] for x, y in zip(tran['AT'], tran['AP'])], 'AT-RH':[[x, y] for x, y in zip(tran['AT'], tran['RH'])], 'V-AP':[[x, y] for x, y in zip(tran['V'], tran['AP'])], 'V-RH':[[x, y] for x, y in zip(tran['V'], tran['AP'])] ,'PE':[[x] for x in tran['PE']]}\n", 316 | " test2 = {'AT-V': [[x, y] for x, y in zip(test['AT'],test['V'])],'AT-AP':[[x, y] for x, y in zip(test['AT'], test['AP'])], 'AT-RH': [[x, y] for x, y in zip(test['AT'], test['RH'])], 'V-AP':[[x, y ] for x, y in zip(test['V'], test['AP'])], 'V-RH':[[x, y] for x, y in zip(test['V'], test['AP'])],'PE': [[x] for x in test['PE']]}\n", 317 | "\n", 318 | " name2 = [ 'AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 319 | " error2 = get_error2(tran2, test2, name2, regFunc, errFunc)\n", 320 | "\n", 321 | "\n", 322 | " #数据子集有三个属性\n", 323 | " tran3 = {'AT-V-AP':[[x, y, z] for x, y, z in zip(tran['AT'], tran['V'] , tran['AP'])],'AT-V-RH':[[x, y, z] for x, y, z in zip(tran['AT'], tran['V'], tran['RH'])], 'V-AP-RH':[[x, y, z] for x, y, z in zip(tran['V'], tran['AP'], tran['RH'])], 'PE':[[x] for x in tran['PE']]}\n", 324 | " test3 = {'AT-V-AP':[[x, y, z] for x, y, z in zip(test['AT'],test['V'] , test['AP'])],'AT-V-RH':[[x, y, z] for x, y, z in zip(test['AT'],test['V'], test['RH'])], 'V-AP-RH':[[x, y, z] for x, y, z in zip(test['V'], test['AP'], test['RH'])], 'PE':[[x] for x in test['PE']]}\n", 325 | " name3 = [ 'AT-V-AP', 'AT-V-RH', 'V-AP-RH' ]\n", 326 | " error3 = get_error2(tran3, test3, name3, regFunc, errFunc)\n", 327 | "\n", 328 | " #数据子集有四个属性\n", 329 | " tran4 = {'AT-V-AP-RH':[[x, y, z, w] for x, y, z, w in zip(tran['AT'], tran['V'] , tran['AP'], tran['RH'])], 'PE':[[x] for x in tran['PE']]}\n", 330 | " test4 = {'AT-V-AP-RH':[[x, y, z, w] for x, y, z, w in zip(tran['AT'],test['V'] , test['AP'], test['RH'])], 'PE':[[x] for x in test['PE']]}\n", 331 | " name4 = [ 'AT-V-AP-RH' ]\n", 332 | " error4 = get_error2(tran4, test4, name4, regFunc, errFunc)\n", 333 | "\n", 334 | " finalError = {1:error1, 2:error2, 3:error3, 4:error4}\n", 335 | " return finalError\n", 336 | "\n", 337 | "if __name__ == '__main__':\n", 338 | "\n", 339 | " tran, test = getData()\n", 340 | "\n", 341 | " print(\"================最小二乘发回归=================\")\n", 342 | " print(\"××××××××××××××××平均绝对偏差*****************\")\n", 343 | " linearAbsoluteError = getResultError2(tran, test, linear_model.LinearRegression , mean_absolute_error)\n", 344 | " #linear_model.LinearRegression为scikit-learn中的最小二乘法中的函数,mean_absolute_error绝对误差衡量函数。在python中,函数也是可以传入函数中的。\n", 345 | " print(\"******************均方差********************\")\n", 346 | " linearSquareError = getResultError2(tran, test, linear_model.LinearRegression , mean_squared_error)\n", 347 | " #mean_squared_error标准差衡量函数\n", 348 | " print(\"================最小二乘发回归=================\")\n", 349 | "\n", 350 | " print(\"================脊回归=================\")\n", 351 | " print(\"××××××××××××××××平均绝对偏差*****************\")\n", 352 | " linearAbsoluteError = getResultError2(tran, test, linear_model.Ridge , mean_absolute_error)\n", 353 | " print (\"******************均方差********************\")\n", 354 | " linearSquareError = getResultError2(tran, test, linear_model.Ridge , mean_squared_error)\n", 355 | " print(\"================脊回归=================\")" 356 | ] 357 | } 358 | ], 359 | "metadata": { 360 | "kernelspec": { 361 | "display_name": "Python 3", 362 | "language": "python", 363 | "name": "python3" 364 | }, 365 | "language_info": { 366 | "codemirror_mode": { 367 | "name": "ipython", 368 | "version": 3 369 | }, 370 | "file_extension": ".py", 371 | "mimetype": "text/x-python", 372 | "name": "python", 373 | "nbconvert_exporter": "python", 374 | "pygments_lexer": "ipython3", 375 | "version": "3.6.3" 376 | } 377 | }, 378 | "nbformat": 4, 379 | "nbformat_minor": 2 380 | } 381 | -------------------------------------------------------------------------------- /核脊回归和svr回归.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 核脊回归和svr回归" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "由于数据量大,取前1000个数据进行训练和测试" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 2, 20 | "metadata": { 21 | "scrolled": false 22 | }, 23 | "outputs": [ 24 | { 25 | "name": "stdout", 26 | "output_type": "stream", 27 | "text": [ 28 | "================核脊回归=================\n", 29 | "××××××××××××××××平均绝对偏差*****************\n", 30 | "['AT', 'V', 'AP', 'RH']\n", 31 | "AT训练误差: 3.99796431175\n", 32 | "AT测试误差: 4.03701580275\n", 33 | "V训练误差: 5.7325798181\n", 34 | "V测试误差: 5.80446689922\n", 35 | "AP训练误差: 11.6298686972\n", 36 | "AP测试误差: 11.6781718226\n", 37 | "RH训练误差: 13.0653201088\n", 38 | "RH测试误差: 13.3599670137\n", 39 | "['AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 40 | "AT-V训练误差: 3.36933102954\n", 41 | "AT-V测试误差: 3.63348855947\n", 42 | "AT-AP训练误差: 3.71918608634\n", 43 | "AT-AP测试误差: 3.81481067513\n", 44 | "AT-RH训练误差: 3.27508650651\n", 45 | "AT-RH测试误差: 3.74908281588\n", 46 | "V-AP训练误差: 5.05626671802\n", 47 | "V-AP测试误差: 5.15759281852\n", 48 | "V-RH训练误差: 5.05626671802\n", 49 | "V-RH测试误差: 5.15759281852\n", 50 | "['AT-V-AP', 'AT-V-RH', 'V-AP-RH']\n", 51 | "AT-V-AP训练误差: 2.78884650917\n", 52 | "AT-V-AP测试误差: 3.57820272011\n", 53 | "AT-V-RH训练误差: 2.52588050585\n", 54 | "AT-V-RH测试误差: 4.34049486719\n", 55 | "V-AP-RH训练误差: 3.43596692776\n", 56 | "V-AP-RH测试误差: 6.92861317549\n", 57 | "['AT-V-AP-RH']\n", 58 | "AT-V-AP-RH训练误差: 1.52445950309\n", 59 | "AT-V-AP-RH测试误差: 76.3974094413\n", 60 | "******************均方差********************\n", 61 | "['AT', 'V', 'AP', 'RH']\n", 62 | "AT训练误差: 25.8590545816\n", 63 | "AT测试误差: 29.4567452126\n", 64 | "V训练误差: 52.864160629\n", 65 | "V测试误差: 57.7454505856\n", 66 | "AP训练误差: 204.214489698\n", 67 | "AP测试误差: 198.821747641\n", 68 | "RH训练误差: 243.209824161\n", 69 | "RH测试误差: 247.658647421\n", 70 | "['AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 71 | "AT-V训练误差: 18.3074161096\n", 72 | "AT-V测试误差: 26.7976300733\n", 73 | "AT-AP训练误差: 22.4114486826\n", 74 | "AT-AP测试误差: 27.5345407252\n", 75 | "AT-RH训练误差: 17.5929618155\n", 76 | "AT-RH测试误差: 28.6509249751\n", 77 | "V-AP训练误差: 42.5441108207\n", 78 | "V-AP测试误差: 47.4883111903\n", 79 | "V-RH训练误差: 42.5441108207\n", 80 | "V-RH测试误差: 47.4883111903\n", 81 | "['AT-V-AP', 'AT-V-RH', 'V-AP-RH']\n", 82 | "AT-V-AP训练误差: 13.3145527712\n", 83 | "AT-V-AP测试误差: 27.0417502942\n", 84 | "AT-V-RH训练误差: 10.8007680001\n", 85 | "AT-V-RH测试误差: 87.7580947575\n", 86 | "V-AP-RH训练误差: 22.3414879425\n", 87 | "V-AP-RH测试误差: 262.139350989\n", 88 | "['AT-V-AP-RH']\n", 89 | "AT-V-AP-RH训练误差: 4.55844191619\n", 90 | "AT-V-AP-RH测试误差: 15626.184024\n", 91 | "================核脊回归=================\n", 92 | "================svr回归=================\n", 93 | "××××××××××××××××平均绝对偏差*****************\n", 94 | "['AT', 'V', 'AP', 'RH']\n", 95 | "AT训练误差: 3.9928999607\n", 96 | "AT测试误差: 4.03630894543\n", 97 | "V训练误差: 5.5376822808\n", 98 | "V测试误差: 5.70287410584\n", 99 | "AP训练误差: 11.3833574929\n", 100 | "AP测试误差: 11.1204673983\n", 101 | "RH训练误差: 12.9466920852\n", 102 | "RH测试误差: 13.1061384793\n", 103 | "['AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 104 | "AT-V训练误差: 3.35816528395\n", 105 | "AT-V测试误差: 3.50210536025\n", 106 | "AT-AP训练误差: 3.77263283122\n", 107 | "AT-AP测试误差: 3.81460931223\n", 108 | "AT-RH训练误差: 3.39062661207\n", 109 | "AT-RH测试误差: 3.60532855144\n", 110 | "V-AP训练误差: 5.17114382858\n", 111 | "V-AP测试误差: 5.25667737383\n", 112 | "V-RH训练误差: 5.17114382858\n", 113 | "V-RH测试误差: 5.25667737383\n", 114 | "['AT-V-AP', 'AT-V-RH', 'V-AP-RH']\n", 115 | "AT-V-AP训练误差: 3.04865623019\n", 116 | "AT-V-AP测试误差: 3.33592019516\n", 117 | "AT-V-RH训练误差: 2.95125393581\n", 118 | "AT-V-RH测试误差: 3.43215728942\n", 119 | "V-AP-RH训练误差: 4.34913654138\n", 120 | "V-AP-RH测试误差: 5.05579515852\n", 121 | "['AT-V-AP-RH']\n", 122 | "AT-V-AP-RH训练误差: 2.52359045107\n", 123 | "AT-V-AP-RH测试误差: 11.9715633051\n", 124 | "******************均方差********************\n", 125 | "['AT', 'V', 'AP', 'RH']\n", 126 | "AT训练误差: 26.3392305282\n", 127 | "AT测试误差: 29.4231722273\n", 128 | "V训练误差: 52.0641350594\n", 129 | "V测试误差: 57.3161927423\n", 130 | "AP训练误差: 215.256097391\n", 131 | "AP测试误差: 200.455894676\n", 132 | "RH训练误差: 249.70776054\n", 133 | "RH测试误差: 248.72538896\n", 134 | "['AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 135 | "AT-V训练误差: 19.5775692563\n", 136 | "AT-V测试误差: 24.6551637621\n", 137 | "AT-AP训练误差: 23.9474825408\n", 138 | "AT-AP测试误差: 27.6188016036\n", 139 | "AT-RH训练误差: 19.7517767984\n", 140 | "AT-RH测试误差: 24.3806367872\n", 141 | "V-AP训练误差: 46.4135379545\n", 142 | "V-AP测试误差: 49.2758816906\n", 143 | "V-RH训练误差: 46.4135379545\n", 144 | "V-RH测试误差: 49.2758816906\n", 145 | "['AT-V-AP', 'AT-V-RH', 'V-AP-RH']\n", 146 | "AT-V-AP训练误差: 16.5349579509\n", 147 | "AT-V-AP测试误差: 22.9836414349\n", 148 | "AT-V-RH训练误差: 16.2169000427\n", 149 | "AT-V-RH测试误差: 23.4573215318\n", 150 | "V-AP-RH训练误差: 38.0751155058\n", 151 | "V-AP-RH测试误差: 45.9809734763\n", 152 | "['AT-V-AP-RH']\n", 153 | "AT-V-AP-RH训练误差: 13.110970175\n", 154 | "AT-V-AP-RH测试误差: 213.570513444\n", 155 | "================svr回归=================\n" 156 | ] 157 | } 158 | ], 159 | "source": [ 160 | "import xlrd\n", 161 | "import numpy as np\n", 162 | "from sklearn.metrics import mean_absolute_error\n", 163 | "from sklearn.metrics import mean_squared_error\n", 164 | "from sklearn.svm import SVR\n", 165 | "from sklearn.grid_search import GridSearchCV\n", 166 | "from sklearn.kernel_ridge import KernelRidge\n", 167 | "\n", 168 | "rng = np.random.RandomState(0)\n", 169 | "\n", 170 | "def getData():\n", 171 | " data = xlrd.open_workbook('./CCPP/Folds5x2_pp.xlsx')\n", 172 | "\n", 173 | " #读取数据,将xls中的数据读取出来\n", 174 | " sheet1 = data.sheet_by_name('Sheet1')\n", 175 | " #x = sheet1.col_values(0)\n", 176 | " #y = sheet1.col_values(4)\n", 177 | " #plt.plot(x, y, 'o')\n", 178 | " #sheet2 = data.sheet_by_name('Sheet2')\n", 179 | " # sheet3 = data.sheet_by_name('Sheet3')\n", 180 | " sheet4 = data.sheet_by_name('Sheet4')\n", 181 | " # sheet5 = data.sheet_by_name('Sheet5')\n", 182 | "\n", 183 | " #训练集\n", 184 | " AT_tran = sheet1.col_values(0)[1:1000]# + sheet2.col_values(0) + sheet3.col_values(0) \n", 185 | " V_tran = sheet1.col_values(1)[1:1000] #+ sheet2.col_values(1) + sheet3.col_values(1) \n", 186 | " AP_tran = sheet1.col_values(2)[1:1000] #+ sheet2.col_values(2) + sheet3.col_values(2) \n", 187 | " RH_tran = sheet1.col_values(3)[1:1000] #+ sheet2.col_values(3) + sheet3.col_values(3) \n", 188 | " PE_tran = sheet1.col_values(4)[1:1000] #+ sheet2.col_values(4) + sheet3.col_values(4) \n", 189 | "\n", 190 | " #测试集\n", 191 | " AT_test = sheet4.col_values(0)[1:1000] #+ sheet5.col_values(0)\n", 192 | " V_test = sheet4.col_values(1)[1:1000] #+ sheet5.col_values(1)\n", 193 | " AP_test = sheet4.col_values(2)[1:1000] #+ sheet5.col_values(2)\n", 194 | " RH_test = sheet4.col_values(3)[1:1000] #+ sheet5.col_values(3)\n", 195 | " PE_test = sheet4.col_values(4)[1:1000] #+ sheet5.col_values(4)\n", 196 | "\n", 197 | " tran = {'AT':AT_tran,'V':V_tran,'AP':AP_tran,'RH':RH_tran,'PE':PE_tran}\n", 198 | " test = {'AT':AT_test,'V':V_test,'AP':AP_test,'RH':RH_test,'PE':PE_test}\n", 199 | "\n", 200 | " return tran, test\n", 201 | "\n", 202 | "def get_kernelRidge_error(tranData, testData, name,evaluation): \n", 203 | " error = {}\n", 204 | " f = GridSearchCV(KernelRidge(kernel='rbf', gamma=0.1), cv=5,\n", 205 | " param_grid={\"alpha\": [1e0, 0.1, 1e-2, 1e-3],\n", 206 | " \"gamma\": np.logspace(-2, 2, 5)})\n", 207 | " print(name)\n", 208 | " Y = tranData['PE']\n", 209 | " Y1 =testData['PE']\n", 210 | " for i in name:\n", 211 | "\n", 212 | " X = tranData[i]\n", 213 | " X1 = testData[i]\n", 214 | "\n", 215 | " f.fit(X, Y)\n", 216 | "\n", 217 | " error[i+\"训练误差\"]=evaluation(Y,f.predict(X))\n", 218 | " print(i+\"训练误差:\", str(error[i+\"训练误差\"]))\n", 219 | " error[i+\"测试误差\"]= evaluation(Y1, f.predict(X1))\n", 220 | " print(i+\"测试误差:\", error[i+\"测试误差\"])\n", 221 | "\n", 222 | " return error\n", 223 | "\n", 224 | "def get_svr_error(tranData, testData, name,evaluation):\n", 225 | " error = {}\n", 226 | " f = GridSearchCV(SVR(kernel='rbf', gamma=0.1), cv=5,\n", 227 | " param_grid={\"C\": [1e0, 1e1, 1e2, 1e3],\n", 228 | " \"gamma\": np.logspace(-2, 2, 5)})\n", 229 | " print(name)\n", 230 | " Y = tranData['PE']\n", 231 | " Y1 =testData['PE']\n", 232 | " for i in name:\n", 233 | "\n", 234 | " X = tranData[i]\n", 235 | " X1 = testData[i]\n", 236 | "\n", 237 | " f.fit(X, Y)\n", 238 | "\n", 239 | " error[i+\"训练误差\"]=evaluation(Y,f.predict(X))\n", 240 | " print(i+\"训练误差:\", str(error[i+\"训练误差\"]))\n", 241 | " error[i+\"测试误差\"]= evaluation(Y1, f.predict(X1))\n", 242 | " print(i+\"测试误差:\", error[i+\"测试误差\"])\n", 243 | "\n", 244 | " return error\n", 245 | "\n", 246 | "def getResultError(tran, test, get_error , errFunc):\n", 247 | "\n", 248 | " name1 = ['AT', 'V', 'AP', 'RH']\n", 249 | " tran1 = {'AT':[[x] for x in tran['AT']], 'V':[[x] for x in tran['V']], 'AP':[[x] for x in tran['AP']],'RH':[[x] for x in tran['RH']], 'PE':[x for x in tran['PE']]}\n", 250 | " test1 = {'AT':[[x] for x in test['AT']], 'V':[[x] for x in test['V']], 'AP':[[x] for x in test['AP']],'RH':[[x] for x in test['RH']], 'PE':[x for x in test['PE']]}\n", 251 | " error1 = get_error(tran1, test1, name1, errFunc)\n", 252 | "\n", 253 | " #数据子集有两个属性\n", 254 | " tran2 = {'AT-V':[[x, y] for x, y in zip(tran['AT'], tran['V'])],'AT-AP':[[x, y] for x, y in zip(tran['AT'], tran['AP'])], 'AT-RH':[[x, y] for x, y in zip(tran['AT'], tran['RH'])], 'V-AP':[[x, y] for x, y in zip(tran['V'], tran['AP'])], 'V-RH':[[x, y] for x, y in zip(tran['V'], tran['AP'])] ,'PE':[x for x in tran['PE']]}\n", 255 | " test2 = {'AT-V': [[x, y] for x, y in zip(test['AT'],test['V'])],'AT-AP':[[x, y] for x, y in zip(test['AT'], test['AP'])], 'AT-RH': [[x, y] for x, y in zip(test['AT'], test['RH'])], 'V-AP':[[x, y ] for x, y in zip(test['V'], test['AP'])], 'V-RH':[[x, y] for x, y in zip(test['V'], test['AP'])],'PE': [x for x in test['PE']]}\n", 256 | "\n", 257 | " name2 = [ 'AT-V', 'AT-AP', 'AT-RH', 'V-AP', 'V-RH']\n", 258 | " error2 = get_error(tran2, test2, name2,errFunc)\n", 259 | "\n", 260 | " #数据子集有三个属性\n", 261 | " tran3 = {'AT-V-AP':[[x, y, z] for x, y, z in zip(tran['AT'], tran['V'] , tran['AP'])],'AT-V-RH':[[x, y, z] for x, y, z in zip(tran['AT'], tran['V'], tran['RH'])], 'V-AP-RH':[[x, y, z] for x, y, z in zip(tran['V'], tran['AP'], tran['RH'])], 'PE':[x for x in tran['PE']]}\n", 262 | " test3 = {'AT-V-AP':[[x, y, z] for x, y, z in zip(test['AT'],test['V'] , test['AP'])],'AT-V-RH':[[x, y, z] for x, y, z in zip(test['AT'],test['V'], test['RH'])], 'V-AP-RH':[[x, y, z] for x, y, z in zip(test['V'], test['AP'], test['RH'])], 'PE':[x for x in test['PE']]}\n", 263 | " name3 = [ 'AT-V-AP', 'AT-V-RH', 'V-AP-RH' ]\n", 264 | " error3 = get_error(tran3, test3, name3, errFunc)\n", 265 | "\n", 266 | " #数据子集有四个属性\n", 267 | " tran4 = {'AT-V-AP-RH':[[x, y, z, w] for x, y, z, w in zip(tran['AT'], tran['V'] , tran['AP'], tran['RH'])], 'PE':[x for x in tran['PE']]}\n", 268 | " test4 = {'AT-V-AP-RH':[[x, y, z, w] for x, y, z, w in zip(tran['AT'],test['V'] , test['AP'], test['RH'])], 'PE':[x for x in test['PE']]}\n", 269 | " name4 = [ 'AT-V-AP-RH' ]\n", 270 | " error4 = get_error(tran4, test4, name4,errFunc)\n", 271 | "\n", 272 | " finalError = {1:error1, 2:error2, 3:error3, 4:error4}\n", 273 | " return finalError\n", 274 | "\n", 275 | "if __name__ == '__main__':\n", 276 | "\n", 277 | " tran, test = getData()\n", 278 | "\n", 279 | " print(\"================核脊回归=================\")\n", 280 | " print(\"××××××××××××××××平均绝对偏差*****************\")\n", 281 | " linearAbsoluteError = getResultError(tran, test, get_kernelRidge_error, mean_absolute_error)\n", 282 | " print(\"******************均方差********************\")\n", 283 | " linearSquareError = getResultError(tran, test,get_kernelRidge_error, mean_squared_error)\n", 284 | " print (\"================核脊回归=================\")\n", 285 | "\n", 286 | " print(\"================svr回归=================\")\n", 287 | " print(\"××××××××××××××××平均绝对偏差*****************\")\n", 288 | " linearAbsoluteError = getResultError(tran, test, get_svr_error, mean_absolute_error)\n", 289 | " print (\"******************均方差********************\")\n", 290 | " linearSquareError = getResultError(tran, test,get_svr_error, mean_squared_error)\n", 291 | " print(\"================svr回归=================\")" 292 | ] 293 | } 294 | ], 295 | "metadata": { 296 | "kernelspec": { 297 | "display_name": "Python 3", 298 | "language": "python", 299 | "name": "python3" 300 | }, 301 | "language_info": { 302 | "codemirror_mode": { 303 | "name": "ipython", 304 | "version": 3 305 | }, 306 | "file_extension": ".py", 307 | "mimetype": "text/x-python", 308 | "name": "python", 309 | "nbconvert_exporter": "python", 310 | "pygments_lexer": "ipython3", 311 | "version": "3.6.3" 312 | } 313 | }, 314 | "nbformat": 4, 315 | "nbformat_minor": 2 316 | } 317 | -------------------------------------------------------------------------------- /流程: -------------------------------------------------------------------------------- 1 | 源数据集 2 | 来源:http://archive.ics.uci.edu/ml/machine-learning-databases/00294 3 | 该数据集包含了从一个联合循环发电厂收集的9568个数据点,这些数据点在6年(2006-2011年)中收集,当时电厂被设置为满负荷运转。特征包括小时平均环境变量温度(AT)、环境压力(AP)、相对湿度(RH)和排气真空(V),以预测工厂的每小时电力输出(EP)。 4 | 数据:数据中给的变量有五个,如下: 5 |   (1)环境温度(AT):单位:摄氏度; 变化范围:1.81℃-37.11℃ 6 |   (2)大气压(AP):单位:毫巴; 变化范围:992.89-1033.30 mbar 7 |   (3)湿度(RH):单位:百分比; 变化范围:25.56%-100.16% 8 |   (4)蒸汽压力(V):单位:cm Hg; 变化范围:25.36-81.56 cm Hg 9 |   (5)全负载电力输出(PE):单位:兆瓦特 变化范围:420.26-495.76 MW 10 | 其中(1)-(4)是输入变量,(5)为需要预测的变量 11 | 数据分析流程: 12 | 数据预处理:是在数据分析和挖掘中的一个必要的步骤,预处理的好坏甚至关系到最终建模的好坏。包括数据清洗,数据整合,数据转换,数据降维。这些操作在机器学习中提高模型的准确度。数据集可能有成百上千维,这些特征有的是不相关。 13 | 数据读取 14 | 统计分析 15 | 数据描述 16 | 数据可视化 17 | 回归拟合 18 | 子集和回归方法选择 19 | 误差分析 20 | 选出最优模型 21 | 22 | --------------------------------------------------------------------------------