bigdata/day7-1/随机森林算法.ipynb

437 lines
76 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \\\n",
"0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 \n",
"1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 \n",
"2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 \n",
"3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 \n",
"4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 \n",
"\n",
" PTRATIO B LSTAT MEDV \n",
"0 15.3 396.90 4.98 24.0 \n",
"1 17.8 396.90 9.14 21.6 \n",
"2 17.8 392.83 4.03 34.7 \n",
"3 18.7 394.63 2.94 33.4 \n",
"4 18.7 396.90 5.33 36.2 \n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"df = pd.read_csv(\"housing.csv\", index_col=0)\n",
"print(df.head())"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:18:54.711443Z",
"start_time": "2024-03-06T03:18:54.200586Z"
}
},
"id": "4c0015609de45350",
"execution_count": 1
},
{
"cell_type": "code",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" CRIM ZN INDUS CHAS NOX RM \\\n",
"count 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 \n",
"mean 3.613524 11.363636 11.136779 0.069170 0.554695 6.284634 \n",
"std 8.601545 23.322453 6.860353 0.253994 0.115878 0.702617 \n",
"min 0.006320 0.000000 0.460000 0.000000 0.385000 3.561000 \n",
"25% 0.082045 0.000000 5.190000 0.000000 0.449000 5.885500 \n",
"50% 0.256510 0.000000 9.690000 0.000000 0.538000 6.208500 \n",
"75% 3.677083 12.500000 18.100000 0.000000 0.624000 6.623500 \n",
"max 88.976200 100.000000 27.740000 1.000000 0.871000 8.780000 \n",
"\n",
" AGE DIS RAD TAX PTRATIO B \\\n",
"count 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 \n",
"mean 68.574901 3.795043 9.549407 408.237154 18.455534 356.674032 \n",
"std 28.148861 2.105710 8.707259 168.537116 2.164946 91.294864 \n",
"min 2.900000 1.129600 1.000000 187.000000 12.600000 0.320000 \n",
"25% 45.025000 2.100175 4.000000 279.000000 17.400000 375.377500 \n",
"50% 77.500000 3.207450 5.000000 330.000000 19.050000 391.440000 \n",
"75% 94.075000 5.188425 24.000000 666.000000 20.200000 396.225000 \n",
"max 100.000000 12.126500 24.000000 711.000000 22.000000 396.900000 \n",
"\n",
" LSTAT MEDV \n",
"count 506.000000 506.000000 \n",
"mean 12.653063 22.532806 \n",
"std 7.141062 9.197104 \n",
"min 1.730000 5.000000 \n",
"25% 6.950000 17.025000 \n",
"50% 11.360000 21.200000 \n",
"75% 16.955000 25.000000 \n",
"max 37.970000 50.000000 \n"
]
}
],
"source": [
"print(df.describe())"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:18:54.727227Z",
"start_time": "2024-03-06T03:18:54.711950Z"
}
},
"id": "6c55100639c9d85e",
"execution_count": 2
},
{
"cell_type": "code",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Index: 506 entries, 0 to 505\n",
"Data columns (total 14 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 CRIM 506 non-null float64\n",
" 1 ZN 506 non-null float64\n",
" 2 INDUS 506 non-null float64\n",
" 3 CHAS 506 non-null float64\n",
" 4 NOX 506 non-null float64\n",
" 5 RM 506 non-null float64\n",
" 6 AGE 506 non-null float64\n",
" 7 DIS 506 non-null float64\n",
" 8 RAD 506 non-null float64\n",
" 9 TAX 506 non-null float64\n",
" 10 PTRATIO 506 non-null float64\n",
" 11 B 506 non-null float64\n",
" 12 LSTAT 506 non-null float64\n",
" 13 MEDV 506 non-null float64\n",
"dtypes: float64(14)\n",
"memory usage: 59.3 KB\n",
"None\n"
]
}
],
"source": [
"print(df.info())"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:18:54.734901Z",
"start_time": "2024-03-06T03:18:54.728251Z"
}
},
"id": "c9319c992f5c6f30",
"execution_count": 3
},
{
"cell_type": "code",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(506, 14)\n"
]
}
],
"source": [
"print(df.shape)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:18:54.739433Z",
"start_time": "2024-03-06T03:18:54.736104Z"
}
},
"id": "8c20ce0d79b70fbb",
"execution_count": 4
},
{
"cell_type": "code",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CRIM 0\n",
"ZN 0\n",
"INDUS 0\n",
"CHAS 0\n",
"NOX 0\n",
"RM 0\n",
"AGE 0\n",
"DIS 0\n",
"RAD 0\n",
"TAX 0\n",
"PTRATIO 0\n",
"B 0\n",
"LSTAT 0\n",
"MEDV 0\n",
"dtype: int64\n"
]
}
],
"source": [
"print(df.isnull().sum())"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:18:54.743652Z",
"start_time": "2024-03-06T03:18:54.740438Z"
}
},
"id": "45c58fbc17b5ceed",
"execution_count": 5
},
{
"cell_type": "code",
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"\n",
"X = df.drop(\"MEDV\", axis=1)\n",
"y = df[\"MEDV\"]\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2024)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:18:55.531510Z",
"start_time": "2024-03-06T03:18:54.744931Z"
}
},
"id": "15fedeb2bf70d22c",
"execution_count": 6
},
{
"cell_type": "code",
"outputs": [
{
"data": {
"text/plain": "RandomForestRegressor(max_depth=6, random_state=2024)",
"text/html": "<style>#sk-container-id-1 {\n /* Definition of color scheme common for light and dark mode */\n --sklearn-color-text: black;\n --sklearn-color-line: gray;\n /* Definition of color scheme for unfitted estimators */\n --sklearn-color-unfitted-level-0: #fff5e6;\n --sklearn-color-unfitted-level-1: #f6e4d2;\n --sklearn-color-unfitted-level-2: #ffe0b3;\n --sklearn-color-unfitted-level-3: chocolate;\n /* Definition of color scheme for fitted estimators */\n --sklearn-color-fitted-level-0: #f0f8ff;\n --sklearn-color-fitted-level-1: #d4ebff;\n --sklearn-color-fitted-level-2: #b3dbfd;\n --sklearn-color-fitted-level-3: cornflowerblue;\n\n /* Specific color for light theme */\n --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n --sklearn-color-icon: #696969;\n\n @media (prefers-color-scheme: dark) {\n /* Redefinition of color scheme for dark theme */\n --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n --sklearn-color-icon: #878787;\n }\n}\n\n#sk-container-id-1 {\n color: var(--sklearn-color-text);\n}\n\n#sk-container-id-1 pre {\n padding: 0;\n}\n\n#sk-container-id-1 input.sk-hidden--visually {\n border: 0;\n clip: rect(1px 1px 1px 1px);\n clip: rect(1px, 1px, 1px, 1px);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n}\n\n#sk-container-id-1 div.sk-dashed-wrapped {\n border: 1px dashed var(--sklearn-color-line);\n margin: 0 0.4em 0.5em 0.4em;\n box-sizing: border-box;\n padding-bottom: 0.4em;\n background-color: var(--sklearn-color-background);\n}\n\n#sk-container-id-1 div.sk-container {\n /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n but bootstrap.min.css set `[hidden] { display: none !important; }`\n so we also need the `!important` here to be able to override the\n default hidden behavior on the sphinx rendered scikit-learn.org.\n See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n display: inline-block !important;\n position: relative;\n}\n\n#sk-container-id-1 div.sk-text-repr-fallback {\n display: none;\n}\n\ndiv.sk-parallel-item,\ndiv.sk-serial,\ndiv.sk-item {\n /* draw centered vertical line to link estimators */\n background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n background-size: 2px 100%;\n background-repeat: no-repeat;\n background-position: center center;\n}\n\n/* Parallel-specific style estimator block */\n\n#sk-container-id-1 div.sk-parallel-item::after {\n content: \"\";\n width: 100%;\n border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n flex-grow: 1;\n}\n\n#sk-container-id-1 div.sk-parallel {\n display: flex;\n align-items: stretch;\n justify-content: center;\n background-color: var(--sklearn-color-background);\n position: relative;\n}\n\n#sk-container-id-1 div.sk-parallel-item {\n display: flex;\n flex-direction: column;\n}\n\n#sk-container-id-1 div.sk-parallel-item:first-child::after {\n align-self: flex-end;\n width: 50%;\n}\n\n#sk-container-id-1 div.sk-parallel-item:last-child::after {\n align-self: flex-start;\n width: 50%;\n}\n\n#sk-container-id-1 div.sk-parallel-item:only-child::after {\n width: 0;\n}\n\n/* Serial-specific style estimator block */\n\n#sk-container-id-1 div.sk-serial {\n display: flex;\n flex-direction: column;\n align-items: center;\n background-color: var(--sklearn-color-background);\n padding-right: 1em;\n padding-left: 1em;\n}\n\n\n/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\nclickable and can be expanded/collapsed.\n- Pipeline and ColumnTransformer use this feature and define the default style\n- Estimators will overwrite some part of the style using the `sk-estimator` class\n*/\n\n/* Pipeline and ColumnTransformer style (default) */\n\n#sk-container-id-1 div.sk-toggleable {\n /* Default theme specific background. It is overwritten whether we have a\n specific estimator or a Pipeline/ColumnTransformer */\n background-color: var(--sklearn-color-background);\n}\n\n/* Toggleable label */\n#sk-container-id-1 label.sk-toggleable__label {\n cursor: pointer;\n display: block;\n width: 100%;\n margin-bottom: 0;\n padding: 0.5em;\n box-sizing: border-box;\n text-align: center;\n}\n\n#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n /* Arrow on the left of the label */\n content: \"▸\";\n float: left;\n margin-right: 0.25em;\n color: var(--sklearn-color-icon);\n}\n\n#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n color: var(--sklearn-color-text);\n}\n\n/* Toggleable content - dropdown */\n\n#sk-container-id-1 div.sk-toggleable__content {\n max-height: 0;\n max-width: 0;\n overflow: hidden;\n text-align: left;\n /* unfitted */\n background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-1 div.sk-toggleable__content.fitted {\n /* fitted */\n background-color: var(--sklearn-color-fitted-level-0);\n}\n\n#sk-container-id-1 div.sk-toggleable__content pre {\n margin: 0.2em;\n border-radius: 0.25em;\n color: var(--sklearn-color-text);\n /* unfitted */\n background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n /* unfitted */\n background-color: var(--sklearn-color-fitted-level-0);\n}\n\n#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n /* Expand drop-down */\n max-height: 200px;\n max-width: 100%;\n overflow: auto;\n}\n\n#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n content: \"▾\";\n}\n\n/* Pipeline/ColumnTransformer-specific style */\n\n#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n color: var(--sklearn-color-text);\n background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Estimator-specific style */\n\n/* Colorize estimator box */\n#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n /* unfitted */\n background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n /* fitted */\n background-color: var(--sklearn-color-fitted-level-2);\n}\n\n#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n#sk-container-id-1 div.sk-label label {\n /* The background is the default theme color */\n color: var(--sklearn-color-text-on-default-background);\n}\n\n/* On hover, darken the color of the background */\n#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n color: var(--sklearn-color-text);\n background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n/* Label box, darken color on hover, fitted */\n#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n color: var(--sklearn-color-text);\n background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Estimator label */\n\n#sk-container-id-1 div.sk-label label {\n font-family: monospace;\n font-weight: bold;\n display: inline-block;\n line-height: 1.2em;\n}\n\n#sk-container-id-1 div.sk-label-container {\n text-align: center;\n}\n\n/* Estimator-specific */\n#sk-container-id-1 div.sk-estimator {\n font-family: monospace;\n border: 1px dotted var(--sklearn-color-border-box);\n border-radius: 0.25em;\n box-sizing: border-box;\n margin-bottom: 0.5em;\n /* unfitted */\n background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-1 div.sk-estimator.fitted {\n /* fitted */\n background-color: var(--sklearn-color-fitted-level-0);\n}\n\n/* on hover */\n#sk-container-id-1 div.sk-estimator:hover {\n /* unfitted */\n background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-1 div.sk-estimator.fitted:hover {\n /* fitted */\n background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Specification for estimator info (e.g. \"i\" and \"?\") */\n\n/* Common style for \"i\" and \"?\" */\n\n.sk-estimator-doc-link,\na:link.sk-estimator-doc-link,\na:visited.sk-estimator-doc-link {\n float: right;\n font-size: smaller;\n line-height: 1em;\n font-family: monospace;\n background-color: var(--sklearn-color-background);\n border-radius: 1em;\n height: 1em;\n width: 1em;\n text-decoration: none !important;\n margin-left: 1ex;\n /* unfitted */\n border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n color: var(--sklearn-color-unfitted-level-1);\n}\n\n.sk-estimator-doc-link.fitted,\na:link.sk-estimator-doc-link.fitted,\na:visited.sk-estimator-doc-link.fitted {\n /* fitted */\n border: var(--sklearn-color-fitted-level-1) 1pt solid;\n color: var(--sklearn-color-fitted-level-1);\n}\n\n/* On hover */\ndiv.sk-estimator:hover .sk-estimator-doc-link:hover,\n.sk-estimator-doc-link:hover,\ndiv.sk-label-container:hover .sk-estimator-doc-link:hover,\n.sk-estimator-doc-link:hover {\n /* unfitted */\n background-color: var(--sklearn-color-unfitted-level-3);\n color: var(--sklearn-color-background);\n text-decoration: none;\n}\n\ndiv.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n.sk-estimator-doc-link.fitted:hover,\ndiv.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n.sk-estimator-doc-link.fitted:hover {\n /* fitted */\n background-color: var(--sklearn-color-fitted-level-3);\n color: var(--sklearn-color-background);\n text-decoration: none;\n}\n\n/* Span, style for the box shown on hovering the info icon */\n.sk-estimator-doc-link span {\n display: none;\n z-index: 9999;\n position: relative;\n font-weight: normal;\n right: .2ex;\n padding: .5ex;\n margin: .5ex;\n width: min-content;\n min-width: 20ex;\n max-width: 50ex;\n color: var(--sklearn-color-text);\n box-shadow: 2pt 2pt 4pt #999;\n /* unfitted */\n background: var(--sklearn-color-unfitted-level-0);\n border: .5pt solid var(--sklearn-color-unfitted-level-3);\n}\n\n.sk-estimator-doc-link.fitted span {\n /* fitted */\n background: var(--sklearn-color-fitted-level-0);\n border: var(--sklearn-color-fitted-level-3);\n}\n\n.sk-estimator-doc-link:hover span {\n display: block;\n}\n\n/* \"?\"-specific style due to the `<a>` HTML tag */\n\n#sk-container-id-1 a.estimator_doc_link {\n float: right;\n font-size: 1rem;\n line-height: 1em;\n font-family: monospace;\n background-color: var(--sklearn-color-background);\n border-radius: 1rem;\n height: 1rem;\n width: 1rem;\n text-decoration: none;\n /* unfitted */\n color: var(--sklearn-color-unfitted-level-1);\n border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n}\n\n#sk-container-id-1 a.estimator_doc_link.fitted {\n /* fitted */\n border: var(--sklearn-color-fitted-level-1) 1pt solid;\n color: var(--sklearn-color-fitted-level-1);\n}\n\n/* On hover */\n#sk-container-id-1 a.estimator_doc_link:hover {\n /* unfitted */\n background-color: var(--sklearn-color-unfitted-level-3);\n color: var(--sklearn-color-background);\n text-decoration: none;\n}\n\n#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n /* fitted */\n background-color: var(--sklearn-color-fitted-level-3);\n}\n</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestRegressor(max_depth=6, random_state=2024)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestRegressor<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.ensemble.RandomForestRegressor.html\">?<span>Documentation for RandomForestRegressor</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestRegressor(max_depth=6, random_state=2024)</pre></div> </div></div></div></div>"
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.ensemble import RandomForestRegressor\n",
"\n",
"model = RandomForestRegressor(n_estimators=100, max_depth=6, random_state=2024)\n",
"model.fit(X_train, y_train)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:18:55.803816Z",
"start_time": "2024-03-06T03:18:55.532770Z"
}
},
"id": "cc722ca1dac92ff0",
"execution_count": 7
},
{
"cell_type": "code",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"MAE: 2.360987831933965\n",
"MSE: 11.83689801907074\n",
"RMSE: 3.4404793298420993\n",
"MAPE: 0.11177831373027898\n",
"R2: 0.8764563141356582\n"
]
}
],
"source": [
"import numpy as np\n",
"from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score, mean_absolute_percentage_error\n",
"\n",
"y_pred = model.predict(X_test)\n",
"mae = mean_absolute_error(y_test, y_pred)\n",
"mse = mean_squared_error(y_test, y_pred)\n",
"rmse = np.sqrt(mse)\n",
"mape = mean_absolute_percentage_error(y_test, y_pred)\n",
"score = r2_score(y_test, y_pred)\n",
"\n",
"print('MAE:', mae)\n",
"print('MSE:', mse)\n",
"print('RMSE:', rmse)\n",
"print('MAPE:', mape)\n",
"print('R2:', score)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:18:55.813805Z",
"start_time": "2024-03-06T03:18:55.804852Z"
}
},
"id": "eee939d46dd4ba6f",
"execution_count": 8
},
{
"cell_type": "code",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'max_depth': 7, 'n_estimators': 300}\n",
"MAE: 2.304977551659471\n",
"MSE: 11.68289040277714\n",
"RMSE: 3.4180243420398777\n",
"MAPE: 0.107817485068887\n",
"R2: 0.8780637174044401\n"
]
},
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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q9WqQYMGKTc3twIqDSxl6dexY8eqc+fOGjJkiJo3b66ffvqpAioNLGX9d0CSjh8/roYNGyo7O9t3BQaosvRrXFycLBaLZxsxYkQFVBo4CFBl4Ha7NWDAAF199dXauHGjsrKylJKSUuI127dv19ChQ/Xcc89p+fLlmjhxonbu3FkxBQeAsvSpJP3www8aNGiQ3G6374sMQGXp148++kgfffSR/v3vf2vHjh368ccfNWXKlIopOECUpV/T09P15Zdfas+ePfr5559144030q//R1n/HTjrqaee0n//+1/fFRigytKveXl52r17tw4fPiyHwyGHw6EZM2ZUTMGBwoBpixcvNmrXrm2cPHnSMAzDyMzMNLp3717iNWPGjDH69u3r2Z8+fbrx17/+1ad1BpKy9OmJEyeMpk2bGs8//7zRrFmzCqgy8JSlX5OTk421a9d69idOnGjcfPPNPq0z0JSlX9euXWukp6d79t98802jf//+Pq0z0JSlX89avXq1Ub9+faNu3brG3r17fVhl4ClLv65Zs8aIj4+viPICFiNQZbBlyxbFx8crPDxc0plhzqysrItek5CQ4Nnv0qWLfvjhB5/WGUjK0qehoaFau3atevbsWRElBqSy9OuECRPUrVs3z/7OnTvVunVrn9YZaMrSr926ddP1118vSTp69KjmzJmjQYMG+bzWQFKWfpXOjLA8/PDDeuutt1SrVi1flxlwytKv33//vfbv36/LLrtMdrtdo0aNYqT//yBAlYHL5VLz5s09+xaLRcHBwXI4HKW+JioqSgcPHvRpnYGkLH0aFhamxo0bV0R5Aass/fp7P//8sxYvXqyHHnrIVyUGpEvp1/fee09NmzbV5ZdfrgcffNCXZQacsvbryy+/rDZt2ujuu+/2dYkBqSz9unPnTvXo0UNr1qzR8uXLlZaWpmnTplVEuQGDAFUGISEh5yx3X6NGDeXl5ZX6mou1r27K0qe4uEvp1+LiYj344IMaMWKErrzySl+VGJAupV8feOABffzxx9qxY4dmzpzpqxIDUln69ccff9Q777yjv/3tb74uL2CVpV/feecdLViwQG3btlXXrl01ceJELVy40NelBhQCVBnUqVNHR44c8TqWm5ursLCwUl9zsfbVTVn6FBd3Kf36wgsv6LffftNrr73mq/IC1qX0q9VqVf/+/fX888/r/fff91WJAclsvxqGoYceekgvvviiGjVqVBElBqTy+Pe1fv36OnDgQHmXFtAIUGVw7bXX6rvvvvPs7927V263W3Xq1Cn1NZs3b+bjp98pS5/i4srar1988YWmTp2qRYsWeeZN4H+VpV/ffPNN/eMf//Dsh4WFKTg42Kd1Bhqz/bpv3z6tWbNGTz31lOx2u+x2u/bt26e4uDivvq7uyvL3tVu3bsrJyfHsf/fdd2rWrJlP6ww4/p7FHogKCwuNyy67zJgzZ45hGIYxYsQIz7dpHA6Hcfr06XOuyczMNCIiIoytW7caubm5RqdOnYzXX3+9QuuuzMrSp2d9/fXXfAvvAsrSr1lZWUZERITxwQcfGLm5uUZubq7n2zs4oyz9umTJEuOyyy4zVq1aZfz0009Gx44djSlTplRo3ZWd2X4tLCw09u7d67U1btzY+Oabb4zc3NwKr7+yKsvf1+HDhxs333yzsW7dOiMlJcWIiIgwUlJSKrTuyo4AVUaff/65ER4ebtStW9e47LLLjB07dhiGYRiSjM2bN5/3mmeeecYICwszoqKijKuvvtrIy8urwIorv7L0qWEQoC7GbL8+8cQThiSvjf49V1n+vr7xxhtGw4YNjXr16hkTJkwwioqKKrDiwFDWfwfOatasGcsYnIfZfnU4HMbAgQONmjVrGs2aNTNmzZpVwRVXfhbDMLHMK7z897//1Q8//KD4+HjVrVu3VNdkZWXpwIEDuv7665nfcx5l6VNcHP3qG/Srb9CvvkG/li8CFAAAgElMIgcAADCJAAUAAGASAQoAAMAkAhSAaqO8fn8yPz9fP/74oxYuXKhFixZ5nSsoKCj1b4ZdrK1hGPrkk0909OjRS6oXQPkL8XcBAFAWPXv21JNPPqnBgwd7jq1atUrPPfecvv3223Par1mzRn/4wx+Unp6ujh07KjQ0VEFB3v8PWVxcrMLCQtlsNknSwYMHNWLECOXn5ysvL0/Hjx/XkSNHFB4eriZNmqhBgwaKjo7WTTfdpIiICEnSnDlzNH36dNWoUUOSdOzYMZ08eVJNmzbV0aNH5Xa7PYvout1uDR06VM8+++x5n9FisSg5OVm//PKLnnnmmUvvNADlhm/hAQgoSUlJ6t27t1544QVNmDBBN9xwgyZNmqSUlBQVFBTI4XDo8ssvV3Fxsf70pz8pKSlJLpdL11xzjQYPHqwpU6aoY8eO+uWXXxQUFCS32y2LxaKwsDAVFxerffv2XiNVmZmZioqKUp06dWSz2dS8eXMtXLhQ11xzTanqfeedd7Ru3TqlpKRo5syZ2rVrl6ZPn37etqNHj9bChQu9frcsPz9fhmF4VoR3u92qXbu2srKyyt6JAC4ZAQpAQLniiiv04Ycf6plnntGECRPUq1cvud1uBQUF6YcfftCECROUnp6u4uJinT59WgUFBbr11lsVFhampUuXnvPzKcOGDVOTJk304osveh3/5JNP9Nhjj53zUzb79+9X/fr1vdZxKywsVMuWLZWRkSFJWrx4sZ588klJZ35zzO12q169esrNzVVhYaHnJzT++Mc/KikpyXOfUaNGqXXr1ho7dqx+++03paam6p577pEkHT16VJ999plGjBhRTj0J4FIwBwpAwMjPz9cvv/yihIQErVy5Un379tW9994rq9Wq0NBQr7ZBQUEKCwvTN998o8OHD+tf//qXhg8frg8++KBUr3XnnXfq8OHDys7O9tqaNGmiJUuWeB07cOCAJzxJZ+Y2xcbGKjs7Wy+99JLuuOMOZWdnKykpSQ8++KCys7M1bNgwnTx58pzXtVgsys/P18GDB/X00097jh8+fFiTJk1ScXGx8vPzy9iDAMoLc6AABIwNGzaoe/fuSk9P10033aQJEyaoe/fuuuyyy2S1WlVcXCyn06mmTZt6gsj06dO1ceNGZWRkaNWqVSXOJTIMQ8XFxV6jVK+++qqef/55z35eXp7+8Ic/eOZP2e127d+/v1yezzAMnT59Wh07dpTFYtF///tfderUSdKZj+6OHDmiTp06KSwsTBs3biyX1wRQNgQoAAHDarVqyJAhXsdCQ0O1f/9+r3lDkydPVo0aNfT000/LMAzt3r1b999/v1544QW1adNG8+fP13vvvecZNXr99dc1c+ZMnTp1Svfff7/ee+89r9e466679PLLL0s688v2s2fPVseOHZWTk6P+/fufU2d4eLiys7MVGxsrSXI4HLryyitlsVgkyXP8/z7LqVOnVKtWLf3888/KysrSjTfeqIULF0qS9uzZoxEjRmjr1q1l7j8A5YcABSBgdO3aVV27dvXsL1u2TBkZGfrLX/4iwzA8AeWsoqIi7du3T71791ZISIhn1Oj//g7l+PHjz5kDdZbFYtHChQu1atUqSdKvv/6qP/3pTwoLC1NBQcE5r5mfn69+/fppwIABnv1rr71Wjz32mEaNGuXVtrCwUEePHlW9evUkSSdPnvT8RllUVJQGDhzoNeF86NChpeonAL5HgAIQMAoLC/X9999r0aJFWrdundxutxITE9WzZ0/t2rXLE5Dy8vJksVg0ZcoUvfbaaxowYIAOHjzouU9wcPA5SxiU9JqxsbG69dZbJUmvvPKKbr/9djVu3Fi//vqrPvroI6/2Xbp0kdPp9Nx///79stlseuWVV/TKK6/oyJEjCgsLk81mU3Fxsdxutw4dOiTpzI+9NmrUSPfff7++++47SVKtWrU893a5XLr88ss1ZsyYMvYggPJCgAIQMI4cOaJnnnlGd955p6644gpNmjRJvXr1Uq9evbR27Vr16tVL0v9+hDdhwgQZhqGCggLdfffdZXrNQYMGqU2bNp790NBQRUdHq0WLFmrVqpUSEhK82m/bts3z5+nTp2v27Nlas2aN7Ha79u7dq+uuu06rV6/2uudZu3btUpMmTTR//ny5XC5de+21+uCDD9SxY0ctWrRIzz//vB555JEyPQeA8kWAAhAwGjVqpNWrV0uSvvzyS8/x4uJiDRs2TB988IGuv/56r2ssFovX/Cgzdu/erVtvvVW1atXy3MPpdGr+/PmehTNPnjypxYsXKyUlxevao0eP6ocffpDb7VbXrl3Vu3dvrV69Ws8///x5w9OPP/4owzAUExMj6cxHeO+9955uu+02Pfnkk3rrrbeUlpZW5mcBUL4IUAACUnFxsc4uY1ejRg3NmTNHderUkWEYOnHihGrWrOnVvqCgQKdPn1ZeXp6Ki4vPe8+ioiK53W7VqFFDQUFBatmypX755RevNjExMZo7d+5FF9KsV6+e5s+frwMHDmjGjBn629/+pm7duumZZ57Rl19+qX79+mngwIGqX7++JOm9997zzJuSpBMnTsjhcKhWrVp68skn1bdvX23dulWGYejyyy/3BDgA/kGAAhCQ8vPzvX5HLiEhQadOnVL9+vVVp06dc+Ymud1u5efnq27dup6fcbHb7Z7zM2fOVFFRkQoKCpSVlaVjx45p8ODBioiI8Fpj6vjx4xoyZIjXRPT8/Hx16tRJixYt0k8//aSnnnpKeXl5ysrKUnh4uIYMGaKffvpJDRs21IkTJ7Rs2TK9//77+vOf/6x//etfGjRokNxutx555BFP2CosLNT111+vt956S507d9ann36qBQsWaMyYMdq3b59ef/11jRs3zncdDKBErEQOoEopKio6Z7XxijZ37lw1aNBAHTp0UHR09AXbHThwwPO7eGf9fuXyC8nNzVVYWBgf5wF+RIACAAAwiZ9yAQAAMIkABQAAYBIBCgAAwCQCFAAAgEkEKAAAAJMIUAAAACYRoAAAAEwiQAEAAJhEgAIAADDp/wHUDajHksneswAAAABJRU5ErkJggg=="
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib\n",
"from sklearn.model_selection import GridSearchCV\n",
"\n",
"param_grid = {\n",
" 'n_estimators': [100, 200, 300],\n",
" 'max_depth': [5, 6, 7],\n",
"}\n",
"\n",
"grid_search = GridSearchCV(estimator=RandomForestRegressor(), param_grid=param_grid, cv=5)\n",
"grid_search.fit(X_train, y_train)\n",
"\n",
"best_params = grid_search.best_params_\n",
"\n",
"print(best_params)\n",
"\n",
"best_model = grid_search.best_estimator_\n",
"\n",
"y_pred = best_model.predict(X_test)\n",
"mae = mean_absolute_error(y_test, y_pred)\n",
"mse = mean_squared_error(y_test, y_pred)\n",
"rmse = np.sqrt(mse)\n",
"mape = mean_absolute_percentage_error(y_test, y_pred)\n",
"score = r2_score(y_test, y_pred)\n",
"\n",
"print('MAE:', mae)\n",
"print('MSE:', mse)\n",
"print('RMSE:', rmse)\n",
"print('MAPE:', mape)\n",
"print('R2:', score)\n",
"\n",
"feature_importances = best_model.feature_importances_\n",
"\n",
"import matplotlib.pyplot as plt\n",
"\n",
"matplotlib.rcParams['font.sans-serif']=['SimHei'] \n",
"matplotlib.rcParams['axes.unicode_minus']=False \n",
"plt.barh(df.drop('MEDV', axis=1).columns, feature_importances)\n",
"plt.xlabel('特征重要度')\n",
"plt.ylabel('特征')\n",
"plt.show()"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:19:05.592057Z",
"start_time": "2024-03-06T03:18:55.814817Z"
}
},
"id": "eec1271d5230fa8",
"execution_count": 9
},
{
"cell_type": "code",
"outputs": [
{
"data": {
"text/plain": "<Figure size 640x480 with 1 Axes>",
"image/png": "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"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"y_pred = best_model.predict(X_test)\n",
"\n",
"plt.plot(y_test, y_test, color='red')\n",
"plt.scatter(y_test, y_pred)\n",
"plt.xlabel('实际房价')\n",
"plt.ylabel('预测房价')\n",
"plt.show()"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:19:05.659595Z",
"start_time": "2024-03-06T03:19:05.594083Z"
}
},
"id": "b25ddc01ac3519e9",
"execution_count": 10
},
{
"cell_type": "code",
"outputs": [],
"source": [],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-06T03:19:05.662980Z",
"start_time": "2024-03-06T03:19:05.660595Z"
}
},
"id": "97587b406f77b993",
"execution_count": 10
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}