Upload folder using huggingface_hub
Browse files- Data.ipynb +568 -0
- Data/housing.csv +0 -0
- Main.ipynb +264 -0
- processed_data.csv +0 -0
Data.ipynb
ADDED
|
@@ -0,0 +1,568 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 26,
|
| 6 |
+
"metadata": {},
|
| 7 |
+
"outputs": [
|
| 8 |
+
{
|
| 9 |
+
"data": {
|
| 10 |
+
"text/html": [
|
| 11 |
+
"<div>\n",
|
| 12 |
+
"<style scoped>\n",
|
| 13 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 14 |
+
" vertical-align: middle;\n",
|
| 15 |
+
" }\n",
|
| 16 |
+
"\n",
|
| 17 |
+
" .dataframe tbody tr th {\n",
|
| 18 |
+
" vertical-align: top;\n",
|
| 19 |
+
" }\n",
|
| 20 |
+
"\n",
|
| 21 |
+
" .dataframe thead th {\n",
|
| 22 |
+
" text-align: right;\n",
|
| 23 |
+
" }\n",
|
| 24 |
+
"</style>\n",
|
| 25 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 26 |
+
" <thead>\n",
|
| 27 |
+
" <tr style=\"text-align: right;\">\n",
|
| 28 |
+
" <th></th>\n",
|
| 29 |
+
" <th>longitude</th>\n",
|
| 30 |
+
" <th>latitude</th>\n",
|
| 31 |
+
" <th>housing_median_age</th>\n",
|
| 32 |
+
" <th>total_rooms</th>\n",
|
| 33 |
+
" <th>total_bedrooms</th>\n",
|
| 34 |
+
" <th>population</th>\n",
|
| 35 |
+
" <th>households</th>\n",
|
| 36 |
+
" <th>median_income</th>\n",
|
| 37 |
+
" <th>median_house_value</th>\n",
|
| 38 |
+
" <th>ocean_proximity</th>\n",
|
| 39 |
+
" </tr>\n",
|
| 40 |
+
" </thead>\n",
|
| 41 |
+
" <tbody>\n",
|
| 42 |
+
" <tr>\n",
|
| 43 |
+
" <th>0</th>\n",
|
| 44 |
+
" <td>-122.23</td>\n",
|
| 45 |
+
" <td>37.88</td>\n",
|
| 46 |
+
" <td>41.0</td>\n",
|
| 47 |
+
" <td>880.0</td>\n",
|
| 48 |
+
" <td>129.0</td>\n",
|
| 49 |
+
" <td>322.0</td>\n",
|
| 50 |
+
" <td>126.0</td>\n",
|
| 51 |
+
" <td>8.3252</td>\n",
|
| 52 |
+
" <td>452600.0</td>\n",
|
| 53 |
+
" <td>NEAR BAY</td>\n",
|
| 54 |
+
" </tr>\n",
|
| 55 |
+
" <tr>\n",
|
| 56 |
+
" <th>1</th>\n",
|
| 57 |
+
" <td>-122.22</td>\n",
|
| 58 |
+
" <td>37.86</td>\n",
|
| 59 |
+
" <td>21.0</td>\n",
|
| 60 |
+
" <td>7099.0</td>\n",
|
| 61 |
+
" <td>1106.0</td>\n",
|
| 62 |
+
" <td>2401.0</td>\n",
|
| 63 |
+
" <td>1138.0</td>\n",
|
| 64 |
+
" <td>8.3014</td>\n",
|
| 65 |
+
" <td>358500.0</td>\n",
|
| 66 |
+
" <td>NEAR BAY</td>\n",
|
| 67 |
+
" </tr>\n",
|
| 68 |
+
" <tr>\n",
|
| 69 |
+
" <th>2</th>\n",
|
| 70 |
+
" <td>-122.24</td>\n",
|
| 71 |
+
" <td>37.85</td>\n",
|
| 72 |
+
" <td>52.0</td>\n",
|
| 73 |
+
" <td>1467.0</td>\n",
|
| 74 |
+
" <td>190.0</td>\n",
|
| 75 |
+
" <td>496.0</td>\n",
|
| 76 |
+
" <td>177.0</td>\n",
|
| 77 |
+
" <td>7.2574</td>\n",
|
| 78 |
+
" <td>352100.0</td>\n",
|
| 79 |
+
" <td>NEAR BAY</td>\n",
|
| 80 |
+
" </tr>\n",
|
| 81 |
+
" <tr>\n",
|
| 82 |
+
" <th>3</th>\n",
|
| 83 |
+
" <td>-122.25</td>\n",
|
| 84 |
+
" <td>37.85</td>\n",
|
| 85 |
+
" <td>52.0</td>\n",
|
| 86 |
+
" <td>1274.0</td>\n",
|
| 87 |
+
" <td>235.0</td>\n",
|
| 88 |
+
" <td>558.0</td>\n",
|
| 89 |
+
" <td>219.0</td>\n",
|
| 90 |
+
" <td>5.6431</td>\n",
|
| 91 |
+
" <td>341300.0</td>\n",
|
| 92 |
+
" <td>NEAR BAY</td>\n",
|
| 93 |
+
" </tr>\n",
|
| 94 |
+
" <tr>\n",
|
| 95 |
+
" <th>4</th>\n",
|
| 96 |
+
" <td>-122.25</td>\n",
|
| 97 |
+
" <td>37.85</td>\n",
|
| 98 |
+
" <td>52.0</td>\n",
|
| 99 |
+
" <td>1627.0</td>\n",
|
| 100 |
+
" <td>280.0</td>\n",
|
| 101 |
+
" <td>565.0</td>\n",
|
| 102 |
+
" <td>259.0</td>\n",
|
| 103 |
+
" <td>3.8462</td>\n",
|
| 104 |
+
" <td>342200.0</td>\n",
|
| 105 |
+
" <td>NEAR BAY</td>\n",
|
| 106 |
+
" </tr>\n",
|
| 107 |
+
" </tbody>\n",
|
| 108 |
+
"</table>\n",
|
| 109 |
+
"</div>"
|
| 110 |
+
],
|
| 111 |
+
"text/plain": [
|
| 112 |
+
" longitude latitude housing_median_age total_rooms total_bedrooms \\\n",
|
| 113 |
+
"0 -122.23 37.88 41.0 880.0 129.0 \n",
|
| 114 |
+
"1 -122.22 37.86 21.0 7099.0 1106.0 \n",
|
| 115 |
+
"2 -122.24 37.85 52.0 1467.0 190.0 \n",
|
| 116 |
+
"3 -122.25 37.85 52.0 1274.0 235.0 \n",
|
| 117 |
+
"4 -122.25 37.85 52.0 1627.0 280.0 \n",
|
| 118 |
+
"\n",
|
| 119 |
+
" population households median_income median_house_value ocean_proximity \n",
|
| 120 |
+
"0 322.0 126.0 8.3252 452600.0 NEAR BAY \n",
|
| 121 |
+
"1 2401.0 1138.0 8.3014 358500.0 NEAR BAY \n",
|
| 122 |
+
"2 496.0 177.0 7.2574 352100.0 NEAR BAY \n",
|
| 123 |
+
"3 558.0 219.0 5.6431 341300.0 NEAR BAY \n",
|
| 124 |
+
"4 565.0 259.0 3.8462 342200.0 NEAR BAY "
|
| 125 |
+
]
|
| 126 |
+
},
|
| 127 |
+
"execution_count": 26,
|
| 128 |
+
"metadata": {},
|
| 129 |
+
"output_type": "execute_result"
|
| 130 |
+
}
|
| 131 |
+
],
|
| 132 |
+
"source": [
|
| 133 |
+
"import pandas as pd \n",
|
| 134 |
+
"\n",
|
| 135 |
+
"data=pd.read_csv('Data/housing.csv')\n",
|
| 136 |
+
"data.head()"
|
| 137 |
+
]
|
| 138 |
+
},
|
| 139 |
+
{
|
| 140 |
+
"cell_type": "code",
|
| 141 |
+
"execution_count": 27,
|
| 142 |
+
"metadata": {},
|
| 143 |
+
"outputs": [
|
| 144 |
+
{
|
| 145 |
+
"data": {
|
| 146 |
+
"text/plain": [
|
| 147 |
+
"longitude 0\n",
|
| 148 |
+
"latitude 0\n",
|
| 149 |
+
"housing_median_age 0\n",
|
| 150 |
+
"total_rooms 0\n",
|
| 151 |
+
"total_bedrooms 207\n",
|
| 152 |
+
"population 0\n",
|
| 153 |
+
"households 0\n",
|
| 154 |
+
"median_income 0\n",
|
| 155 |
+
"median_house_value 0\n",
|
| 156 |
+
"ocean_proximity 0\n",
|
| 157 |
+
"dtype: int64"
|
| 158 |
+
]
|
| 159 |
+
},
|
| 160 |
+
"execution_count": 27,
|
| 161 |
+
"metadata": {},
|
| 162 |
+
"output_type": "execute_result"
|
| 163 |
+
}
|
| 164 |
+
],
|
| 165 |
+
"source": [
|
| 166 |
+
"data.isnull().sum()"
|
| 167 |
+
]
|
| 168 |
+
},
|
| 169 |
+
{
|
| 170 |
+
"cell_type": "code",
|
| 171 |
+
"execution_count": 28,
|
| 172 |
+
"metadata": {},
|
| 173 |
+
"outputs": [
|
| 174 |
+
{
|
| 175 |
+
"name": "stderr",
|
| 176 |
+
"output_type": "stream",
|
| 177 |
+
"text": [
|
| 178 |
+
"C:\\Users\\PMLS\\AppData\\Local\\Temp\\ipykernel_1784\\1172000250.py:2: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
|
| 179 |
+
"The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
|
| 180 |
+
"\n",
|
| 181 |
+
"For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
|
| 182 |
+
"\n",
|
| 183 |
+
"\n",
|
| 184 |
+
" data['total_bedrooms'].fillna(data['total_rooms'] / ratio, inplace=True)\n"
|
| 185 |
+
]
|
| 186 |
+
},
|
| 187 |
+
{
|
| 188 |
+
"data": {
|
| 189 |
+
"text/plain": [
|
| 190 |
+
"longitude 0\n",
|
| 191 |
+
"latitude 0\n",
|
| 192 |
+
"housing_median_age 0\n",
|
| 193 |
+
"total_rooms 0\n",
|
| 194 |
+
"total_bedrooms 0\n",
|
| 195 |
+
"population 0\n",
|
| 196 |
+
"households 0\n",
|
| 197 |
+
"median_income 0\n",
|
| 198 |
+
"median_house_value 0\n",
|
| 199 |
+
"ocean_proximity 0\n",
|
| 200 |
+
"dtype: int64"
|
| 201 |
+
]
|
| 202 |
+
},
|
| 203 |
+
"execution_count": 28,
|
| 204 |
+
"metadata": {},
|
| 205 |
+
"output_type": "execute_result"
|
| 206 |
+
}
|
| 207 |
+
],
|
| 208 |
+
"source": [
|
| 209 |
+
"ratio = (data['total_rooms'] / data['total_bedrooms']).dropna().mean()\n",
|
| 210 |
+
"data['total_bedrooms'].fillna(data['total_rooms'] / ratio, inplace=True)\n",
|
| 211 |
+
"data.isnull().sum()"
|
| 212 |
+
]
|
| 213 |
+
},
|
| 214 |
+
{
|
| 215 |
+
"cell_type": "code",
|
| 216 |
+
"execution_count": 29,
|
| 217 |
+
"metadata": {},
|
| 218 |
+
"outputs": [
|
| 219 |
+
{
|
| 220 |
+
"data": {
|
| 221 |
+
"text/html": [
|
| 222 |
+
"<div>\n",
|
| 223 |
+
"<style scoped>\n",
|
| 224 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 225 |
+
" vertical-align: middle;\n",
|
| 226 |
+
" }\n",
|
| 227 |
+
"\n",
|
| 228 |
+
" .dataframe tbody tr th {\n",
|
| 229 |
+
" vertical-align: top;\n",
|
| 230 |
+
" }\n",
|
| 231 |
+
"\n",
|
| 232 |
+
" .dataframe thead th {\n",
|
| 233 |
+
" text-align: right;\n",
|
| 234 |
+
" }\n",
|
| 235 |
+
"</style>\n",
|
| 236 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 237 |
+
" <thead>\n",
|
| 238 |
+
" <tr style=\"text-align: right;\">\n",
|
| 239 |
+
" <th></th>\n",
|
| 240 |
+
" <th>longitude</th>\n",
|
| 241 |
+
" <th>latitude</th>\n",
|
| 242 |
+
" <th>housing_median_age</th>\n",
|
| 243 |
+
" <th>total_rooms</th>\n",
|
| 244 |
+
" <th>total_bedrooms</th>\n",
|
| 245 |
+
" <th>population</th>\n",
|
| 246 |
+
" <th>households</th>\n",
|
| 247 |
+
" <th>median_income</th>\n",
|
| 248 |
+
" <th>median_house_value</th>\n",
|
| 249 |
+
" <th>ocean_proximity</th>\n",
|
| 250 |
+
" </tr>\n",
|
| 251 |
+
" </thead>\n",
|
| 252 |
+
" <tbody>\n",
|
| 253 |
+
" <tr>\n",
|
| 254 |
+
" <th>0</th>\n",
|
| 255 |
+
" <td>-122.23</td>\n",
|
| 256 |
+
" <td>37.88</td>\n",
|
| 257 |
+
" <td>0.982119</td>\n",
|
| 258 |
+
" <td>-0.804800</td>\n",
|
| 259 |
+
" <td>-0.971082</td>\n",
|
| 260 |
+
" <td>-0.974405</td>\n",
|
| 261 |
+
" <td>-0.977009</td>\n",
|
| 262 |
+
" <td>8.3252</td>\n",
|
| 263 |
+
" <td>452600.0</td>\n",
|
| 264 |
+
" <td>NEAR BAY</td>\n",
|
| 265 |
+
" </tr>\n",
|
| 266 |
+
" <tr>\n",
|
| 267 |
+
" <th>1</th>\n",
|
| 268 |
+
" <td>-122.22</td>\n",
|
| 269 |
+
" <td>37.86</td>\n",
|
| 270 |
+
" <td>-0.607004</td>\n",
|
| 271 |
+
" <td>2.045841</td>\n",
|
| 272 |
+
" <td>1.350682</td>\n",
|
| 273 |
+
" <td>0.861418</td>\n",
|
| 274 |
+
" <td>1.669921</td>\n",
|
| 275 |
+
" <td>8.3014</td>\n",
|
| 276 |
+
" <td>358500.0</td>\n",
|
| 277 |
+
" <td>NEAR BAY</td>\n",
|
| 278 |
+
" </tr>\n",
|
| 279 |
+
" <tr>\n",
|
| 280 |
+
" <th>2</th>\n",
|
| 281 |
+
" <td>-122.24</td>\n",
|
| 282 |
+
" <td>37.85</td>\n",
|
| 283 |
+
" <td>1.856137</td>\n",
|
| 284 |
+
" <td>-0.535733</td>\n",
|
| 285 |
+
" <td>-0.826120</td>\n",
|
| 286 |
+
" <td>-0.820757</td>\n",
|
| 287 |
+
" <td>-0.843616</td>\n",
|
| 288 |
+
" <td>7.2574</td>\n",
|
| 289 |
+
" <td>352100.0</td>\n",
|
| 290 |
+
" <td>NEAR BAY</td>\n",
|
| 291 |
+
" </tr>\n",
|
| 292 |
+
" <tr>\n",
|
| 293 |
+
" <th>3</th>\n",
|
| 294 |
+
" <td>-122.25</td>\n",
|
| 295 |
+
" <td>37.85</td>\n",
|
| 296 |
+
" <td>1.856137</td>\n",
|
| 297 |
+
" <td>-0.624199</td>\n",
|
| 298 |
+
" <td>-0.719181</td>\n",
|
| 299 |
+
" <td>-0.766010</td>\n",
|
| 300 |
+
" <td>-0.733764</td>\n",
|
| 301 |
+
" <td>5.6431</td>\n",
|
| 302 |
+
" <td>341300.0</td>\n",
|
| 303 |
+
" <td>NEAR BAY</td>\n",
|
| 304 |
+
" </tr>\n",
|
| 305 |
+
" <tr>\n",
|
| 306 |
+
" <th>4</th>\n",
|
| 307 |
+
" <td>-122.25</td>\n",
|
| 308 |
+
" <td>37.85</td>\n",
|
| 309 |
+
" <td>1.856137</td>\n",
|
| 310 |
+
" <td>-0.462393</td>\n",
|
| 311 |
+
" <td>-0.612242</td>\n",
|
| 312 |
+
" <td>-0.759828</td>\n",
|
| 313 |
+
" <td>-0.629142</td>\n",
|
| 314 |
+
" <td>3.8462</td>\n",
|
| 315 |
+
" <td>342200.0</td>\n",
|
| 316 |
+
" <td>NEAR BAY</td>\n",
|
| 317 |
+
" </tr>\n",
|
| 318 |
+
" </tbody>\n",
|
| 319 |
+
"</table>\n",
|
| 320 |
+
"</div>"
|
| 321 |
+
],
|
| 322 |
+
"text/plain": [
|
| 323 |
+
" longitude latitude housing_median_age total_rooms total_bedrooms \\\n",
|
| 324 |
+
"0 -122.23 37.88 0.982119 -0.804800 -0.971082 \n",
|
| 325 |
+
"1 -122.22 37.86 -0.607004 2.045841 1.350682 \n",
|
| 326 |
+
"2 -122.24 37.85 1.856137 -0.535733 -0.826120 \n",
|
| 327 |
+
"3 -122.25 37.85 1.856137 -0.624199 -0.719181 \n",
|
| 328 |
+
"4 -122.25 37.85 1.856137 -0.462393 -0.612242 \n",
|
| 329 |
+
"\n",
|
| 330 |
+
" population households median_income median_house_value ocean_proximity \n",
|
| 331 |
+
"0 -0.974405 -0.977009 8.3252 452600.0 NEAR BAY \n",
|
| 332 |
+
"1 0.861418 1.669921 8.3014 358500.0 NEAR BAY \n",
|
| 333 |
+
"2 -0.820757 -0.843616 7.2574 352100.0 NEAR BAY \n",
|
| 334 |
+
"3 -0.766010 -0.733764 5.6431 341300.0 NEAR BAY \n",
|
| 335 |
+
"4 -0.759828 -0.629142 3.8462 342200.0 NEAR BAY "
|
| 336 |
+
]
|
| 337 |
+
},
|
| 338 |
+
"execution_count": 29,
|
| 339 |
+
"metadata": {},
|
| 340 |
+
"output_type": "execute_result"
|
| 341 |
+
}
|
| 342 |
+
],
|
| 343 |
+
"source": [
|
| 344 |
+
"data['housing_median_age']=(data['housing_median_age']-data['housing_median_age'].mean())/data['housing_median_age'].std(ddof=1)\n",
|
| 345 |
+
"data['total_rooms']=(data['total_rooms']-data['total_rooms'].mean())/data['total_rooms'].std(ddof=1)\n",
|
| 346 |
+
"data['total_bedrooms']=(data['total_bedrooms']-data['total_bedrooms'].mean())/data['total_bedrooms'].std(ddof=1)\n",
|
| 347 |
+
"data['population']=(data['population']-data['population'].mean())/data['population'].std(ddof=1)\n",
|
| 348 |
+
"data['households']=(data['households']-data['households'].mean())/data['households'].std(ddof=1)\n",
|
| 349 |
+
"data.head()"
|
| 350 |
+
]
|
| 351 |
+
},
|
| 352 |
+
{
|
| 353 |
+
"cell_type": "code",
|
| 354 |
+
"execution_count": null,
|
| 355 |
+
"metadata": {},
|
| 356 |
+
"outputs": [
|
| 357 |
+
{
|
| 358 |
+
"data": {
|
| 359 |
+
"text/plain": [
|
| 360 |
+
"ocean_proximity\n",
|
| 361 |
+
"<1H OCEAN 9136\n",
|
| 362 |
+
"INLAND 6551\n",
|
| 363 |
+
"NEAR OCEAN 2658\n",
|
| 364 |
+
"NEAR BAY 2290\n",
|
| 365 |
+
"ISLAND 5\n",
|
| 366 |
+
"Name: count, dtype: int64"
|
| 367 |
+
]
|
| 368 |
+
},
|
| 369 |
+
"execution_count": 30,
|
| 370 |
+
"metadata": {},
|
| 371 |
+
"output_type": "execute_result"
|
| 372 |
+
}
|
| 373 |
+
],
|
| 374 |
+
"source": [
|
| 375 |
+
"\n",
|
| 376 |
+
"data['ocean_proximity'].value_counts()\n",
|
| 377 |
+
"\n"
|
| 378 |
+
]
|
| 379 |
+
},
|
| 380 |
+
{
|
| 381 |
+
"cell_type": "code",
|
| 382 |
+
"execution_count": 31,
|
| 383 |
+
"metadata": {},
|
| 384 |
+
"outputs": [],
|
| 385 |
+
"source": [
|
| 386 |
+
"mapping = {\n",
|
| 387 |
+
" '<1H OCEAN': 0,\n",
|
| 388 |
+
" 'INLAND': 1,\n",
|
| 389 |
+
" 'NEAR OCEAN': 2,\n",
|
| 390 |
+
" 'NEAR BAY': 3,\n",
|
| 391 |
+
" 'ISLAND': 4\n",
|
| 392 |
+
"}\n",
|
| 393 |
+
"\n",
|
| 394 |
+
"data['ocean_proximity'] = data['ocean_proximity'].map(mapping)\n"
|
| 395 |
+
]
|
| 396 |
+
},
|
| 397 |
+
{
|
| 398 |
+
"cell_type": "code",
|
| 399 |
+
"execution_count": 32,
|
| 400 |
+
"metadata": {},
|
| 401 |
+
"outputs": [
|
| 402 |
+
{
|
| 403 |
+
"data": {
|
| 404 |
+
"text/html": [
|
| 405 |
+
"<div>\n",
|
| 406 |
+
"<style scoped>\n",
|
| 407 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 408 |
+
" vertical-align: middle;\n",
|
| 409 |
+
" }\n",
|
| 410 |
+
"\n",
|
| 411 |
+
" .dataframe tbody tr th {\n",
|
| 412 |
+
" vertical-align: top;\n",
|
| 413 |
+
" }\n",
|
| 414 |
+
"\n",
|
| 415 |
+
" .dataframe thead th {\n",
|
| 416 |
+
" text-align: right;\n",
|
| 417 |
+
" }\n",
|
| 418 |
+
"</style>\n",
|
| 419 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 420 |
+
" <thead>\n",
|
| 421 |
+
" <tr style=\"text-align: right;\">\n",
|
| 422 |
+
" <th></th>\n",
|
| 423 |
+
" <th>longitude</th>\n",
|
| 424 |
+
" <th>latitude</th>\n",
|
| 425 |
+
" <th>housing_median_age</th>\n",
|
| 426 |
+
" <th>total_rooms</th>\n",
|
| 427 |
+
" <th>total_bedrooms</th>\n",
|
| 428 |
+
" <th>population</th>\n",
|
| 429 |
+
" <th>households</th>\n",
|
| 430 |
+
" <th>median_income</th>\n",
|
| 431 |
+
" <th>median_house_value</th>\n",
|
| 432 |
+
" <th>ocean_proximity</th>\n",
|
| 433 |
+
" </tr>\n",
|
| 434 |
+
" </thead>\n",
|
| 435 |
+
" <tbody>\n",
|
| 436 |
+
" <tr>\n",
|
| 437 |
+
" <th>0</th>\n",
|
| 438 |
+
" <td>-122.23</td>\n",
|
| 439 |
+
" <td>37.88</td>\n",
|
| 440 |
+
" <td>0.982119</td>\n",
|
| 441 |
+
" <td>-0.804800</td>\n",
|
| 442 |
+
" <td>-0.971082</td>\n",
|
| 443 |
+
" <td>-0.974405</td>\n",
|
| 444 |
+
" <td>-0.977009</td>\n",
|
| 445 |
+
" <td>8.3252</td>\n",
|
| 446 |
+
" <td>452600.0</td>\n",
|
| 447 |
+
" <td>3</td>\n",
|
| 448 |
+
" </tr>\n",
|
| 449 |
+
" <tr>\n",
|
| 450 |
+
" <th>1</th>\n",
|
| 451 |
+
" <td>-122.22</td>\n",
|
| 452 |
+
" <td>37.86</td>\n",
|
| 453 |
+
" <td>-0.607004</td>\n",
|
| 454 |
+
" <td>2.045841</td>\n",
|
| 455 |
+
" <td>1.350682</td>\n",
|
| 456 |
+
" <td>0.861418</td>\n",
|
| 457 |
+
" <td>1.669921</td>\n",
|
| 458 |
+
" <td>8.3014</td>\n",
|
| 459 |
+
" <td>358500.0</td>\n",
|
| 460 |
+
" <td>3</td>\n",
|
| 461 |
+
" </tr>\n",
|
| 462 |
+
" <tr>\n",
|
| 463 |
+
" <th>2</th>\n",
|
| 464 |
+
" <td>-122.24</td>\n",
|
| 465 |
+
" <td>37.85</td>\n",
|
| 466 |
+
" <td>1.856137</td>\n",
|
| 467 |
+
" <td>-0.535733</td>\n",
|
| 468 |
+
" <td>-0.826120</td>\n",
|
| 469 |
+
" <td>-0.820757</td>\n",
|
| 470 |
+
" <td>-0.843616</td>\n",
|
| 471 |
+
" <td>7.2574</td>\n",
|
| 472 |
+
" <td>352100.0</td>\n",
|
| 473 |
+
" <td>3</td>\n",
|
| 474 |
+
" </tr>\n",
|
| 475 |
+
" <tr>\n",
|
| 476 |
+
" <th>3</th>\n",
|
| 477 |
+
" <td>-122.25</td>\n",
|
| 478 |
+
" <td>37.85</td>\n",
|
| 479 |
+
" <td>1.856137</td>\n",
|
| 480 |
+
" <td>-0.624199</td>\n",
|
| 481 |
+
" <td>-0.719181</td>\n",
|
| 482 |
+
" <td>-0.766010</td>\n",
|
| 483 |
+
" <td>-0.733764</td>\n",
|
| 484 |
+
" <td>5.6431</td>\n",
|
| 485 |
+
" <td>341300.0</td>\n",
|
| 486 |
+
" <td>3</td>\n",
|
| 487 |
+
" </tr>\n",
|
| 488 |
+
" <tr>\n",
|
| 489 |
+
" <th>4</th>\n",
|
| 490 |
+
" <td>-122.25</td>\n",
|
| 491 |
+
" <td>37.85</td>\n",
|
| 492 |
+
" <td>1.856137</td>\n",
|
| 493 |
+
" <td>-0.462393</td>\n",
|
| 494 |
+
" <td>-0.612242</td>\n",
|
| 495 |
+
" <td>-0.759828</td>\n",
|
| 496 |
+
" <td>-0.629142</td>\n",
|
| 497 |
+
" <td>3.8462</td>\n",
|
| 498 |
+
" <td>342200.0</td>\n",
|
| 499 |
+
" <td>3</td>\n",
|
| 500 |
+
" </tr>\n",
|
| 501 |
+
" </tbody>\n",
|
| 502 |
+
"</table>\n",
|
| 503 |
+
"</div>"
|
| 504 |
+
],
|
| 505 |
+
"text/plain": [
|
| 506 |
+
" longitude latitude housing_median_age total_rooms total_bedrooms \\\n",
|
| 507 |
+
"0 -122.23 37.88 0.982119 -0.804800 -0.971082 \n",
|
| 508 |
+
"1 -122.22 37.86 -0.607004 2.045841 1.350682 \n",
|
| 509 |
+
"2 -122.24 37.85 1.856137 -0.535733 -0.826120 \n",
|
| 510 |
+
"3 -122.25 37.85 1.856137 -0.624199 -0.719181 \n",
|
| 511 |
+
"4 -122.25 37.85 1.856137 -0.462393 -0.612242 \n",
|
| 512 |
+
"\n",
|
| 513 |
+
" population households median_income median_house_value ocean_proximity \n",
|
| 514 |
+
"0 -0.974405 -0.977009 8.3252 452600.0 3 \n",
|
| 515 |
+
"1 0.861418 1.669921 8.3014 358500.0 3 \n",
|
| 516 |
+
"2 -0.820757 -0.843616 7.2574 352100.0 3 \n",
|
| 517 |
+
"3 -0.766010 -0.733764 5.6431 341300.0 3 \n",
|
| 518 |
+
"4 -0.759828 -0.629142 3.8462 342200.0 3 "
|
| 519 |
+
]
|
| 520 |
+
},
|
| 521 |
+
"execution_count": 32,
|
| 522 |
+
"metadata": {},
|
| 523 |
+
"output_type": "execute_result"
|
| 524 |
+
}
|
| 525 |
+
],
|
| 526 |
+
"source": [
|
| 527 |
+
"data.head()"
|
| 528 |
+
]
|
| 529 |
+
},
|
| 530 |
+
{
|
| 531 |
+
"cell_type": "code",
|
| 532 |
+
"execution_count": 33,
|
| 533 |
+
"metadata": {},
|
| 534 |
+
"outputs": [],
|
| 535 |
+
"source": [
|
| 536 |
+
"data.to_csv(\"processed_data.csv\", index=False) # Save without index"
|
| 537 |
+
]
|
| 538 |
+
},
|
| 539 |
+
{
|
| 540 |
+
"cell_type": "code",
|
| 541 |
+
"execution_count": null,
|
| 542 |
+
"metadata": {},
|
| 543 |
+
"outputs": [],
|
| 544 |
+
"source": []
|
| 545 |
+
}
|
| 546 |
+
],
|
| 547 |
+
"metadata": {
|
| 548 |
+
"kernelspec": {
|
| 549 |
+
"display_name": "base",
|
| 550 |
+
"language": "python",
|
| 551 |
+
"name": "python3"
|
| 552 |
+
},
|
| 553 |
+
"language_info": {
|
| 554 |
+
"codemirror_mode": {
|
| 555 |
+
"name": "ipython",
|
| 556 |
+
"version": 3
|
| 557 |
+
},
|
| 558 |
+
"file_extension": ".py",
|
| 559 |
+
"mimetype": "text/x-python",
|
| 560 |
+
"name": "python",
|
| 561 |
+
"nbconvert_exporter": "python",
|
| 562 |
+
"pygments_lexer": "ipython3",
|
| 563 |
+
"version": "3.12.4"
|
| 564 |
+
}
|
| 565 |
+
},
|
| 566 |
+
"nbformat": 4,
|
| 567 |
+
"nbformat_minor": 2
|
| 568 |
+
}
|
Data/housing.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Main.ipynb
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 31,
|
| 6 |
+
"metadata": {},
|
| 7 |
+
"outputs": [],
|
| 8 |
+
"source": [
|
| 9 |
+
"import pandas as pd \n",
|
| 10 |
+
"import numpy as np\n",
|
| 11 |
+
"import matplotlib.pyplot as plt"
|
| 12 |
+
]
|
| 13 |
+
},
|
| 14 |
+
{
|
| 15 |
+
"cell_type": "code",
|
| 16 |
+
"execution_count": 32,
|
| 17 |
+
"metadata": {},
|
| 18 |
+
"outputs": [
|
| 19 |
+
{
|
| 20 |
+
"data": {
|
| 21 |
+
"text/html": [
|
| 22 |
+
"<div>\n",
|
| 23 |
+
"<style scoped>\n",
|
| 24 |
+
" .dataframe tbody tr th:only-of-type {\n",
|
| 25 |
+
" vertical-align: middle;\n",
|
| 26 |
+
" }\n",
|
| 27 |
+
"\n",
|
| 28 |
+
" .dataframe tbody tr th {\n",
|
| 29 |
+
" vertical-align: top;\n",
|
| 30 |
+
" }\n",
|
| 31 |
+
"\n",
|
| 32 |
+
" .dataframe thead th {\n",
|
| 33 |
+
" text-align: right;\n",
|
| 34 |
+
" }\n",
|
| 35 |
+
"</style>\n",
|
| 36 |
+
"<table border=\"1\" class=\"dataframe\">\n",
|
| 37 |
+
" <thead>\n",
|
| 38 |
+
" <tr style=\"text-align: right;\">\n",
|
| 39 |
+
" <th></th>\n",
|
| 40 |
+
" <th>longitude</th>\n",
|
| 41 |
+
" <th>latitude</th>\n",
|
| 42 |
+
" <th>housing_median_age</th>\n",
|
| 43 |
+
" <th>total_rooms</th>\n",
|
| 44 |
+
" <th>total_bedrooms</th>\n",
|
| 45 |
+
" <th>population</th>\n",
|
| 46 |
+
" <th>households</th>\n",
|
| 47 |
+
" <th>median_income</th>\n",
|
| 48 |
+
" <th>median_house_value</th>\n",
|
| 49 |
+
" <th>ocean_proximity</th>\n",
|
| 50 |
+
" </tr>\n",
|
| 51 |
+
" </thead>\n",
|
| 52 |
+
" <tbody>\n",
|
| 53 |
+
" <tr>\n",
|
| 54 |
+
" <th>0</th>\n",
|
| 55 |
+
" <td>-122.23</td>\n",
|
| 56 |
+
" <td>37.88</td>\n",
|
| 57 |
+
" <td>0.982119</td>\n",
|
| 58 |
+
" <td>-0.804800</td>\n",
|
| 59 |
+
" <td>-0.971082</td>\n",
|
| 60 |
+
" <td>-0.974405</td>\n",
|
| 61 |
+
" <td>-0.977009</td>\n",
|
| 62 |
+
" <td>8.3252</td>\n",
|
| 63 |
+
" <td>452600.0</td>\n",
|
| 64 |
+
" <td>3</td>\n",
|
| 65 |
+
" </tr>\n",
|
| 66 |
+
" <tr>\n",
|
| 67 |
+
" <th>1</th>\n",
|
| 68 |
+
" <td>-122.22</td>\n",
|
| 69 |
+
" <td>37.86</td>\n",
|
| 70 |
+
" <td>-0.607004</td>\n",
|
| 71 |
+
" <td>2.045841</td>\n",
|
| 72 |
+
" <td>1.350682</td>\n",
|
| 73 |
+
" <td>0.861418</td>\n",
|
| 74 |
+
" <td>1.669921</td>\n",
|
| 75 |
+
" <td>8.3014</td>\n",
|
| 76 |
+
" <td>358500.0</td>\n",
|
| 77 |
+
" <td>3</td>\n",
|
| 78 |
+
" </tr>\n",
|
| 79 |
+
" <tr>\n",
|
| 80 |
+
" <th>2</th>\n",
|
| 81 |
+
" <td>-122.24</td>\n",
|
| 82 |
+
" <td>37.85</td>\n",
|
| 83 |
+
" <td>1.856137</td>\n",
|
| 84 |
+
" <td>-0.535733</td>\n",
|
| 85 |
+
" <td>-0.826120</td>\n",
|
| 86 |
+
" <td>-0.820757</td>\n",
|
| 87 |
+
" <td>-0.843616</td>\n",
|
| 88 |
+
" <td>7.2574</td>\n",
|
| 89 |
+
" <td>352100.0</td>\n",
|
| 90 |
+
" <td>3</td>\n",
|
| 91 |
+
" </tr>\n",
|
| 92 |
+
" <tr>\n",
|
| 93 |
+
" <th>3</th>\n",
|
| 94 |
+
" <td>-122.25</td>\n",
|
| 95 |
+
" <td>37.85</td>\n",
|
| 96 |
+
" <td>1.856137</td>\n",
|
| 97 |
+
" <td>-0.624199</td>\n",
|
| 98 |
+
" <td>-0.719181</td>\n",
|
| 99 |
+
" <td>-0.766010</td>\n",
|
| 100 |
+
" <td>-0.733764</td>\n",
|
| 101 |
+
" <td>5.6431</td>\n",
|
| 102 |
+
" <td>341300.0</td>\n",
|
| 103 |
+
" <td>3</td>\n",
|
| 104 |
+
" </tr>\n",
|
| 105 |
+
" <tr>\n",
|
| 106 |
+
" <th>4</th>\n",
|
| 107 |
+
" <td>-122.25</td>\n",
|
| 108 |
+
" <td>37.85</td>\n",
|
| 109 |
+
" <td>1.856137</td>\n",
|
| 110 |
+
" <td>-0.462393</td>\n",
|
| 111 |
+
" <td>-0.612242</td>\n",
|
| 112 |
+
" <td>-0.759828</td>\n",
|
| 113 |
+
" <td>-0.629142</td>\n",
|
| 114 |
+
" <td>3.8462</td>\n",
|
| 115 |
+
" <td>342200.0</td>\n",
|
| 116 |
+
" <td>3</td>\n",
|
| 117 |
+
" </tr>\n",
|
| 118 |
+
" </tbody>\n",
|
| 119 |
+
"</table>\n",
|
| 120 |
+
"</div>"
|
| 121 |
+
],
|
| 122 |
+
"text/plain": [
|
| 123 |
+
" longitude latitude housing_median_age total_rooms total_bedrooms \\\n",
|
| 124 |
+
"0 -122.23 37.88 0.982119 -0.804800 -0.971082 \n",
|
| 125 |
+
"1 -122.22 37.86 -0.607004 2.045841 1.350682 \n",
|
| 126 |
+
"2 -122.24 37.85 1.856137 -0.535733 -0.826120 \n",
|
| 127 |
+
"3 -122.25 37.85 1.856137 -0.624199 -0.719181 \n",
|
| 128 |
+
"4 -122.25 37.85 1.856137 -0.462393 -0.612242 \n",
|
| 129 |
+
"\n",
|
| 130 |
+
" population households median_income median_house_value ocean_proximity \n",
|
| 131 |
+
"0 -0.974405 -0.977009 8.3252 452600.0 3 \n",
|
| 132 |
+
"1 0.861418 1.669921 8.3014 358500.0 3 \n",
|
| 133 |
+
"2 -0.820757 -0.843616 7.2574 352100.0 3 \n",
|
| 134 |
+
"3 -0.766010 -0.733764 5.6431 341300.0 3 \n",
|
| 135 |
+
"4 -0.759828 -0.629142 3.8462 342200.0 3 "
|
| 136 |
+
]
|
| 137 |
+
},
|
| 138 |
+
"execution_count": 32,
|
| 139 |
+
"metadata": {},
|
| 140 |
+
"output_type": "execute_result"
|
| 141 |
+
}
|
| 142 |
+
],
|
| 143 |
+
"source": [
|
| 144 |
+
"data=pd.read_csv('processed_data.csv')\n",
|
| 145 |
+
"data.head()"
|
| 146 |
+
]
|
| 147 |
+
},
|
| 148 |
+
{
|
| 149 |
+
"cell_type": "code",
|
| 150 |
+
"execution_count": 33,
|
| 151 |
+
"metadata": {},
|
| 152 |
+
"outputs": [],
|
| 153 |
+
"source": [
|
| 154 |
+
"import numpy as np\n",
|
| 155 |
+
"\n",
|
| 156 |
+
"class LinearRegression:\n",
|
| 157 |
+
" def __init__(self, learningRate, epochs):\n",
|
| 158 |
+
" self.learningRate = learningRate\n",
|
| 159 |
+
" self.epochs = epochs\n",
|
| 160 |
+
" self.weights = None\n",
|
| 161 |
+
" self.bias = 0\n",
|
| 162 |
+
" self.cost_history = [] # Track cost over time\n",
|
| 163 |
+
"\n",
|
| 164 |
+
" def fit(self, X, Y):\n",
|
| 165 |
+
" m, n = X.shape\n",
|
| 166 |
+
" X = np.c_[np.ones(m), X] # Add bias term (column of ones)\n",
|
| 167 |
+
" self.weights = np.zeros(n + 1)\n",
|
| 168 |
+
"\n",
|
| 169 |
+
" for _ in range(self.epochs):\n",
|
| 170 |
+
" y_pred = np.dot(X, self.weights) # Predictions\n",
|
| 171 |
+
" error = y_pred - Y # Error\n",
|
| 172 |
+
" \n",
|
| 173 |
+
" # Compute cost (Mean Squared Error)\n",
|
| 174 |
+
" cost = (1 / (2 * m)) * np.sum(error ** 2)\n",
|
| 175 |
+
" self.cost_history.append(cost) # Store cost\n",
|
| 176 |
+
"\n",
|
| 177 |
+
" # Compute gradients\n",
|
| 178 |
+
" dw = (1 / m) * np.dot(X.T, error)\n",
|
| 179 |
+
" self.weights -= self.learningRate * dw # Update weights\n",
|
| 180 |
+
"\n",
|
| 181 |
+
" def predict(self, X):\n",
|
| 182 |
+
" X = np.c_[np.ones(X.shape[0]), X] # Add bias term for prediction\n",
|
| 183 |
+
" return np.dot(X, self.weights)\n",
|
| 184 |
+
"\n"
|
| 185 |
+
]
|
| 186 |
+
},
|
| 187 |
+
{
|
| 188 |
+
"cell_type": "code",
|
| 189 |
+
"execution_count": 34,
|
| 190 |
+
"metadata": {},
|
| 191 |
+
"outputs": [],
|
| 192 |
+
"source": [
|
| 193 |
+
"train_X=data.drop(columns='median_house_value').values\n",
|
| 194 |
+
"train_Y=data['median_house_value'].values"
|
| 195 |
+
]
|
| 196 |
+
},
|
| 197 |
+
{
|
| 198 |
+
"cell_type": "code",
|
| 199 |
+
"execution_count": 35,
|
| 200 |
+
"metadata": {},
|
| 201 |
+
"outputs": [],
|
| 202 |
+
"source": [
|
| 203 |
+
"model=LinearRegression(learningRate=0.0001,epochs=1000)\n",
|
| 204 |
+
"model.fit(train_X,train_Y)\n"
|
| 205 |
+
]
|
| 206 |
+
},
|
| 207 |
+
{
|
| 208 |
+
"cell_type": "code",
|
| 209 |
+
"execution_count": 36,
|
| 210 |
+
"metadata": {},
|
| 211 |
+
"outputs": [
|
| 212 |
+
{
|
| 213 |
+
"data": {
|
| 214 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArQAAAHYCAYAAAC84HtmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABnJUlEQVR4nO3deXhU1f0/8PedyR6SSMIyCSQsARKWqCwqKLKoZVMUq3WpC1irte5Sa8GlitriT62l1r1fBJWqtEUsrhWLQBVERdAYTEAWEyAxkBCSQJLJ3Ht+f+AMmcwkTDIzd+5neL+eJw+ZM3dmzsl7op85OfdcTSmlQEREREQklC3SHSAiIiIiCgYLWiIiIiISjQUtEREREYnGgpaIiIiIRGNBS0RERESisaAlIiIiItFY0BIRERGRaCxoiYiIiEg0FrREREREJBoLWiKiMJg1axY0TcOuXbsi3RUioqjHgpYoSmzcuBHXXnstBg4ciOTkZCQmJiI3NxdXXXUVVq5caUofHnjgAWiahtWrV3foce7ir62vBx54ICz9DcbixYuhaRoWL14c6a50yIEDB/Dwww9jzJgxyMjIQGxsLLp3745zzjkHf/3rX1FfXx/pLhIRdVhMpDtARMExDAN33nkn/vznPyMmJgZnnXUWzj//fMTGxmLHjh145513sGTJEjz44IO47777It3ddl177bXo3bu3T/uECRPM70yQ5s+fjzlz5qBXr16R7orHf//7X1xyySWorq7G4MGD8bOf/QwZGRmoqqrC2rVrceutt2LBggXYvn17pLtKRNQhLGiJhLv33nvx5z//GSeffDL+9a9/ITc31+v+hoYGPPXUU6iqqopQDwP3y1/+EqNHj450N0IiMzMTmZmZke6Gx1dffYXp06cDAJYsWYIrrrjC55jVq1dj7ty5ZneNiCh4iojE2rZtm7Lb7SojI0NVVFS0e2xjY6PX7f3796vbb79d9e3bV8XFxanu3burSy65RBUVFfk8tqamRt13331q8ODBKjk5WaWmpqq8vDw1a9YsVVpaqpRSavz48QqAz1efPn2OOY6ZM2cqAGr9+vXtHud+jfaeY+fOnZ62RYsWKQBq0aJF6sMPP1RnnHGGSkpKUunp6erqq69W+/fv9/tcX331lbriiitUr169VFxcnHI4HGry5MlqxYoVXq/l76u9/rgtXrxYnXba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Tz3Vqcfruo7ExETceuutOOecc/wes3PnTkybNg1nnnkmNm3ahLvvvhu33norli1bFkzXiXDGGWcAOLK/aKBSU1MBAD/88IPf+93t7uOAI8XrU089hT179mDLli146qmnkJGRgfvvvx+PPvpoZ7vfYe7ZOpfL5XOfv8Kqo9wnsHW08AtUamoqDMPAvn37fO6rrKyEYRheP/dQcb9PVq9eDcMwAn6cGf098cQTceKJJ2LFihWoq6tDXV0dVqxYgZNOOgkFBQVefQGAkSNHQh1ZLuf3q/WsKgBomuZ3bAD8jg3w//uRmpqKjIyMdl9/586dnfo5AB17/4W7L0TSHPcF7dSpU/Hwww/jpz/9qd/7nU4n7rrrLvTq1QvJyck47bTTvK6ClJycjGeffRbXXXedZxakteeeew45OTlYsGABBg8ejF/+8pf4xS9+4fdsXKKOmDVrFux2O1544YU2/8fs1tTUBADIz89HQkICPv/8cxw+fNjnuDVr1gCA3zP3NU3D4MGDcdNNN3muPrZixQrP/e6Z2kBmDTuja9euAHz/h28YhudPyMFw/2n6gw8+OOaxnRnr8OHDAcDvldTa+7kHa8CAARg3bhzKysrw0ksvtXus+30CmNffK6+8Eg0NDVi2bBmWLVuGhoYGXHnllV7HpKSkYPDgwfj2229DsszCvYvBunXrfO47fPiw3/fTaaedhqqqKmzbti3o1/enI++/cPeFSJrjvqA9lmuuuQaffPIJXn/9dXz99df42c9+hilTpnToPyLr16/3WRM1efJkfPHFF551X0SdMWDAANx1113Yv38/pk6d6ndGprGxEU888YTn8rFxcXG4/PLLsX//fsyfP9/r2A8//BDvvfceBgwY4JnV27lzJ7Zs2eLzvO4ZrMTERE9beno6AGD37t0hGV9ro0aNAgCfy80+8cQTIZmNmjlzJrp06YI//elPfteGtiykOzPWmTNnAgDmzZvn+ZM3cOTP3+4/HbuPCbUnn3wSiYmJuPnmm7F06VK/x/zvf//DWWedZXp/r7jiCthsNixZsgSvvPKKZ21ta7feeisOHz6M6667zu+f03fu3Ildu3YF9Jp9+vTBGWecgU2bNuFf//qX132PPfYYqqur/b4+APziF7/we6GSiooKfPvttwG9vj8def+Fuy9E0hz3a2jbs337drz22mvYvXs3srKyAAB3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gQO46qqrkJaWhrS0NFx11VWoqakJz6AUhdXrr7+uYmNj1d/+9je1ZcsWddttt6nk5GT1/fffR7prx73JkyerRYsWqW+++UZt3rxZnXvuuSonJ0fV19d7jnnkkUdUSkqKWrZsmSosLFSXXnqpyszMVLW1tZ5jbrjhBtWrVy+1cuVK9eWXX6qJEyeqk046SblcrkgM67j12Wefqb59+6oTTzxR3XbbbZ52Zmht1dXVqk+fPmrWrFlqw4YNaufOnerDDz9U3333necYZmhtDz/8sMrIyFBvv/222rlzp/rnP/+punTpohYsWOA5hhlay7vvvqvuuecetWzZMgVALV++3Ov+UOU1ZcoUNWzYMLVu3Tq1bt06NWzYMHXeeeeFZUwsaMPs1FNPVTfccINXW35+vpozZ06EekRtqaysVADUmjVrlFJKGYahHA6HeuSRRzzHNDY2qrS0NPXcc88ppZSqqalRsbGx6vXXX/ccs2fPHmWz2dT7779v7gCOY3V1dWrgwIFq5cqVavz48Z6Clhla3+9+9zs1duzYNu9nhtZ37rnnql/84hdebT/96U/VlVdeqZRihlbXuqANVV5btmxRANSnn37qOWb9+vUKgCouLg75OLjkIIycTic2btyISZMmebVPmjQJ69ati1CvqC0HDx4EAKSnpwMAdu7ciYqKCq/84uPjMX78eE9+GzduRHNzs9cxWVlZGDZsGDM20U033YRzzz0X55xzjlc7M7S+FStWYNSoUfjZz36GHj16YPjw4fjb3/7muZ8ZWt/YsWPx3//+F1u3bgUAfPXVV/j4448xbdo0AMxQmlDltX79eqSlpeG0007zHDN69GikpaWFJdOYkD8jeezfvx+6rqNnz55e7T179kRFRUWEekX+KKUwe/ZsjB07FsOGDQMAT0b+8vv+++89x8TFxaFr164+xzBjc7z++uv48ssv8fnnn/vcxwytb8eOHXj22Wcxe/Zs3H333fjss89w6623Ij4+HldffTUzFOB3v/sdDh48iPz8fNjtdui6jj/84Q+4/PLLAfD3UJpQ5VVRUYEePXr4PH+PHj3CkikLWhNomuZ1Wynl00aRdfPNN+Prr7/Gxx9/7HNfZ/JjxuYoKyvDbbfdhg8++AAJCQltHscMrcswDIwaNQp//OMfAQDDhw9HUVERnn32WVx99dWe45ihdS1duhRLlizB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CgoK8OWXX4b8+YmIOoMztEREYfbNN9/47HIAALm5uejevTuAI7OrZ511Fu677z7PLgfFxcVeW3fdf//9ePvttzFx4kT8/ve/R3p6Ov7+97/jnXfewaOPPurZleD222/H0qVLccEFF2DOnDk49dRT0dDQgDVr1uC8887DxIkTA+77119/jZtvvhk/+9nPMHDgQMTFxWHVqlX4+uuvMWfOnCB/MkREocGClogozNra6eBvf/sbfvnLXwIAzj//fAwdOhT33nsvSktLkZubi7///e+49NJLPcfn5eVh3bp1uPvuu3HTTTehoaEBgwcPxqJFizBr1izPcSkpKfj444/xwAMP4IUXXsC8efPQtWtXnHLKKbj++us71HeHw4Hc3Fw888wzKCsrg6Zp6N+/P/70pz/hlltu6fgPg4goDLhtFxFRhGmahptuuglPPfVUpLtCRCQS19ASERERkWgsaImIiIhINK6hJSKKMK78IiIKDmdoiYiIiEg0FrREREREJBoLWiIiIiISjQUtEREREYnGgpaIiIiIRGNBS0RERESisaAlIiIiItFY0BIRERGRaP8fEKQWGqyratYAAAAASUVORK5CYII=",
|
| 215 |
+
"text/plain": [
|
| 216 |
+
"<Figure size 800x500 with 1 Axes>"
|
| 217 |
+
]
|
| 218 |
+
},
|
| 219 |
+
"metadata": {},
|
| 220 |
+
"output_type": "display_data"
|
| 221 |
+
}
|
| 222 |
+
],
|
| 223 |
+
"source": [
|
| 224 |
+
"def plot_cost_history(model):\n",
|
| 225 |
+
" plt.figure(figsize=(8, 5))\n",
|
| 226 |
+
" plt.plot(range(len(model.cost_history)), model.cost_history, color='purple', linewidth=2)\n",
|
| 227 |
+
" plt.xlabel(\"Epochs\", fontsize=12)\n",
|
| 228 |
+
" plt.ylabel(\"Cost (MSE)\", fontsize=12)\n",
|
| 229 |
+
" plt.title(\"Cost Function Convergence\", fontsize=14)\n",
|
| 230 |
+
" plt.grid(True, linestyle=\"--\", alpha=0.6)\n",
|
| 231 |
+
" plt.show()\n",
|
| 232 |
+
"plot_cost_history(model)"
|
| 233 |
+
]
|
| 234 |
+
},
|
| 235 |
+
{
|
| 236 |
+
"cell_type": "code",
|
| 237 |
+
"execution_count": null,
|
| 238 |
+
"metadata": {},
|
| 239 |
+
"outputs": [],
|
| 240 |
+
"source": []
|
| 241 |
+
}
|
| 242 |
+
],
|
| 243 |
+
"metadata": {
|
| 244 |
+
"kernelspec": {
|
| 245 |
+
"display_name": "base",
|
| 246 |
+
"language": "python",
|
| 247 |
+
"name": "python3"
|
| 248 |
+
},
|
| 249 |
+
"language_info": {
|
| 250 |
+
"codemirror_mode": {
|
| 251 |
+
"name": "ipython",
|
| 252 |
+
"version": 3
|
| 253 |
+
},
|
| 254 |
+
"file_extension": ".py",
|
| 255 |
+
"mimetype": "text/x-python",
|
| 256 |
+
"name": "python",
|
| 257 |
+
"nbconvert_exporter": "python",
|
| 258 |
+
"pygments_lexer": "ipython3",
|
| 259 |
+
"version": "3.12.4"
|
| 260 |
+
}
|
| 261 |
+
},
|
| 262 |
+
"nbformat": 4,
|
| 263 |
+
"nbformat_minor": 2
|
| 264 |
+
}
|
processed_data.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|