examples/house-prices-kaggle-competi.../house-prices-orig.ipynb

1778 lines
158 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.036229,
"end_time": "2021-10-27T20:04:18.236097",
"exception": false,
"start_time": "2021-10-27T20:04:18.199868",
"status": "completed"
},
"tags": []
},
"source": [
"# Introduction #\n",
"\n",
"Welcome to the feature engineering project for the [House Prices - Advanced Regression Techniques](https://www.kaggle.com/c/house-prices-advanced-regression-techniques) competition! This competition uses nearly the same data you used in the exercises of the [Feature Engineering](https://www.kaggle.com/learn/feature-engineering) course. \n",
"\n",
"\n",
"# Step 1 - Preliminaries #\n",
"## Imports and Configuration ##\n",
"\n",
"We'll start by importing the packages we used in the exercises and setting some notebook defaults. Unhide this cell if you'd like to see the libraries we'll use:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"_kg_hide-input": true,
"execution": {
"iopub.execute_input": "2021-10-27T20:04:18.320753Z",
"iopub.status.busy": "2021-10-27T20:04:18.319486Z",
"iopub.status.idle": "2021-10-27T20:04:20.118899Z",
"shell.execute_reply": "2021-10-27T20:04:20.117383Z"
},
"papermill": {
"duration": 1.84978,
"end_time": "2021-10-27T20:04:20.119141",
"exception": false,
"start_time": "2021-10-27T20:04:18.269361",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"\n",
"import os\n",
"import warnings\n",
"from pathlib import Path\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"from IPython.display import display\n",
"from pandas.api.types import CategoricalDtype\n",
"\n",
"from category_encoders import MEstimateEncoder\n",
"from sklearn.cluster import KMeans\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.feature_selection import mutual_info_regression\n",
"from sklearn.model_selection import KFold, cross_val_score\n",
"from xgboost import XGBRegressor\n",
"\n",
"\n",
"# Set Matplotlib defaults\n",
"plt.style.use(\"seaborn-whitegrid\")\n",
"plt.rc(\"figure\", autolayout=True)\n",
"plt.rc(\n",
" \"axes\",\n",
" labelweight=\"bold\",\n",
" labelsize=\"large\",\n",
" titleweight=\"bold\",\n",
" titlesize=14,\n",
" titlepad=10,\n",
")\n",
"\n",
"# Mute warnings\n",
"warnings.filterwarnings('ignore')\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.03292,
"end_time": "2021-10-27T20:04:20.184209",
"exception": false,
"start_time": "2021-10-27T20:04:20.151289",
"status": "completed"
},
"tags": []
},
"source": [
"## Data Preprocessing ##\n",
"\n",
"Before we can do any feature engineering, we need to *preprocess* the data to get it in a form suitable for analysis. The data we used in the course was a bit simpler than the competition data. For the *Ames* competition dataset, we'll need to:\n",
"- **Load** the data from CSV files\n",
"- **Clean** the data to fix any errors or inconsistencies\n",
"- **Encode** the statistical data type (numeric, categorical)\n",
"- **Impute** any missing values\n",
"\n",
"We'll wrap all these steps up in a function, which will make easy for you to get a fresh dataframe whenever you need. After reading the CSV file, we'll apply three preprocessing steps, `clean`, `encode`, and `impute`, and then create the data splits: one (`df_train`) for training the model, and one (`df_test`) for making the predictions that you'll submit to the competition for scoring on the leaderboard."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:20.256708Z",
"iopub.status.busy": "2021-10-27T20:04:20.255666Z",
"iopub.status.idle": "2021-10-27T20:04:20.259278Z",
"shell.execute_reply": "2021-10-27T20:04:20.258676Z"
},
"papermill": {
"duration": 0.043063,
"end_time": "2021-10-27T20:04:20.259451",
"exception": false,
"start_time": "2021-10-27T20:04:20.216388",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"def load_data():\n",
" # Read data\n",
" data_dir = Path(\"../input/house-prices-advanced-regression-techniques/\")\n",
" df_train = pd.read_csv(data_dir / \"train.csv\", index_col=\"Id\")\n",
" df_test = pd.read_csv(data_dir / \"test.csv\", index_col=\"Id\")\n",
" # Merge the splits so we can process them together\n",
" df = pd.concat([df_train, df_test])\n",
" # Preprocessing\n",
" df = clean(df)\n",
" df = encode(df)\n",
" df = impute(df)\n",
" # Reform splits\n",
" df_train = df.loc[df_train.index, :]\n",
" df_test = df.loc[df_test.index, :]\n",
" return df_train, df_test\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.031365,
"end_time": "2021-10-27T20:04:20.325080",
"exception": false,
"start_time": "2021-10-27T20:04:20.293715",
"status": "completed"
},
"tags": []
},
"source": [
"### Clean Data ###\n",
"\n",
"Some of the categorical features in this dataset have what are apparently typos in their categories:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:20.394532Z",
"iopub.status.busy": "2021-10-27T20:04:20.393763Z",
"iopub.status.idle": "2021-10-27T20:04:20.450417Z",
"shell.execute_reply": "2021-10-27T20:04:20.450991Z"
},
"papermill": {
"duration": 0.094558,
"end_time": "2021-10-27T20:04:20.451203",
"exception": false,
"start_time": "2021-10-27T20:04:20.356645",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"array(['VinylSd', 'MetalSd', 'Wd Shng', 'HdBoard', 'Plywood', 'Wd Sdng',\n",
" 'CmentBd', 'BrkFace', 'Stucco', 'AsbShng', 'Brk Cmn', 'ImStucc',\n",
" 'AsphShn', 'Stone', 'Other', 'CBlock'], dtype=object)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_dir = Path(\"../input/house-prices-advanced-regression-techniques/\")\n",
"df = pd.read_csv(data_dir / \"train.csv\", index_col=\"Id\")\n",
"\n",
"df.Exterior2nd.unique()"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.031778,
"end_time": "2021-10-27T20:04:20.516295",
"exception": false,
"start_time": "2021-10-27T20:04:20.484517",
"status": "completed"
},
"tags": []
},
"source": [
"Comparing these to `data_description.txt` shows us what needs cleaning. We'll take care of a couple of issues here, but you might want to evaluate this data further."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:20.588327Z",
"iopub.status.busy": "2021-10-27T20:04:20.587260Z",
"iopub.status.idle": "2021-10-27T20:04:20.590341Z",
"shell.execute_reply": "2021-10-27T20:04:20.589702Z"
},
"papermill": {
"duration": 0.042177,
"end_time": "2021-10-27T20:04:20.590486",
"exception": false,
"start_time": "2021-10-27T20:04:20.548309",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"def clean(df):\n",
" df[\"Exterior2nd\"] = df[\"Exterior2nd\"].replace({\"Brk Cmn\": \"BrkComm\"})\n",
" # Some values of GarageYrBlt are corrupt, so we'll replace them\n",
" # with the year the house was built\n",
" df[\"GarageYrBlt\"] = df[\"GarageYrBlt\"].where(df.GarageYrBlt <= 2010, df.YearBuilt)\n",
" # Names beginning with numbers are awkward to work with\n",
" df.rename(columns={\n",
" \"1stFlrSF\": \"FirstFlrSF\",\n",
" \"2ndFlrSF\": \"SecondFlrSF\",\n",
" \"3SsnPorch\": \"Threeseasonporch\",\n",
" }, inplace=True,\n",
" )\n",
" return df\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.032069,
"end_time": "2021-10-27T20:04:20.654729",
"exception": false,
"start_time": "2021-10-27T20:04:20.622660",
"status": "completed"
},
"tags": []
},
"source": [
"### Encode the Statistical Data Type ###\n",
"\n",
"Pandas has Python types corresponding to the standard statistical types (numeric, categorical, etc.). Encoding each feature with its correct type helps ensure each feature is treated appropriately by whatever functions we use, and makes it easier for us to apply transformations consistently. This hidden cell defines the `encode` function:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"_kg_hide-input": true,
"execution": {
"iopub.execute_input": "2021-10-27T20:04:20.737930Z",
"iopub.status.busy": "2021-10-27T20:04:20.736900Z",
"iopub.status.idle": "2021-10-27T20:04:20.740552Z",
"shell.execute_reply": "2021-10-27T20:04:20.740028Z"
},
"papermill": {
"duration": 0.052778,
"end_time": "2021-10-27T20:04:20.740714",
"exception": false,
"start_time": "2021-10-27T20:04:20.687936",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"\n",
"# The numeric features are already encoded correctly (`float` for\n",
"# continuous, `int` for discrete), but the categoricals we'll need to\n",
"# do ourselves. Note in particular, that the `MSSubClass` feature is\n",
"# read as an `int` type, but is actually a (nominative) categorical.\n",
"\n",
"# The nominative (unordered) categorical features\n",
"features_nom = [\"MSSubClass\", \"MSZoning\", \"Street\", \"Alley\", \"LandContour\", \"LotConfig\", \"Neighborhood\", \"Condition1\", \"Condition2\", \"BldgType\", \"HouseStyle\", \"RoofStyle\", \"RoofMatl\", \"Exterior1st\", \"Exterior2nd\", \"MasVnrType\", \"Foundation\", \"Heating\", \"CentralAir\", \"GarageType\", \"MiscFeature\", \"SaleType\", \"SaleCondition\"]\n",
"\n",
"\n",
"# The ordinal (ordered) categorical features \n",
"\n",
"# Pandas calls the categories \"levels\"\n",
"five_levels = [\"Po\", \"Fa\", \"TA\", \"Gd\", \"Ex\"]\n",
"ten_levels = list(range(10))\n",
"\n",
"ordered_levels = {\n",
" \"OverallQual\": ten_levels,\n",
" \"OverallCond\": ten_levels,\n",
" \"ExterQual\": five_levels,\n",
" \"ExterCond\": five_levels,\n",
" \"BsmtQual\": five_levels,\n",
" \"BsmtCond\": five_levels,\n",
" \"HeatingQC\": five_levels,\n",
" \"KitchenQual\": five_levels,\n",
" \"FireplaceQu\": five_levels,\n",
" \"GarageQual\": five_levels,\n",
" \"GarageCond\": five_levels,\n",
" \"PoolQC\": five_levels,\n",
" \"LotShape\": [\"Reg\", \"IR1\", \"IR2\", \"IR3\"],\n",
" \"LandSlope\": [\"Sev\", \"Mod\", \"Gtl\"],\n",
" \"BsmtExposure\": [\"No\", \"Mn\", \"Av\", \"Gd\"],\n",
" \"BsmtFinType1\": [\"Unf\", \"LwQ\", \"Rec\", \"BLQ\", \"ALQ\", \"GLQ\"],\n",
" \"BsmtFinType2\": [\"Unf\", \"LwQ\", \"Rec\", \"BLQ\", \"ALQ\", \"GLQ\"],\n",
" \"Functional\": [\"Sal\", \"Sev\", \"Maj1\", \"Maj2\", \"Mod\", \"Min2\", \"Min1\", \"Typ\"],\n",
" \"GarageFinish\": [\"Unf\", \"RFn\", \"Fin\"],\n",
" \"PavedDrive\": [\"N\", \"P\", \"Y\"],\n",
" \"Utilities\": [\"NoSeWa\", \"NoSewr\", \"AllPub\"],\n",
" \"CentralAir\": [\"N\", \"Y\"],\n",
" \"Electrical\": [\"Mix\", \"FuseP\", \"FuseF\", \"FuseA\", \"SBrkr\"],\n",
" \"Fence\": [\"MnWw\", \"GdWo\", \"MnPrv\", \"GdPrv\"],\n",
"}\n",
"\n",
"# Add a None level for missing values\n",
"ordered_levels = {key: [\"None\"] + value for key, value in\n",
" ordered_levels.items()}\n",
"\n",
"\n",
"def encode(df):\n",
" # Nominal categories\n",
" for name in features_nom:\n",
" df[name] = df[name].astype(\"category\")\n",
" # Add a None category for missing values\n",
" if \"None\" not in df[name].cat.categories:\n",
" df[name].cat.add_categories(\"None\", inplace=True)\n",
" # Ordinal categories\n",
" for name, levels in ordered_levels.items():\n",
" df[name] = df[name].astype(CategoricalDtype(levels,\n",
" ordered=True))\n",
" return df\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.032488,
"end_time": "2021-10-27T20:04:20.805249",
"exception": false,
"start_time": "2021-10-27T20:04:20.772761",
"status": "completed"
},
"tags": []
},
"source": [
"### Handle Missing Values ###\n",
"\n",
"Handling missing values now will make the feature engineering go more smoothly. We'll impute `0` for missing numeric values and `\"None\"` for missing categorical values. You might like to experiment with other imputation strategies. In particular, you could try creating \"missing value\" indicators: `1` whenever a value was imputed and `0` otherwise."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:20.876211Z",
"iopub.status.busy": "2021-10-27T20:04:20.875480Z",
"iopub.status.idle": "2021-10-27T20:04:20.878433Z",
"shell.execute_reply": "2021-10-27T20:04:20.877838Z"
},
"papermill": {
"duration": 0.041181,
"end_time": "2021-10-27T20:04:20.878580",
"exception": false,
"start_time": "2021-10-27T20:04:20.837399",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"def impute(df):\n",
" for name in df.select_dtypes(\"number\"):\n",
" df[name] = df[name].fillna(0)\n",
" for name in df.select_dtypes(\"category\"):\n",
" df[name] = df[name].fillna(\"None\")\n",
" return df\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.032117,
"end_time": "2021-10-27T20:04:20.942911",
"exception": false,
"start_time": "2021-10-27T20:04:20.910794",
"status": "completed"
},
"tags": []
},
"source": [
"## Load Data ##\n",
"\n",
"And now we can call the data loader and get the processed data splits:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:21.014073Z",
"iopub.status.busy": "2021-10-27T20:04:21.012915Z",
"iopub.status.idle": "2021-10-27T20:04:21.211421Z",
"shell.execute_reply": "2021-10-27T20:04:21.211946Z"
},
"papermill": {
"duration": 0.236978,
"end_time": "2021-10-27T20:04:21.212142",
"exception": false,
"start_time": "2021-10-27T20:04:20.975164",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"df_train, df_test = load_data()"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.031984,
"end_time": "2021-10-27T20:04:21.276325",
"exception": false,
"start_time": "2021-10-27T20:04:21.244341",
"status": "completed"
},
"tags": []
},
"source": [
"Uncomment and run this cell if you'd like to see what they contain. Notice that `df_test` is\n",
"missing values for `SalePrice`. (`NA`s were willed with 0's in the imputation step.)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:21.347212Z",
"iopub.status.busy": "2021-10-27T20:04:21.346514Z",
"iopub.status.idle": "2021-10-27T20:04:21.349604Z",
"shell.execute_reply": "2021-10-27T20:04:21.350153Z"
},
"papermill": {
"duration": 0.039737,
"end_time": "2021-10-27T20:04:21.350317",
"exception": false,
"start_time": "2021-10-27T20:04:21.310580",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"# Peek at the values\n",
"#display(df_train)\n",
"#display(df_test)\n",
"\n",
"# Display information about dtypes and missing values\n",
"#display(df_train.info())\n",
"#display(df_test.info())"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.031973,
"end_time": "2021-10-27T20:04:21.414475",
"exception": false,
"start_time": "2021-10-27T20:04:21.382502",
"status": "completed"
},
"tags": []
},
"source": [
"## Establish Baseline ##\n",
"\n",
"Finally, let's establish a baseline score to judge our feature engineering against.\n",
"\n",
"Here is the function we created in Lesson 1 that will compute the cross-validated RMSLE score for a feature set. We've used XGBoost for our model, but you might want to experiment with other models.\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"_kg_hide-input": true,
"execution": {
"iopub.execute_input": "2021-10-27T20:04:21.482947Z",
"iopub.status.busy": "2021-10-27T20:04:21.482249Z",
"iopub.status.idle": "2021-10-27T20:04:21.489005Z",
"shell.execute_reply": "2021-10-27T20:04:21.489545Z"
},
"papermill": {
"duration": 0.043045,
"end_time": "2021-10-27T20:04:21.489734",
"exception": false,
"start_time": "2021-10-27T20:04:21.446689",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"\n",
"def score_dataset(X, y, model=XGBRegressor()):\n",
" # Label encoding for categoricals\n",
" #\n",
" # Label encoding is good for XGBoost and RandomForest, but one-hot\n",
" # would be better for models like Lasso or Ridge. The `cat.codes`\n",
" # attribute holds the category levels.\n",
" for colname in X.select_dtypes([\"category\"]):\n",
" X[colname] = X[colname].cat.codes\n",
" # Metric for Housing competition is RMSLE (Root Mean Squared Log Error)\n",
" log_y = np.log(y)\n",
" score = cross_val_score(\n",
" model, X, log_y, cv=5, scoring=\"neg_mean_squared_error\",\n",
" )\n",
" score = -1 * score.mean()\n",
" score = np.sqrt(score)\n",
" return score\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.032884,
"end_time": "2021-10-27T20:04:21.555620",
"exception": false,
"start_time": "2021-10-27T20:04:21.522736",
"status": "completed"
},
"tags": []
},
"source": [
"We can reuse this scoring function anytime we want to try out a new feature set. We'll run it now on the processed data with no additional features and get a baseline score:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:21.624797Z",
"iopub.status.busy": "2021-10-27T20:04:21.624101Z",
"iopub.status.idle": "2021-10-27T20:04:23.666249Z",
"shell.execute_reply": "2021-10-27T20:04:23.666863Z"
},
"papermill": {
"duration": 2.078872,
"end_time": "2021-10-27T20:04:23.667100",
"exception": false,
"start_time": "2021-10-27T20:04:21.588228",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Baseline score: 0.14351 RMSLE\n"
]
}
],
"source": [
"X = df_train.copy()\n",
"y = X.pop(\"SalePrice\")\n",
"\n",
"baseline_score = score_dataset(X, y)\n",
"print(f\"Baseline score: {baseline_score:.5f} RMSLE\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.033877,
"end_time": "2021-10-27T20:04:23.736448",
"exception": false,
"start_time": "2021-10-27T20:04:23.702571",
"status": "completed"
},
"tags": []
},
"source": [
"This baseline score helps us to know whether some set of features we've assembled has actually led to any improvement or not.\n",
"\n",
"# Step 2 - Feature Utility Scores #\n",
"\n",
"In Lesson 2 we saw how to use mutual information to compute a *utility score* for a feature, giving you an indication of how much potential the feature has. This hidden cell defines the two utility functions we used, `make_mi_scores` and `plot_mi_scores`: "
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"_kg_hide-input": true,
"execution": {
"iopub.execute_input": "2021-10-27T20:04:23.813707Z",
"iopub.status.busy": "2021-10-27T20:04:23.812779Z",
"iopub.status.idle": "2021-10-27T20:04:23.815905Z",
"shell.execute_reply": "2021-10-27T20:04:23.816437Z"
},
"papermill": {
"duration": 0.046446,
"end_time": "2021-10-27T20:04:23.816666",
"exception": false,
"start_time": "2021-10-27T20:04:23.770220",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"\n",
"def make_mi_scores(X, y):\n",
" X = X.copy()\n",
" for colname in X.select_dtypes([\"object\", \"category\"]):\n",
" X[colname], _ = X[colname].factorize()\n",
" # All discrete features should now have integer dtypes\n",
" discrete_features = [pd.api.types.is_integer_dtype(t) for t in X.dtypes]\n",
" mi_scores = mutual_info_regression(X, y, discrete_features=discrete_features, random_state=0)\n",
" mi_scores = pd.Series(mi_scores, name=\"MI Scores\", index=X.columns)\n",
" mi_scores = mi_scores.sort_values(ascending=False)\n",
" return mi_scores\n",
"\n",
"\n",
"def plot_mi_scores(scores):\n",
" scores = scores.sort_values(ascending=True)\n",
" width = np.arange(len(scores))\n",
" ticks = list(scores.index)\n",
" plt.barh(width, scores)\n",
" plt.yticks(width, ticks)\n",
" plt.title(\"Mutual Information Scores\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.033927,
"end_time": "2021-10-27T20:04:23.887054",
"exception": false,
"start_time": "2021-10-27T20:04:23.853127",
"status": "completed"
},
"tags": []
},
"source": [
"Let's look at our feature scores again:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:23.964339Z",
"iopub.status.busy": "2021-10-27T20:04:23.963474Z",
"iopub.status.idle": "2021-10-27T20:04:26.380546Z",
"shell.execute_reply": "2021-10-27T20:04:26.381068Z"
},
"papermill": {
"duration": 2.4575,
"end_time": "2021-10-27T20:04:26.381279",
"exception": false,
"start_time": "2021-10-27T20:04:23.923779",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"OverallQual 0.571457\n",
"Neighborhood 0.526220\n",
"GrLivArea 0.430395\n",
"YearBuilt 0.407974\n",
"LotArea 0.394468\n",
" ... \n",
"PoolQC 0.000000\n",
"MiscFeature 0.000000\n",
"MiscVal 0.000000\n",
"MoSold 0.000000\n",
"YrSold 0.000000\n",
"Name: MI Scores, Length: 79, dtype: float64"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X = df_train.copy()\n",
"y = X.pop(\"SalePrice\")\n",
"\n",
"mi_scores = make_mi_scores(X, y)\n",
"mi_scores"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.0332,
"end_time": "2021-10-27T20:04:26.448237",
"exception": false,
"start_time": "2021-10-27T20:04:26.415037",
"status": "completed"
},
"tags": []
},
"source": [
"You can see that we have a number of features that are highly informative and also some that don't seem to be informative at all (at least by themselves). As we talked about in Tutorial 2, the top scoring features will usually pay-off the most during feature development, so it could be a good idea to focus your efforts on those. On the other hand, training on uninformative features can lead to overfitting. So, the features with 0.0 scores we'll drop entirely:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:26.519381Z",
"iopub.status.busy": "2021-10-27T20:04:26.518372Z",
"iopub.status.idle": "2021-10-27T20:04:26.522233Z",
"shell.execute_reply": "2021-10-27T20:04:26.522699Z"
},
"papermill": {
"duration": 0.041247,
"end_time": "2021-10-27T20:04:26.522889",
"exception": false,
"start_time": "2021-10-27T20:04:26.481642",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"def drop_uninformative(df, mi_scores):\n",
" return df.loc[:, mi_scores > 0.0]\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.033805,
"end_time": "2021-10-27T20:04:26.590279",
"exception": false,
"start_time": "2021-10-27T20:04:26.556474",
"status": "completed"
},
"tags": []
},
"source": [
"Removing them does lead to a modest performance gain:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:26.661877Z",
"iopub.status.busy": "2021-10-27T20:04:26.660922Z",
"iopub.status.idle": "2021-10-27T20:04:28.664621Z",
"shell.execute_reply": "2021-10-27T20:04:28.665234Z"
},
"papermill": {
"duration": 2.041129,
"end_time": "2021-10-27T20:04:28.665440",
"exception": false,
"start_time": "2021-10-27T20:04:26.624311",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"0.14338026718687277"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X = df_train.copy()\n",
"y = X.pop(\"SalePrice\")\n",
"X = drop_uninformative(X, mi_scores)\n",
"\n",
"score_dataset(X, y)"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.034251,
"end_time": "2021-10-27T20:04:28.735154",
"exception": false,
"start_time": "2021-10-27T20:04:28.700903",
"status": "completed"
},
"tags": []
},
"source": [
"Later, we'll add the `drop_uninformative` function to our feature-creation pipeline.\n",
"\n",
"# Step 3 - Create Features #\n",
"\n",
"Now we'll start developing our feature set.\n",
"\n",
"To make our feature engineering workflow more modular, we'll define a function that will take a prepared dataframe and pass it through a pipeline of transformations to get the final feature set. It will look something like this:\n",
"\n",
"```\n",
"def create_features(df):\n",
" X = df.copy()\n",
" y = X.pop(\"SalePrice\")\n",
" X = X.join(create_features_1(X))\n",
" X = X.join(create_features_2(X))\n",
" X = X.join(create_features_3(X))\n",
" # ...\n",
" return X\n",
"```\n",
"\n",
"Let's go ahead and define one transformation now, a [label encoding](https://www.kaggle.com/alexisbcook/categorical-variables) for the categorical features:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:28.808709Z",
"iopub.status.busy": "2021-10-27T20:04:28.808032Z",
"iopub.status.idle": "2021-10-27T20:04:28.812616Z",
"shell.execute_reply": "2021-10-27T20:04:28.813299Z"
},
"papermill": {
"duration": 0.043595,
"end_time": "2021-10-27T20:04:28.813531",
"exception": false,
"start_time": "2021-10-27T20:04:28.769936",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"def label_encode(df):\n",
" X = df.copy()\n",
" for colname in X.select_dtypes([\"category\"]):\n",
" X[colname] = X[colname].cat.codes\n",
" return X\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.042891,
"end_time": "2021-10-27T20:04:28.892074",
"exception": false,
"start_time": "2021-10-27T20:04:28.849183",
"status": "completed"
},
"tags": []
},
"source": [
"A label encoding is okay for any kind of categorical feature when you're using a tree-ensemble like XGBoost, even for unordered categories. If you wanted to try a linear regression model (also popular in this competition), you would instead want to use a one-hot encoding, especially for the features with unordered categories.\n",
"\n",
"## Create Features with Pandas ##\n",
"\n",
"This cell reproduces the work you did in Exercise 3, where you applied strategies for creating features in Pandas. Modify or add to these functions to try out other feature combinations."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"_kg_hide-input": true,
"execution": {
"iopub.execute_input": "2021-10-27T20:04:28.978917Z",
"iopub.status.busy": "2021-10-27T20:04:28.977945Z",
"iopub.status.idle": "2021-10-27T20:04:28.987672Z",
"shell.execute_reply": "2021-10-27T20:04:28.988259Z"
},
"papermill": {
"duration": 0.054368,
"end_time": "2021-10-27T20:04:28.988444",
"exception": false,
"start_time": "2021-10-27T20:04:28.934076",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"\n",
"def mathematical_transforms(df):\n",
" X = pd.DataFrame() # dataframe to hold new features\n",
" X[\"LivLotRatio\"] = df.GrLivArea / df.LotArea\n",
" X[\"Spaciousness\"] = (df.FirstFlrSF + df.SecondFlrSF) / df.TotRmsAbvGrd\n",
" # This feature ended up not helping performance\n",
" # X[\"TotalOutsideSF\"] = \\\n",
" # df.WoodDeckSF + df.OpenPorchSF + df.EnclosedPorch + \\\n",
" # df.Threeseasonporch + df.ScreenPorch\n",
" return X\n",
"\n",
"\n",
"def interactions(df):\n",
" X = pd.get_dummies(df.BldgType, prefix=\"Bldg\")\n",
" X = X.mul(df.GrLivArea, axis=0)\n",
" return X\n",
"\n",
"\n",
"def counts(df):\n",
" X = pd.DataFrame()\n",
" X[\"PorchTypes\"] = df[[\n",
" \"WoodDeckSF\",\n",
" \"OpenPorchSF\",\n",
" \"EnclosedPorch\",\n",
" \"Threeseasonporch\",\n",
" \"ScreenPorch\",\n",
" ]].gt(0.0).sum(axis=1)\n",
" return X\n",
"\n",
"\n",
"def break_down(df):\n",
" X = pd.DataFrame()\n",
" X[\"MSClass\"] = df.MSSubClass.str.split(\"_\", n=1, expand=True)[0]\n",
" return X\n",
"\n",
"\n",
"def group_transforms(df):\n",
" X = pd.DataFrame()\n",
" X[\"MedNhbdArea\"] = df.groupby(\"Neighborhood\")[\"GrLivArea\"].transform(\"median\")\n",
" return X\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.034589,
"end_time": "2021-10-27T20:04:29.057590",
"exception": false,
"start_time": "2021-10-27T20:04:29.023001",
"status": "completed"
},
"tags": []
},
"source": [
"Here are some ideas for other transforms you could explore:\n",
"- Interactions between the quality `Qual` and condition `Cond` features. `OverallQual`, for instance, was a high-scoring feature. You could try combining it with `OverallCond` by converting both to integer type and taking a product.\n",
"- Square roots of area features. This would convert units of square feet to just feet.\n",
"- Logarithms of numeric features. If a feature has a skewed distribution, applying a logarithm can help normalize it.\n",
"- Interactions between numeric and categorical features that describe the same thing. You could look at interactions between `BsmtQual` and `TotalBsmtSF`, for instance.\n",
"- Other group statistics in `Neighboorhood`. We did the median of `GrLivArea`. Looking at `mean`, `std`, or `count` could be interesting. You could also try combining the group statistics with other features. Maybe the *difference* of `GrLivArea` and the median is important?\n",
"\n",
"## k-Means Clustering ##\n",
"\n",
"The first unsupervised algorithm we used to create features was k-means clustering. We saw that you could either use the cluster labels as a feature (a column with `0, 1, 2, ...`) or you could use the *distance* of the observations to each cluster. We saw how these features can sometimes be effective at untangling complicated spatial relationships."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"_kg_hide-input": true,
"execution": {
"iopub.execute_input": "2021-10-27T20:04:29.131372Z",
"iopub.status.busy": "2021-10-27T20:04:29.130553Z",
"iopub.status.idle": "2021-10-27T20:04:29.141326Z",
"shell.execute_reply": "2021-10-27T20:04:29.141884Z"
},
"lines_to_next_cell": 2,
"papermill": {
"duration": 0.049786,
"end_time": "2021-10-27T20:04:29.142064",
"exception": false,
"start_time": "2021-10-27T20:04:29.092278",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"\n",
"cluster_features = [\n",
" \"LotArea\",\n",
" \"TotalBsmtSF\",\n",
" \"FirstFlrSF\",\n",
" \"SecondFlrSF\",\n",
" \"GrLivArea\",\n",
"]\n",
"\n",
"\n",
"def cluster_labels(df, features, n_clusters=20):\n",
" X = df.copy()\n",
" X_scaled = X.loc[:, features]\n",
" X_scaled = (X_scaled - X_scaled.mean(axis=0)) / X_scaled.std(axis=0)\n",
" kmeans = KMeans(n_clusters=n_clusters, n_init=50, random_state=0)\n",
" X_new = pd.DataFrame()\n",
" X_new[\"Cluster\"] = kmeans.fit_predict(X_scaled)\n",
" return X_new\n",
"\n",
"\n",
"def cluster_distance(df, features, n_clusters=20):\n",
" X = df.copy()\n",
" X_scaled = X.loc[:, features]\n",
" X_scaled = (X_scaled - X_scaled.mean(axis=0)) / X_scaled.std(axis=0)\n",
" kmeans = KMeans(n_clusters=20, n_init=50, random_state=0)\n",
" X_cd = kmeans.fit_transform(X_scaled)\n",
" # Label features and join to dataset\n",
" X_cd = pd.DataFrame(\n",
" X_cd, columns=[f\"Centroid_{i}\" for i in range(X_cd.shape[1])]\n",
" )\n",
" return X_cd\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.034369,
"end_time": "2021-10-27T20:04:29.273011",
"exception": false,
"start_time": "2021-10-27T20:04:29.238642",
"status": "completed"
},
"tags": []
},
"source": [
"## Principal Component Analysis ##\n",
"\n",
"PCA was the second unsupervised model we used for feature creation. We saw how it could be used to decompose the variational structure in the data. The PCA algorithm gave us *loadings* which described each component of variation, and also the *components* which were the transformed datapoints. The loadings can suggest features to create and the components we can use as features directly.\n",
"\n",
"Here are the utility functions from the PCA lesson:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"_kg_hide-input": true,
"execution": {
"iopub.execute_input": "2021-10-27T20:04:29.355089Z",
"iopub.status.busy": "2021-10-27T20:04:29.349195Z",
"iopub.status.idle": "2021-10-27T20:04:29.362003Z",
"shell.execute_reply": "2021-10-27T20:04:29.362685Z"
},
"papermill": {
"duration": 0.053188,
"end_time": "2021-10-27T20:04:29.362908",
"exception": false,
"start_time": "2021-10-27T20:04:29.309720",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"\n",
"def apply_pca(X, standardize=True):\n",
" # Standardize\n",
" if standardize:\n",
" X = (X - X.mean(axis=0)) / X.std(axis=0)\n",
" # Create principal components\n",
" pca = PCA()\n",
" X_pca = pca.fit_transform(X)\n",
" # Convert to dataframe\n",
" component_names = [f\"PC{i+1}\" for i in range(X_pca.shape[1])]\n",
" X_pca = pd.DataFrame(X_pca, columns=component_names)\n",
" # Create loadings\n",
" loadings = pd.DataFrame(\n",
" pca.components_.T, # transpose the matrix of loadings\n",
" columns=component_names, # so the columns are the principal components\n",
" index=X.columns, # and the rows are the original features\n",
" )\n",
" return pca, X_pca, loadings\n",
"\n",
"\n",
"def plot_variance(pca, width=8, dpi=100):\n",
" # Create figure\n",
" fig, axs = plt.subplots(1, 2)\n",
" n = pca.n_components_\n",
" grid = np.arange(1, n + 1)\n",
" # Explained variance\n",
" evr = pca.explained_variance_ratio_\n",
" axs[0].bar(grid, evr)\n",
" axs[0].set(\n",
" xlabel=\"Component\", title=\"% Explained Variance\", ylim=(0.0, 1.0)\n",
" )\n",
" # Cumulative Variance\n",
" cv = np.cumsum(evr)\n",
" axs[1].plot(np.r_[0, grid], np.r_[0, cv], \"o-\")\n",
" axs[1].set(\n",
" xlabel=\"Component\", title=\"% Cumulative Variance\", ylim=(0.0, 1.0)\n",
" )\n",
" # Set up figure\n",
" fig.set(figwidth=8, dpi=100)\n",
" return axs\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.034582,
"end_time": "2021-10-27T20:04:29.434038",
"exception": false,
"start_time": "2021-10-27T20:04:29.399456",
"status": "completed"
},
"tags": []
},
"source": [
"And here are transforms that produce the features from the Exercise 5. You might want to change these if you came up with a different answer.\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"_kg_hide-input": true,
"execution": {
"iopub.execute_input": "2021-10-27T20:04:29.508704Z",
"iopub.status.busy": "2021-10-27T20:04:29.507802Z",
"iopub.status.idle": "2021-10-27T20:04:29.515195Z",
"shell.execute_reply": "2021-10-27T20:04:29.515726Z"
},
"papermill": {
"duration": 0.047013,
"end_time": "2021-10-27T20:04:29.515945",
"exception": false,
"start_time": "2021-10-27T20:04:29.468932",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"\n",
"def pca_inspired(df):\n",
" X = pd.DataFrame()\n",
" X[\"Feature1\"] = df.GrLivArea + df.TotalBsmtSF\n",
" X[\"Feature2\"] = df.YearRemodAdd * df.TotalBsmtSF\n",
" return X\n",
"\n",
"\n",
"def pca_components(df, features):\n",
" X = df.loc[:, features]\n",
" _, X_pca, _ = apply_pca(X)\n",
" return X_pca\n",
"\n",
"\n",
"pca_features = [\n",
" \"GarageArea\",\n",
" \"YearRemodAdd\",\n",
" \"TotalBsmtSF\",\n",
" \"GrLivArea\",\n",
"]"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.034769,
"end_time": "2021-10-27T20:04:29.586674",
"exception": false,
"start_time": "2021-10-27T20:04:29.551905",
"status": "completed"
},
"tags": []
},
"source": [
"These are only a couple ways you could use the principal components. You could also try clustering using one or more components. One thing to note is that PCA doesn't change the distance between points -- it's just like a rotation. So clustering with the full set of components is the same as clustering with the original features. Instead, pick some subset of components, maybe those with the most variance or the highest MI scores.\n",
"\n",
"For further analysis, you might want to look at a correlation matrix for the dataset:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:29.660684Z",
"iopub.status.busy": "2021-10-27T20:04:29.659882Z",
"iopub.status.idle": "2021-10-27T20:04:31.368870Z",
"shell.execute_reply": "2021-10-27T20:04:31.369432Z"
},
"papermill": {
"duration": 1.747951,
"end_time": "2021-10-27T20:04:31.369653",
"exception": false,
"start_time": "2021-10-27T20:04:29.621702",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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fruwhyoiN1FB86rVDEFEbnUFJsg2D4/CGoe4iIULF3LvvfcycOBAFi5cyMKFC3nllVcu2c7b25vY2NgiGKGIFAaz86o1f1pEbgUFV5DdC17kQm49Gzdu5P333wfgkUceITw8/LIJsoiIiMit6ioVZCXIJc3Zs2epWLEiABUqVODs2bOX3S4zM5OePXvi7u7OwIEDadeuXWEOU0TklqPlAkVcx1USZGthjUMKUUREBGfOnLnk8RdeeCHf7xaLBYvFctl9bN68mcDAQI4dO0b//v2pV68e1atXvxnDFREpEVx9uUAz89KVpEtxdZUpFkqQb0XR0dFXfO62227j1KlTVKxYkVOnThEQEHDZ7QIDAwGoVq0aLVq0YN++fUqQRcQUVU6LBzMJvOakS3FVcILsdfnqody6QkJCWLVqFQMHDmTVqlW0bdv2km3++OMPfHx88PT0JCkpiR9++IFnnnmmCEYrIrcCV6+cikjJU/AkYy1iUeIMHDiQF154gRUrVlClShVmzpwJwO7du/nPf/7DxIkTiY+PZ9y4cVgsFhwOB3//+9+pU6dO0Q5cRERE5AYpuNW07tErcfz9/VmyZMkljwcFBREUFATA3XffzerVqwt7aCIiIiKFosAU2OruKKxxiIiIiIi4hAITZHdNsRARuSnUqU5ExHUVmCB7eKqCLCJyM6hTnYiI6yq4gqw5yCIiIiJSwhRcQdYcZBEREREpYVRBFhERERHJo+AKslthDUNERERExDUUmCB7exbWMEREREREXEOBCbKnpliIiEgJd6Ul+bQcn8itS1MsRERECmBmST4txydSvKmCLCIiIiKSR4EpsJe7pbDGISIics3MdCLUtAcRuVYFJsg+ajUtIiIuSNMeRORmusoUC1WQRURERKRkKThBdlOCLCIi4sq0yobIjacKsoiISDGm6SYiN95VlnlTgiwiIiIiJUvBN+l5KkEWERERkZLlKlMsrIU1DhERERERl1DwFAvNQRYRERGREkY36Uk+69atY+7cucTHx/Pxxx8TFBR02e22bNnCxIkTsdvt9O7dm4EDBxbySEVERERujqtUkDXFoqSpV68ec+bMYdy4cVfcxmazERkZyeLFiwkMDKRXr16EhIRQp06dQhypiIiIyM1xlZv0lCCXNLVr177qNj/99BM1atSgWrVqAHTp0oWNGzcqQRYREZFbgsXhcDiKehDiesLDwxkxYsRlp1h89tlnfP3110ycOBGAVatW8dNPPzF27NjCHqaIiIjIDVdgBVluTREREZw5c+aSx1944QXatWtXBCMSERERcR1KkEug6Ojo64oPDAzkxIkTzt9PnjxJYGDgdY5KRERExDVokrEYFhQUxJEjRzh27BhZWVnExcUREhJS1MMSERERuSGUIEs+X3zxBQ8++CC7du3i2WefZcCAAUBulfjvf/87AO7u7owdO5ZnnnmG0NBQOnfuTN26dYty2CIiIiI3jG7SExERERHJQxVkEREREZE8lCCLiIiIiOShBFlEREREJA8lyCIiIiIieShBFhERERHJQwmyiIiIiEgeSpBFRERERPJQgiwiIiIikocSZBERERGRPJQgi4iIiIjkoQRZRERERCQP96IegJRgez8xHNIg9CXDMRk4DMeY52Y4woLNcIzZv2zdsRiOMR5R2Nfc+NVww244xvi/Uq4qbt6GY+wO49cvy2H8nAAyHMbPLM3M68hq/H83pUvVNBwDkJ5+0nBMdk6y8QOZvOZmXrPu7qUMx9jtmYZjzHKYuBYOR5aJIxn/jAWwmnkHW028d+3Gz+lIwmHDMXLzqYIsIiIiIpKHEmQRERERkTw0xUJERETEhTRr1oxdu3bdsP0tX76cxYsXA+Dr68vIkSNp2bKlqX1t27aNRYsWERUVRUxMDFOnTiUwMBCA+vXr07FjR+Lj4xk4cOAV92G325k0aRL//e9/sVgseHp6MnPmTKpVq0ZISAh+fn5Yrbk13HHjxnH33XebGuv1UIIsIiIicovavHkzy5cv54MPPiAgIIC9e/cyaNAgPv74Y2diez1CQ0MZO3Zsvsfatm1bYMzatWs5deoUn376KVarlRMnTuDj4+N8fsmSJQQEBFz32K6HpliIiIiIuLj9+/fTp08funXrxpAhQ/jjjz84e/YsPXv2BODAgQPUr1+f3377DYB27dqRnp7Ov//9b1555RVnwtmoUSN69uzJsmXLAAgJCSEpKQmA3bt3Ex4eDsBPP/3EY489xiOPPELfvn05dOjQNY0zJiaGyMhIAEaNGsWECRPo27cvbdu25bPPPgPg9OnTVKhQwVklrlSpEmXLlr0Rl+mGUYIsIiIi4uJGjBjByy+/zOrVq6lXrx5z587ltttuIzMzk5SUFHbs2EHjxo3ZsWMHiYmJ3Hbbbfj4+PDrr7/SuHHjfPtq3Lgxv/76a4HHu+OOO1i2bBmrVq3i+eefZ8aMGZfdbu3atYSFhREWFsYnn1y6OtWpU6f44IMPiIqK4q233gKgc+fObN68mbCwMN544w327duXL6Z///6EhYXRu3dvI5fohtIUiwJER0eTmVl4y+TcDM8++2xRD0FERESuQ3JyMsnJybRo0QKAHj16MGzYMCB3vvLOnTvZvn07//jHP/j6669xOBzcc889133MkSNHkpCQgMViITs7+7Lb/XWKRUxMTL7n27Vrh9VqpU6dOpw5cwbIrRh/9tlnbN26lf/+979EREQwa9Ys7r33XsA1plgoQS5AZmamEkwRERFxWcHBwezcuZPffvuNtm3b8u9//xuAhx56CIDatWuzZ88eZ/IJsHfvXmdV2c3NDcf/r72etyg4a9YsWrZsybx58zh+/DhPPfWUqfF5enpe8fE2bdrQpk0bypcvz4YNG/KNsahpioWIiIiICytdujRlypRhx44dAMTGxtK8eXMgN0H+9NNPqVGjBlarlbJly7JlyxZnBfmZZ55h2rRpnDt3Dsidy7xhwwb69u0LwO23386ePXsAWL9+vfOYycnJzpv4Vq5ceUPPZ+/evZw8mdvQx2638/PPP1OlSpUbeozrpQqyiIiIiAtJT0/nwQcfdP7+9NNPM2XKFMaNG0d6ejrVqlVj8uTJAFStWhWHw+FMmO+55x5OnDjhvOmtbdu2nDp1in79+mGz2Thz5gyxsbHOKQxDhw7l1VdfdVaML3rmmWcYNWoUCxYsoE2bNjf0/M6ePcuYMWPIysrtPBgUFMSTTz55Q49xvSwOh4mepiVEVFSUpljcTGo1DajV9PVTq2lQq+m81Go6l1pN/0mtpnPl5OTwz3/+E7vdzrRp07BYzHzClwyqIIuIiIiUAO7u7rz55ptFPYxiQQnyX+RdueLiWoJyc5ipBh9Y+5bhmDqhLxqOAUzUGMFuIspMPcTh5mciCnJsqYZjzFSdzdWdAYuJ2riJYrWZarCHp7k7qn/PSjIcY6b+7mnympv5NsLdvbThGD+/2w3H3F6jj+EYgMyUeMMxCUc/NRxjtkLr4VHGcIybm5fhmBxbuuEYhz3HcAxATk6aiSjjrz4vr9tMHMfctbBaPQzH2LMuv9KDFD9KkP8i78oVUVFRRTwaERERESlsWsVCRERERCQPJcgiIiIiInkoQRYRERFxIQ0bNnS2bw4LC2PhwoWm9hMSEkJSkvH7IK7F8ePH6dq1KwDbtm3jnnvuISwsjM6dOzN37tzr3n9MTAyRkZHXvR+zNAdZRERExIV4e3sTGxtb1MMwJDg4mKioKNLS0njkkUd4+OGHadSo0VXjcnJycHd3vXTU9UYkIiIiIpcICQnhkUceYfPmzeTk5DBz5kxq165NamoqEyZMcHbEGzp0KB07dswXu3jxYj75JLf/QK9evYiIiCAtLY0XXniBEydOYLfbGTx4MKGhoezZs4c33niDtLQ0/P39mTx5MhUrVmTPnj2MHj0agPvvv/+yY/T19aVRo0YkJCRgtVqdzU2qV6/OpEmTKFu2LOHh4TRo0ICdO3fStWtXgoODmTRpEmlpaXh6ehIdHQ3AqVOnGDBgAMeOHaNdu3aMGDHiJl3ZSylBLoCXl1exX8lCjU5ERESKl4yMDMLCwpy/P/vss4SGhgLg7+/PypUrWbZsGYsWLWLixInMnz+fUqVKsXr1agD++OOPfPvbs2cPMTExfPTRRzgcDvr06UOLFi04duwYFStWdE7hSE5OJjs7mwkTJjB//nwCAgJYu3YtM2bMYPLkyfzzn/9k7NixNG/enClTplx27OfOneN///sfgwcP5sUXX2TMmDG0aNGCWbNmMXfuXF599VUAsrOziYmJISsri86dOzNjxgyaNGlCSkoK3t65TVr279/PqlWr8PT0pFOnToSHh1O5cuUbe7GvQAlyASIiIop6CCIiIlLCFDTFokOHDgA0btyYL774AoCtW7cyffp05zYX20xftHPnTtq1a4evry8A7du3Z8eOHTzwwANMmTKFN998k4cffpjg4GB++eUXfvnlF55++mkA7HY7FSpU4MKFCyQnJztbWoeFhfH11187j7Fjxw4eeeQRrFYrf//736lUqRLJycm0aNECgB49ejBs2DDn9hcT/sOHD1OhQgWaNGkCQKlSf3aNvPfeeyldOnfd9dq1a5OYmKgEWURERETy8/DIbWBitVqx2cy0PfpTrVq1iImJ4auvvmLmzJm0atWK9u3bU7duXZYvX55v2wsXLhS4r4tzkC9KTi64fbuPj89Vx+fp6en82c3N7brP1witYiEiIiJSjN13330sW7bM+ftfp1gEBwezYcMG0tPTSUtLY8OGDQQHB3Py5El8fHwICwtjwIAB7Nu3j1q1apGUlMSuXbuA3KkQBw8epEyZMpQuXZodO3YAOKdzXEnp0qUpU6aMc/vY2Fhn9TmvWrVqcfr0aX766ScAUlJSyMkx19HxRlIFWURERMSF/HUO8gMPPMDLL798xe0HDRpEZGQkXbt2xWq1MnToUOdUDIBGjRrRs2dPevfuDeTepHfnnXfy9ddfM3XqVKxWK+7u7rz++ut4enoye/ZsJkyYQHJyMjabjf79+1O3bl0mT57M6NGjsVgsV7xJL68pU6Y4b9KrVq0akydPvmQbT09PZsyYwYQJE8jIyMDb25vFixcbuVw3hcXhcDiKehCuJCoqSje2FZIGNWoajjmw9i3DMXVCXzQcA2A3FWMxHOOO8begw83PcAwAtlTDIe4mzinTcMT/s5j4UsvUJ5jxr+k8PAPMHIicLONrkJo5JU8T/05g7mvEHPcyhmP8/G43HHN7jT6GYwAyU+INxyQc/dRwjN1u7pXu4WH8+rm5eRmOybGlG45x2M1V7nJy0owfy2H8WF5e5Q3HgLlrYbV6GI7Jzvrj6hv9xZGEQ4Zj5ObTFAsRERERkTxK1BSL6OhoMjML/ov/t99+K6TRSIaJOpmZavCva6dffaPLaBD6kuGYHBPnlGMxXqWw2LMNxwC4mYgxVSMzUwkGU6VTNxPVYDMq2IxXyADSLMY/ZoN8bzMck5RjrpoZn2m84mWmcpqdXfANO5dz7PBSwzEANpvx8Zk5J297luEYALuJ90d6+knDMRYTx7FYzHxKgMPcVzmGmakEAzhMfGZmm3jPe3r5G44R11SiEuTMzMyrTp8o7usei4iIiMj10RQLEREREZE8lCCLiIiIiOShBFlERETEhTRr1sz581dffUXHjh1JTEzkww8/ZNWqVQDExMRw8mTBc9NjYmKIjIy8oWMbPHgwffrkX2Fm1KhRfPbZZ4b2s2XLFnr16kWnTp0ICwvjhRdecKn7wErUHGQRERGR4mLr1q1MmDCBd999l9tvv51+/fo5n1u5ciV169YlMDCw0MZz4cIF9u7di6+vL8eOHaNatWqm9vPLL78wYcIEFixYQO3atQHYuHEjiYmJVKlSJd+2OTk5uLsXfrqqCrKIiIiIi9m+fTuvvfYab7/9NtWrVwdgzpw5vPvuu3z22Wfs2bOHl19+mbCwMDIyMvjpp5/o27cv3bt3p1evXqSkpABw6tQpBgwYQIcOHZg6dapz/9988w2PPfYYPXr04Pnnnyc1NXed/JCQEGbPnk2PHj3o1q0b8fF/riu+fv16Hn74Ybp06UJcXFy+8X733Xf07NmTjh07snnzZgD69OnDwYMHnduEh4eze/du/v3vf/Pss886k2OAtm3bOjvthYeHM3HiRHr27Ml77713Iy/rNVMFuQDXsiycq1PTExERkeIlKyuLIUOG8N577+VLIi/q1KkTy5YtY8SIEQQFBZGVlcXw4cOZMWMGTZo0ISUlBW9vbwD279/PqlWr8PT0pFOnToSHh+Pl5cWCBQtYvHgxvr6+LFy4kMWLFzN06FAA/P39WblyJcuWLWPRokVMnDgRgLi4OIYMGcJtt93G888/zz/+8Q/nmBITE1mxYgVHjx7lqaee4r777iM0NJR169ZRt25dTp06xalTpwgKCuLXX39lwIABBV6D7OxsYmJibtQlNUwJcgGuZVk4ERERkRvJ3d2dZs2asWLFCl577bWrbn/48GEqVKhAkyZNAChVqpTzuXvvvZfSpUsDULt2bRITE0lOTubXX391TtnIzs6madOmzpiLbaobN27MF198AcCZM2dISEjgnnvuwWKx4O7uzi+//EK9evUA6Ny5M1arlZo1a1KtWjUOHTpE586d+dvf/sbzzz/PunXr6NSp0yVjP3fuHBEREWRkZNCnTx9n4hwaGmr0st1QSpBFREREXIjVamXmzJlERETw9ttv56vUGuXp6en82c3NDZvNhsPh4P7772f69Ms30vLw8HCOw2bLbca0bt06/vjjD9q2bQtASkoKcXFxzgTZYsnf7t5isRAYGEi5cuU4cOAA69at4/XXXwegTp067N27lwYNGuDv709sbCzvvvsuaWl/Nmfx8fExfc43guYgi4iIiLgYHx8foqKiWL16NR9//PElz/v5+TnnDdeqVYvTp0/z008/AbnJa05OzhX33bRpU3744QcSEhIASEtL4/DhwwWOJy4ujnfeeYdNmzaxadMmPvnkk3zzkD/77DPsdjtHjx7l2LFj1KpVC8itBL/zzjskJyfToEEDAJ555hnefvvtfPOb09PNdUm8WVRBFhEREXFB5cqV45133uGJJ54gICAg33M9evRg3LhxeHt7s3z5cmbMmMGECRPIyMjA29ubxYsXX3G/AQEBTJ48mRdffJGsrNyW6S+8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\n",
"text/plain": [
"<Figure size 720x720 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def corrplot(df, method=\"pearson\", annot=True, **kwargs):\n",
" sns.clustermap(\n",
" df.corr(method),\n",
" vmin=-1.0,\n",
" vmax=1.0,\n",
" cmap=\"icefire\",\n",
" method=\"complete\",\n",
" annot=annot,\n",
" **kwargs,\n",
" )\n",
"\n",
"\n",
"corrplot(df_train, annot=None)"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.038428,
"end_time": "2021-10-27T20:04:31.446965",
"exception": false,
"start_time": "2021-10-27T20:04:31.408537",
"status": "completed"
},
"tags": []
},
"source": [
"Groups of highly correlated features often yield interesting loadings.\n",
"\n",
"### PCA Application - Indicate Outliers ###\n",
"\n",
"In Exercise 5, you applied PCA to determine houses that were **outliers**, that is, houses having values not well represented in the rest of the data. You saw that there was a group of houses in the `Edwards` neighborhood having a `SaleCondition` of `Partial` whose values were especially extreme.\n",
"\n",
"Some models can benefit from having these outliers indicated, which is what this next transform will do."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:31.531467Z",
"iopub.status.busy": "2021-10-27T20:04:31.530625Z",
"iopub.status.idle": "2021-10-27T20:04:31.532229Z",
"shell.execute_reply": "2021-10-27T20:04:31.532751Z"
},
"papermill": {
"duration": 0.04703,
"end_time": "2021-10-27T20:04:31.532997",
"exception": false,
"start_time": "2021-10-27T20:04:31.485967",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"def indicate_outliers(df):\n",
" X_new = pd.DataFrame()\n",
" X_new[\"Outlier\"] = (df.Neighborhood == \"Edwards\") & (df.SaleCondition == \"Partial\")\n",
" return X_new\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.03965,
"end_time": "2021-10-27T20:04:31.612676",
"exception": false,
"start_time": "2021-10-27T20:04:31.573026",
"status": "completed"
},
"tags": []
},
"source": [
"You could also consider applying some sort of robust scaler from scikit-learn's `sklearn.preprocessing` module to the outlying values, especially those in `GrLivArea`. [Here](https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html) is a tutorial illustrating some of them. Another option could be to create a feature of \"outlier scores\" using one of scikit-learn's [outlier detectors](https://scikit-learn.org/stable/modules/outlier_detection.html)."
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.039386,
"end_time": "2021-10-27T20:04:31.692256",
"exception": false,
"start_time": "2021-10-27T20:04:31.652870",
"status": "completed"
},
"tags": []
},
"source": [
"## Target Encoding ##\n",
"\n",
"Needing a separate holdout set to create a target encoding is rather wasteful of data. In *Tutorial 6* we used 25% of our dataset just to encode a single feature, `Zipcode`. The data from the other features in that 25% we didn't get to use at all.\n",
"\n",
"There is, however, a way you can use target encoding without having to use held-out encoding data. It's basically the same trick used in cross-validation:\n",
"1. Split the data into folds, each fold having two splits of the dataset.\n",
"2. Train the encoder on one split but transform the values of the other.\n",
"3. Repeat for all the splits.\n",
"\n",
"This way, training and transformation always take place on independent sets of data, just like when you use a holdout set but without any data going to waste.\n",
"\n",
"In the next hidden cell is a wrapper you can use with any target encoder:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"_kg_hide-input": true,
"execution": {
"iopub.execute_input": "2021-10-27T20:04:31.774532Z",
"iopub.status.busy": "2021-10-27T20:04:31.773838Z",
"iopub.status.idle": "2021-10-27T20:04:31.787301Z",
"shell.execute_reply": "2021-10-27T20:04:31.787998Z"
},
"papermill": {
"duration": 0.056889,
"end_time": "2021-10-27T20:04:31.788260",
"exception": false,
"start_time": "2021-10-27T20:04:31.731371",
"status": "completed"
},
"tags": []
},
"outputs": [],
"source": [
"\n",
"class CrossFoldEncoder:\n",
" def __init__(self, encoder, **kwargs):\n",
" self.encoder_ = encoder\n",
" self.kwargs_ = kwargs # keyword arguments for the encoder\n",
" self.cv_ = KFold(n_splits=5)\n",
"\n",
" # Fit an encoder on one split and transform the feature on the\n",
" # other. Iterating over the splits in all folds gives a complete\n",
" # transformation. We also now have one trained encoder on each\n",
" # fold.\n",
" def fit_transform(self, X, y, cols):\n",
" self.fitted_encoders_ = []\n",
" self.cols_ = cols\n",
" X_encoded = []\n",
" for idx_encode, idx_train in self.cv_.split(X):\n",
" fitted_encoder = self.encoder_(cols=cols, **self.kwargs_)\n",
" fitted_encoder.fit(\n",
" X.iloc[idx_encode, :], y.iloc[idx_encode],\n",
" )\n",
" X_encoded.append(fitted_encoder.transform(X.iloc[idx_train, :])[cols])\n",
" self.fitted_encoders_.append(fitted_encoder)\n",
" X_encoded = pd.concat(X_encoded)\n",
" X_encoded.columns = [name + \"_encoded\" for name in X_encoded.columns]\n",
" return X_encoded\n",
"\n",
" # To transform the test data, average the encodings learned from\n",
" # each fold.\n",
" def transform(self, X):\n",
" from functools import reduce\n",
"\n",
" X_encoded_list = []\n",
" for fitted_encoder in self.fitted_encoders_:\n",
" X_encoded = fitted_encoder.transform(X)\n",
" X_encoded_list.append(X_encoded[self.cols_])\n",
" X_encoded = reduce(\n",
" lambda x, y: x.add(y, fill_value=0), X_encoded_list\n",
" ) / len(X_encoded_list)\n",
" X_encoded.columns = [name + \"_encoded\" for name in X_encoded.columns]\n",
" return X_encoded\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.038236,
"end_time": "2021-10-27T20:04:31.864997",
"exception": false,
"start_time": "2021-10-27T20:04:31.826761",
"status": "completed"
},
"tags": []
},
"source": [
"Use it like:\n",
"\n",
"```\n",
"encoder = CrossFoldEncoder(MEstimateEncoder, m=1)\n",
"X_encoded = encoder.fit_transform(X, y, cols=[\"MSSubClass\"]))\n",
"```\n",
"\n",
"You can turn any of the encoders from the [`category_encoders`](http://contrib.scikit-learn.org/category_encoders/) library into a cross-fold encoder. The [`CatBoostEncoder`](http://contrib.scikit-learn.org/category_encoders/catboost.html) would be worth trying. It's similar to `MEstimateEncoder` but uses some tricks to better prevent overfitting. Its smoothing parameter is called `a` instead of `m`.\n",
"\n",
"## Create Final Feature Set ##\n",
"\n",
"Now let's combine everything together. Putting the transformations into separate functions makes it easier to experiment with various combinations. The ones I left uncommented I found gave the best results. You should experiment with you own ideas though! Modify any of these transformations or come up with some of your own to add to the pipeline."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:31.947406Z",
"iopub.status.busy": "2021-10-27T20:04:31.946606Z",
"iopub.status.idle": "2021-10-27T20:04:37.147607Z",
"shell.execute_reply": "2021-10-27T20:04:37.148278Z"
},
"papermill": {
"duration": 5.245116,
"end_time": "2021-10-27T20:04:37.148559",
"exception": false,
"start_time": "2021-10-27T20:04:31.903443",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"0.1381925629969659"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def create_features(df, df_test=None):\n",
" X = df.copy()\n",
" y = X.pop(\"SalePrice\")\n",
" mi_scores = make_mi_scores(X, y)\n",
"\n",
" # Combine splits if test data is given\n",
" #\n",
" # If we're creating features for test set predictions, we should\n",
" # use all the data we have available. After creating our features,\n",
" # we'll recreate the splits.\n",
" if df_test is not None:\n",
" X_test = df_test.copy()\n",
" X_test.pop(\"SalePrice\")\n",
" X = pd.concat([X, X_test])\n",
"\n",
" # Lesson 2 - Mutual Information\n",
" X = drop_uninformative(X, mi_scores)\n",
"\n",
" # Lesson 3 - Transformations\n",
" X = X.join(mathematical_transforms(X))\n",
" X = X.join(interactions(X))\n",
" X = X.join(counts(X))\n",
" # X = X.join(break_down(X))\n",
" X = X.join(group_transforms(X))\n",
"\n",
" # Lesson 4 - Clustering\n",
" # X = X.join(cluster_labels(X, cluster_features, n_clusters=20))\n",
" # X = X.join(cluster_distance(X, cluster_features, n_clusters=20))\n",
"\n",
" # Lesson 5 - PCA\n",
" X = X.join(pca_inspired(X))\n",
" # X = X.join(pca_components(X, pca_features))\n",
" # X = X.join(indicate_outliers(X))\n",
"\n",
" X = label_encode(X)\n",
"\n",
" # Reform splits\n",
" if df_test is not None:\n",
" X_test = X.loc[df_test.index, :]\n",
" X.drop(df_test.index, inplace=True)\n",
"\n",
" # Lesson 6 - Target Encoder\n",
" encoder = CrossFoldEncoder(MEstimateEncoder, m=1)\n",
" X = X.join(encoder.fit_transform(X, y, cols=[\"MSSubClass\"]))\n",
" if df_test is not None:\n",
" X_test = X_test.join(encoder.transform(X_test))\n",
"\n",
" if df_test is not None:\n",
" return X, X_test\n",
" else:\n",
" return X\n",
"\n",
"\n",
"df_train, df_test = load_data()\n",
"X_train = create_features(df_train)\n",
"y_train = df_train.loc[:, \"SalePrice\"]\n",
"\n",
"score_dataset(X_train, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.040196,
"end_time": "2021-10-27T20:04:37.230158",
"exception": false,
"start_time": "2021-10-27T20:04:37.189962",
"status": "completed"
},
"tags": []
},
"source": [
"# Step 4 - Hyperparameter Tuning #\n",
"\n",
"At this stage, you might like to do some hyperparameter tuning with XGBoost before creating your final submission."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:37.316945Z",
"iopub.status.busy": "2021-10-27T20:04:37.312732Z",
"iopub.status.idle": "2021-10-27T20:04:56.016465Z",
"shell.execute_reply": "2021-10-27T20:04:56.017086Z"
},
"papermill": {
"duration": 18.747635,
"end_time": "2021-10-27T20:04:56.017354",
"exception": false,
"start_time": "2021-10-27T20:04:37.269719",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"0.12414985267470383"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train = create_features(df_train)\n",
"y_train = df_train.loc[:, \"SalePrice\"]\n",
"\n",
"xgb_params = dict(\n",
" max_depth=6, # maximum depth of each tree - try 2 to 10\n",
" learning_rate=0.01, # effect of each tree - try 0.0001 to 0.1\n",
" n_estimators=1000, # number of trees (that is, boosting rounds) - try 1000 to 8000\n",
" min_child_weight=1, # minimum number of houses in a leaf - try 1 to 10\n",
" colsample_bytree=0.7, # fraction of features (columns) per tree - try 0.2 to 1.0\n",
" subsample=0.7, # fraction of instances (rows) per tree - try 0.2 to 1.0\n",
" reg_alpha=0.5, # L1 regularization (like LASSO) - try 0.0 to 10.0\n",
" reg_lambda=1.0, # L2 regularization (like Ridge) - try 0.0 to 10.0\n",
" num_parallel_tree=1, # set > 1 for boosted random forests\n",
")\n",
"\n",
"xgb = XGBRegressor(**xgb_params)\n",
"score_dataset(X_train, y_train, xgb)"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.040633,
"end_time": "2021-10-27T20:04:56.100142",
"exception": false,
"start_time": "2021-10-27T20:04:56.059509",
"status": "completed"
},
"tags": []
},
"source": [
"Just tuning these by hand can give you great results. However, you might like to try using one of scikit-learn's automatic [hyperparameter tuners](https://scikit-learn.org/stable/modules/grid_search.html). Or you could explore more advanced tuning libraries like [Optuna](https://optuna.readthedocs.io/en/stable/index.html) or [scikit-optimize](https://scikit-optimize.github.io/stable/).\n",
"\n",
"Here is how you can use Optuna with XGBoost:\n",
"\n",
"```\n",
"import optuna\n",
"\n",
"def objective(trial):\n",
" xgb_params = dict(\n",
" max_depth=trial.suggest_int(\"max_depth\", 2, 10),\n",
" learning_rate=trial.suggest_float(\"learning_rate\", 1e-4, 1e-1, log=True),\n",
" n_estimators=trial.suggest_int(\"n_estimators\", 1000, 8000),\n",
" min_child_weight=trial.suggest_int(\"min_child_weight\", 1, 10),\n",
" colsample_bytree=trial.suggest_float(\"colsample_bytree\", 0.2, 1.0),\n",
" subsample=trial.suggest_float(\"subsample\", 0.2, 1.0),\n",
" reg_alpha=trial.suggest_float(\"reg_alpha\", 1e-4, 1e2, log=True),\n",
" reg_lambda=trial.suggest_float(\"reg_lambda\", 1e-4, 1e2, log=True),\n",
" )\n",
" xgb = XGBRegressor(**xgb_params)\n",
" return score_dataset(X_train, y_train, xgb)\n",
"\n",
"study = optuna.create_study(direction=\"minimize\")\n",
"study.optimize(objective, n_trials=20)\n",
"xgb_params = study.best_params\n",
"```\n",
"\n",
"Copy this into a code cell if you'd like to use it, but be aware that it will take quite a while to run. After it's done, you might enjoy using some of [Optuna's visualizations](https://optuna.readthedocs.io/en/stable/tutorial/10_key_features/005_visualization.html).\n",
"\n",
"# Step 5 - Train Model and Create Submissions #\n",
"\n",
"Once you're satisfied with everything, it's time to create your final predictions! This cell will:\n",
"- create your feature set from the original data\n",
"- train XGBoost on the training data\n",
"- use the trained model to make predictions from the test set\n",
"- save the predictions to a CSV file"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"execution": {
"iopub.execute_input": "2021-10-27T20:04:56.189072Z",
"iopub.status.busy": "2021-10-27T20:04:56.188321Z",
"iopub.status.idle": "2021-10-27T20:05:02.624682Z",
"shell.execute_reply": "2021-10-27T20:05:02.625438Z"
},
"papermill": {
"duration": 6.484914,
"end_time": "2021-10-27T20:05:02.625667",
"exception": false,
"start_time": "2021-10-27T20:04:56.140753",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your submission was successfully saved!\n"
]
}
],
"source": [
"X_train, X_test = create_features(df_train, df_test)\n",
"y_train = df_train.loc[:, \"SalePrice\"]\n",
"\n",
"xgb = XGBRegressor(**xgb_params)\n",
"# XGB minimizes MSE, but competition loss is RMSLE\n",
"# So, we need to log-transform y to train and exp-transform the predictions\n",
"xgb.fit(X_train, np.log(y))\n",
"predictions = np.exp(xgb.predict(X_test))\n",
"\n",
"output = pd.DataFrame({'Id': X_test.index, 'SalePrice': predictions})\n",
"output.to_csv('my_submission.csv', index=False)\n",
"print(\"Your submission was successfully saved!\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"papermill": {
"duration": 0.039199,
"end_time": "2021-10-27T20:05:02.705132",
"exception": false,
"start_time": "2021-10-27T20:05:02.665933",
"status": "completed"
},
"tags": []
},
"source": [
"To submit these predictions to the competition, follow these steps:\n",
"\n",
"1. Begin by clicking on the blue **Save Version** button in the top right corner of the window. This will generate a pop-up window.\n",
"2. Ensure that the **Save and Run All** option is selected, and then click on the blue **Save** button.\n",
"3. This generates a window in the bottom left corner of the notebook. After it has finished running, click on the number to the right of the **Save Version** button. This pulls up a list of versions on the right of the screen. Click on the ellipsis **(...)** to the right of the most recent version, and select **Open in Viewer**. This brings you into view mode of the same page. You will need to scroll down to get back to these instructions.\n",
"4. Click on the **Output** tab on the right of the screen. Then, click on the file you would like to submit, and click on the blue **Submit** button to submit your results to the leaderboard.\n",
"\n",
"You have now successfully submitted to the competition!\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"jupytext": {
"cell_metadata_filter": "-all",
"formats": "ipynb"
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
},
"papermill": {
"default_parameters": {},
"duration": 55.549463,
"end_time": "2021-10-27T20:05:03.556919",
"environment_variables": {},
"exception": null,
"input_path": "__notebook__.ipynb",
"output_path": "__notebook__.ipynb",
"parameters": {},
"start_time": "2021-10-27T20:04:08.007456",
"version": "2.3.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}