From 957cbdcb8a3ff6ffb28ea83955824fe7c0fbccaf Mon Sep 17 00:00:00 2001 From: solegalli Date: Thu, 26 Mar 2026 22:45:37 -0400 Subject: [PATCH 01/21] put fe in minuscule --- docs/user_guide/encoding/index.rst | 76 +++++-------------- .../imputation/AddMissingIndicator.rst | 2 +- .../imputation/ArbitraryNumberImputer.rst | 2 +- .../imputation/CategoricalImputer.rst | 2 +- .../user_guide/imputation/DropMissingData.rst | 6 +- docs/user_guide/imputation/EndTailImputer.rst | 2 +- .../imputation/MeanMedianImputer.rst | 4 +- .../imputation/RandomSampleImputer.rst | 2 +- docs/user_guide/imputation/index.rst | 4 +- 9 files changed, 30 insertions(+), 70 deletions(-) diff --git a/docs/user_guide/encoding/index.rst b/docs/user_guide/encoding/index.rst index 2b82c0a11..2d2a7afe5 100644 --- a/docs/user_guide/encoding/index.rst +++ b/docs/user_guide/encoding/index.rst @@ -7,9 +7,8 @@ Categorical Encoding ==================== Categorical encoding is the process of converting categorical variables into numeric -features. It is an important feature engineering step in most data science projects, -as it ensures that machine learning algorithms can appropriately handle and interpret -categorical data. +features. It is an important feature engineering step, as it ensures that machine +learning algorithms can appropriately handle and interpret categorical data. There are various categorical encoding methods that we can use to encode categorical features. One hot encoding and ordinal encoding are the most well known, but other @@ -19,7 +18,7 @@ after training machine learning models. Feature-engine's categorical encoders replace the variables' categorical values by estimated or arbitrary numerical values through various encoding methods. In this page, we will discuss categorical features and the importance of categorical encoding in more -detail, and then introduce the various encoding techniques supported by Feature-engine. +detail, and then introduce the various encoding techniques supported by feature-engine. Categorical features -------------------- @@ -116,13 +115,13 @@ Overfitting Overfitting occurs when a machine learning model learns the noise and random fluctuations present in the training data in addition to the underlying relationships. This results in a -model that performs exceptionally well on the training data but fails to generalize on unseen +model that performs exceptionally well on the training data but fails to generalise on unseen data (i.e., the model shows low performance on the validation data set). High cardinality features can lead to overfitting, particularly in tree-based models such as decision trees or random forests. Overfitting occurs because tree-based models will try to perform extensive splitting on the high cardinality feature, making the final tree overly -complex. This often leads to poor generalization. Reducing cardinality, often helps mitigate +complex. This often leads to poor generalisation. Reducing cardinality, often helps mitigate the problem. Encoding pipeline @@ -143,7 +142,7 @@ encoding and ordinal encoding are the most commonly used, but other methods can cardinality and account for unseen categories. In the rest of this page, we'll introduce various methods for encoding categorical data, and -highlight the Feature-engine transformer that can carry out this transformation. +highlight the feature-engine transformer that can carry out this transformation. One hot encoding ~~~~~~~~~~~~~~~~ @@ -178,7 +177,7 @@ Ordinal Encoding ~~~~~~~~~~~~~~~~ In ordinal encoding, each category is replaced with an integer value. These numbers are, -in general, assigned arbitrarily. With Feature-engine's :class:`OrdinalEncoder`, we have the +in general, assigned arbitrarily. With feature-engine's :class:`OrdinalEncoder`, we have the option to assign integers arbitrarily, or alternatively, ordered based on the mean target value per category. @@ -311,7 +310,7 @@ blending similar categories together. Feature-engine's :class:`StringSimilarityEncoder` implements string similarity encoding. -**Summary of Feature-engine's encoders characteristics** +**Summary of fengine's encoders characteristics** =================================== ============ ================= ============== =============================================================== Transformer Regression Classification Multi-class Description @@ -333,7 +332,7 @@ and make the transformers also accept numerical variables as input. **Monotonicity** -Most Feature-engine's encoders will return, or attempt to return monotonic relationships +Most feature-engine's encoders will return, or attempt to return monotonic relationships between the encoded variable and the target. A monotonic relationship is one in which the variable value increases as the values in the other variable increase, or decrease. See the following illustration as examples: @@ -347,13 +346,13 @@ shallower decision trees. **Regression vs Classification** -Most Feature-engine's encoders are suitable for both regression and classification, with +Most feature-engine's encoders are suitable for both regression and classification, with the exception of the :class:`WoEEncoder()` which is designed solely for **binary** classification. **Multi-class classification** -Finally, some Feature-engine's encoders can handle multi-class targets off-the-shelf for +Finally, some feature-engine's encoders can handle multi-class targets off-the-shelf for example the :class:`OneHotEncoder()`, the :class:`CountFrequencyEncoder()` and the :class:`DecisionTreeEncoder()`. @@ -365,7 +364,7 @@ defeat the purpose of these encoding techniques. Alternative encoding techniques ------------------------------- -In addition to the categorical encoding methods supported by Feature-engine, there are +In addition to the categorical encoding methods supported by feature-engine, there are other methods like feature hashing or binary encoding. These methods are supported by the Python library category encoders. For the time being, we decided not to support these transformations because they return features that are not easy to interpret. And hence, @@ -377,52 +376,13 @@ Additional resources For tutorials about this and other feature engineering methods check out these resources: +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| - -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. Encoders -------- diff --git a/docs/user_guide/imputation/AddMissingIndicator.rst b/docs/user_guide/imputation/AddMissingIndicator.rst index 628ebff12..27d3a7c87 100644 --- a/docs/user_guide/imputation/AddMissingIndicator.rst +++ b/docs/user_guide/imputation/AddMissingIndicator.rst @@ -111,4 +111,4 @@ For tutorials about missing data imputation methods check out these resources: Both our book and courses are suitable for beginners and more advanced data scientists alike. By purchasing them you are supporting `Sole `_, -the main developer of Feature-engine. \ No newline at end of file +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/imputation/ArbitraryNumberImputer.rst b/docs/user_guide/imputation/ArbitraryNumberImputer.rst index a17e15e74..f87f83e62 100644 --- a/docs/user_guide/imputation/ArbitraryNumberImputer.rst +++ b/docs/user_guide/imputation/ArbitraryNumberImputer.rst @@ -128,4 +128,4 @@ For tutorials about missing data imputation methods check out these resources: Both our book and courses are suitable for beginners and more advanced data scientists alike. By purchasing them you are supporting `Sole `_, -the main developer of Feature-engine. \ No newline at end of file +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/imputation/CategoricalImputer.rst b/docs/user_guide/imputation/CategoricalImputer.rst index 024da71b2..925e970d2 100644 --- a/docs/user_guide/imputation/CategoricalImputer.rst +++ b/docs/user_guide/imputation/CategoricalImputer.rst @@ -321,4 +321,4 @@ For tutorials about missing data imputation methods check out these resources: Both our book and courses are suitable for beginners and more advanced data scientists alike. By purchasing them you are supporting `Sole `_, -the main developer of Feature-engine. +the main developer of feature-engine. diff --git a/docs/user_guide/imputation/DropMissingData.rst b/docs/user_guide/imputation/DropMissingData.rst index 761af9d99..c5e16dd7b 100644 --- a/docs/user_guide/imputation/DropMissingData.rst +++ b/docs/user_guide/imputation/DropMissingData.rst @@ -408,7 +408,7 @@ When we dropna from a dataframe, we then need to realign the target. We saw prev that we can do that by using the method `transform_x_y`. We can align the target with the resulting dataframe automatically from within a -pipeline as well, by utilizing Feature-engine's pipeline. +pipeline as well, by utilizing feature-engine's pipeline. Let's start by importing the necessary libraries: @@ -550,7 +550,7 @@ instead, check out our :ref:`missing data imputation ` tr Drop columns with nan ^^^^^^^^^^^^^^^^^^^^^ -At the moment, Feature-engine does not have transformers that will find columns with a +At the moment, feature-engine does not have transformers that will find columns with a certain percentage of missing values and drop them. Instead, you can find those columns manually, and then drop them with the help of `DropFeatures` from the selection module. @@ -573,4 +573,4 @@ For tutorials about missing data imputation methods check out these resources: Both our book and courses are suitable for beginners and more advanced data scientists alike. By purchasing them you are supporting `Sole `_, -the main developer of Feature-engine. \ No newline at end of file +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/imputation/EndTailImputer.rst b/docs/user_guide/imputation/EndTailImputer.rst index 77e0484fe..23b4a17ae 100644 --- a/docs/user_guide/imputation/EndTailImputer.rst +++ b/docs/user_guide/imputation/EndTailImputer.rst @@ -120,4 +120,4 @@ For tutorials about missing data imputation methods check out these resources: Both our book and courses are suitable for beginners and more advanced data scientists alike. By purchasing them you are supporting `Sole `_, -the main developer of Feature-engine. \ No newline at end of file +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/imputation/MeanMedianImputer.rst b/docs/user_guide/imputation/MeanMedianImputer.rst index 2520a5e34..90dbf5ec1 100644 --- a/docs/user_guide/imputation/MeanMedianImputer.rst +++ b/docs/user_guide/imputation/MeanMedianImputer.rst @@ -204,7 +204,7 @@ Imputing missing values alongside missing indicators ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mean or median imputation are commonly done alongside adding missing indicators. -We can add missing indicators with :class:`AddMissingIndicator()` from Feature-engine. +We can add missing indicators with :class:`AddMissingIndicator()` from feature-engine. We can chain :class:`AddMissingIndicator()` with :class:`MeanMedianImputer()` using a `scikit-learn pipeline `_. @@ -310,4 +310,4 @@ For tutorials about missing data imputation methods check out these resources: Both our book and courses are suitable for beginners and more advanced data scientists alike. By purchasing them you are supporting `Sole `_, -the main developer of Feature-engine. \ No newline at end of file +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/imputation/RandomSampleImputer.rst b/docs/user_guide/imputation/RandomSampleImputer.rst index 972569421..03a1d7a9a 100644 --- a/docs/user_guide/imputation/RandomSampleImputer.rst +++ b/docs/user_guide/imputation/RandomSampleImputer.rst @@ -151,4 +151,4 @@ For tutorials about missing data imputation methods check out these resources: Both our book and courses are suitable for beginners and more advanced data scientists alike. By purchasing them you are supporting `Sole `_, -the main developer of Feature-engine. \ No newline at end of file +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/imputation/index.rst b/docs/user_guide/imputation/index.rst index 3d940010b..54f035a78 100644 --- a/docs/user_guide/imputation/index.rst +++ b/docs/user_guide/imputation/index.rst @@ -76,7 +76,7 @@ have missing values. In this scenario, we can predict the missing grade values b on existing grade data, using age and IQ as predictors. Subsequently, we can apply the same regression imputation approach to the other variables (age and IQ) in subsequent iterations. -Feature-engine currenty supports univariate imputation strategies. For multivariate imputation, check out Scikit-learn's `iterative imputer `_. +Feature-engine currently supports univariate imputation strategies. For multivariate imputation, check out Scikit-learn's `iterative imputer `_. Feature-engine's imputation methods @@ -331,7 +331,7 @@ For tutorials about missing data imputation methods check out these resources: Both our book and courses are suitable for beginners and more advanced data scientists alike. By purchasing them you are supporting `Sole `_, -the main developer of Feature-engine. +the main developer of feature-engine. Imputers From 72060d93c269af88a4cb6d205e5531158e9dd61a Mon Sep 17 00:00:00 2001 From: solegalli Date: Thu, 26 Mar 2026 23:08:19 -0400 Subject: [PATCH 02/21] update cat enc index --- docs/user_guide/encoding/index.rst | 44 ++++++++++++++++-------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/docs/user_guide/encoding/index.rst b/docs/user_guide/encoding/index.rst index 2d2a7afe5..587033cb3 100644 --- a/docs/user_guide/encoding/index.rst +++ b/docs/user_guide/encoding/index.rst @@ -11,7 +11,7 @@ features. It is an important feature engineering step, as it ensures that machin learning algorithms can appropriately handle and interpret categorical data. There are various categorical encoding methods that we can use to encode categorical -features. One hot encoding and ordinal encoding are the most well known, but other +features. One-hot encoding and ordinal encoding are the most well known, but other encoding techniques can help tackle high cardinality and rare categories before and after training machine learning models. @@ -54,14 +54,14 @@ We can identify categorical features by inspecting their data types. With pandas we can obtain the data types of all variables in a dataframe; features with non-numeric data types such as *string*, *object* or *categorical* are, in general, categorical. -Categorical features can also be numeric, however, like for example the features *Store ID*, +Categorical features can also be numeric, for example, the features *Store ID*, *SKU ID* or *Zip Code*. Although these variables have numeric values, they are categorical. Cardinality ----------- -**Cardinality** refers to the number of unique categories of a categorical variable. F -or example, the cardinality of the variable 'size', which takes the values 'small', +**Cardinality** refers to the number of unique categories of a categorical variable. For +example, the cardinality of the variable 'size', which takes the values 'small', 'medium' and 'large' is 3. A categorical variable is said to have a **low cardinality** when the number of distinct @@ -78,7 +78,7 @@ Unseen categories ----------------- **Unseen categories** are categorical values that appear in the test or validation -datasets, or even in live data after model deployment, that were not present in the +datasets, or even in live data after model deployment, but were not present in the training data, and therefore were not **seen** by the machine learning model. Unseen categories are challenging for various reasons. Firstly, when we create mappings @@ -87,7 +87,7 @@ mappings for those categories *present* in the training set. Hence, we'd lack a for a new, unseen value. We may feel tempted to replace unseen categories by 0, or an arbitrary value, or just have -0s in all dummy variables if we used one hot encoding, but this may make the machine learning +0s in all dummy variables if we used one-hot encoding, but this may make the machine learning model behave unexpectedly leading to inaccurate predictions. Ideally, we want to account for the potential presence of unseen categories during the @@ -137,41 +137,41 @@ from the **training data**. Encoding methods ---------------- -There are various methods to transform categorical variables into numerical features. One hot +There are various methods to transform categorical variables into numerical features. One-hot encoding and ordinal encoding are the most commonly used, but other methods can mitigate high cardinality and account for unseen categories. In the rest of this page, we'll introduce various methods for encoding categorical data, and highlight the feature-engine transformer that can carry out this transformation. -One hot encoding +One-hot encoding ~~~~~~~~~~~~~~~~ One-hot encoding (OHE) consists of replacing categorical variables by a set of binary variables each representing one of the unique categories in the variable. The binary variable takes the value 1, if the observation shows the category, or alternatively, 0. -One hot encoding is particularly suitable for linear models because it treats each category +One-hot encoding is particularly suitable for linear models because it treats each category independently, and linear models can process binary variables effectively. -One hot encoding, however, increases the dimensionality of the dataset, as it adds a new +One-hot encoding, however, increases the dimensionality of the dataset, as it adds a new variable per category. Hence, OHE may not be suitable for encoding high cardinality features, as it can drastically increase the dimensionality of the dataset, often leading to a set of variables that are highly correlated or even identical. -Feature-engine's :class:`OneHotEncoder` implements one hot encoding. +Feature-engine's :class:`OneHotEncoder` implements one-hot encoding. -One hot encoding of frequent categories +One-hot encoding of frequent categories ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To prevent a massive increase of the feature space, some data scientists create binary -variables through one hot encoding of the **most frequent categories** in the variable. +variables through one-hot encoding of the **most frequent categories** in the variable. Less frequent values are treated collectively and represented as 0 in all the binary variables created for the frequent categories. -One hot encoding of frequent categories can then help tackle high cardinality and also +One-hot encoding of frequent categories can then help tackle high cardinality and also unseen categories, because unseen categories will be also encoded as an infrequent value. -Feature-engine's :class:`OneHotEncoder` can implement one hot encoding of frequent categories. +Feature-engine's :class:`OneHotEncoder` can implement one-hot encoding of frequent categories. Ordinal Encoding ~~~~~~~~~~~~~~~~ @@ -268,7 +268,7 @@ tree model. In decision tree encoding, a decision tree is trained using the categorical feature to predict the target variable. The decision tree splits the data based of each category, eventually leading the observations to a final leaf. Each category is then replaced by -the prediction of the tree, which consists of the mean target value calculated over the +the prediction of the tree, which consists of the mean target value calculated using the observations that ended in that leaf. Feature-engine's :class:`DecisionTreeEncoder` implements decision tree encoding. @@ -310,7 +310,8 @@ blending similar categories together. Feature-engine's :class:`StringSimilarityEncoder` implements string similarity encoding. -**Summary of fengine's encoders characteristics** +Summary of feature-engine's encoders characteristics +---------------------------------------------------- =================================== ============ ================= ============== =============================================================== Transformer Regression Classification Multi-class Description @@ -330,7 +331,8 @@ Feature-engine's categorical encoders work only with categorical variables by de From version 1.1.0, you have the option to set the parameter `ignore_format` to `False`, and make the transformers also accept numerical variables as input. -**Monotonicity** +Monotonicity +~~~~~~~~~~~~ Most feature-engine's encoders will return, or attempt to return monotonic relationships between the encoded variable and the target. A monotonic relationship is one in which @@ -344,13 +346,15 @@ See the following illustration as examples: Monotonic relationships tend to help improve the performance of linear models and build shallower decision trees. -**Regression vs Classification** +Regression vs Classification +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Most feature-engine's encoders are suitable for both regression and classification, with the exception of the :class:`WoEEncoder()` which is designed solely for **binary** classification. -**Multi-class classification** +Multi-class classification +~~~~~~~~~~~~~~~~~~~~~~~~~~ Finally, some feature-engine's encoders can handle multi-class targets off-the-shelf for example the :class:`OneHotEncoder()`, the :class:`CountFrequencyEncoder()` and the From 2a02bb93f0b4d738bdcd830e687c4e53a7c8d7ba Mon Sep 17 00:00:00 2001 From: solegalli Date: Fri, 27 Mar 2026 09:14:50 -0400 Subject: [PATCH 03/21] updated ohe --- docs/user_guide/encoding/OneHotEncoder.rst | 115 +++++++-------------- 1 file changed, 39 insertions(+), 76 deletions(-) diff --git a/docs/user_guide/encoding/OneHotEncoder.rst b/docs/user_guide/encoding/OneHotEncoder.rst index 1408e3f1b..007bfd244 100644 --- a/docs/user_guide/encoding/OneHotEncoder.rst +++ b/docs/user_guide/encoding/OneHotEncoder.rst @@ -6,12 +6,11 @@ OneHotEncoder ============= -One-hot encoding is a method used to represent categorical data, where each category -is represented by a binary variable. The binary variable takes the value 1 if the -category is present and 0 otherwise. The binary variables are also known as dummy -variables. +With one-hot encoding, each category is represented by a binary variable. The binary +variable takes the value 1 if the category is present and 0 otherwise. The binary +variables are also known as dummy variables. -To represent the categorical feature "is-smoker" with categories "Smoker" and +For example, to represent the categorical feature "is-smoker" with categories "Smoker" and "Non-smoker", we can generate the dummy variable "Smoker", which takes 1 if the person smokes and 0 otherwise. We can also generate the variable "Non-smoker", which takes 1 if the person does not smoke and 0 otherwise. @@ -81,10 +80,10 @@ models evaluate all features during fit, thus, with k-1 they have all the inform about the original categorical variable. There are a few occasions in which we may prefer to encode the categorical variables -with k binary variables. +with k binary variables, which are, when training decision trees based models or performing +feature selection. -Encode into k dummy variables if training decision trees based models or performing -feature selection. Decision tree based models and many feature selection algorithms +Decision tree based models and many feature selection algorithms evaluate variables or groups of variables separately. Thus, if encoding into k-1, the last category will not be examined. In other words, we lose the information contained in that category. @@ -150,16 +149,16 @@ are those with the greatest number of observations. The remaining categories wil zeroes in each one of the derived dummies. This behaviour is useful when the categorical variables are highly cardinal to control the expansion of the feature space. -**Note** +.. note:: -The parameter `drop_last` is ignored when encoding the most popular categories. + The parameter `drop_last` is ignored when encoding the most popular categories. Python implementation --------------------- -Let's look at an example of one hot encoding, using Feature-engine's :class:`OneHotEncoder()` -utilizing the Titanic Dataset. +Let's look at an example of one hot encoding, using feature-engine's :class:`OneHotEncoder()` +utilising the Titanic Dataset. We'll start by importing the libraries, functions and classes, and loading the data into a pandas dataframe and dividing it into a training and a testing set: @@ -200,6 +199,9 @@ Let's explore the cardinality of 4 of the categorical features: X_train[['sex', 'pclass', 'cabin', 'embarked']].nunique() +We see that the variable sex has 2 categories, pclass has 3 categories, the variable +cabin has 9 categories, and the variable embarked has 4 categories: + .. code:: python sex 2 @@ -208,8 +210,6 @@ Let's explore the cardinality of 4 of the categorical features: embarked 4 dtype: int64 -We see that the variable sex has 2 categories, pclass has 3 categories, the variable -cabin has 9 categories, and the variable embarked has 4 categories. Let's now set up the OneHotEncoder to encode 2 of the categorical variables into k-1 dummy variables: @@ -230,15 +230,16 @@ attribute `encoder_dict_`. encoder.encoder_dict_ +The `encoder_dict_` contains the categories that will be represented by dummy variables +for each categorical variable: + .. code:: python {'cabin': ['M', 'E', 'C', 'D', 'B', 'A', 'F', 'T'], 'embarked': ['S', 'C', 'Q']} -The `encoder_dict_` contains the categories that will be represented by dummy variables -for each categorical variable. -With transform, we go ahead and encode the variables. Note that by default, the +With transform, we go ahead and encode the variables. Note that by default, :class:`OneHotEncoder()` drops the original categorical variables, which are now represented by the one-hot array. @@ -301,17 +302,21 @@ categories. We can find the categorical variables like this: encoder.variables_ +Below we see all categorical variables in the Titanic dataset: + .. code:: python ['sex', 'cabin', 'embarked'] -And we can identify the unique categories for each variables like this: +We can identify the unique categories for each variables like this: .. code:: python encoder.encoder_dict_ +Below, we see the unique categories per variable: + .. code:: python {'sex': ['female'], @@ -327,7 +332,7 @@ We can now encode the categorical variables: print(train_t.head()) -And here we see the resulting dataframe: +Here we see the resulting dataframe: .. code:: python @@ -356,7 +361,7 @@ And here we see the resulting dataframe: Encoding variables of type numeric ---------------------------------- -By default, Feature-engine's :class:`OneHotEncoder()` will only encode categorical +By default, feature-engine's :class:`OneHotEncoder()` will only encode categorical features. If you attempt to encode a variable of numeric dtype, it will raise an error. To avoid this error, you can instruct the encoder to ignore the data type format as follows: @@ -399,7 +404,7 @@ the transformer into 2 dummies: Encoding binary variables into 1 dummy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -With Feature-engine's :class:`OneHotEncoder()` we can encode all categorical variables +With feature-engine's :class:`OneHotEncoder()` we can encode all categorical variables into k dummies and the binary variables into k-1 by setting the encoder as follows: .. code:: python @@ -415,7 +420,7 @@ into k dummies and the binary variables into k-1 by setting the encoder as follo print(train_t.head()) -As we see in the following input, for the variable sex, we have only have 1 dummy, +As we see in the following output, for the variable sex, we have only have 1 dummy, and for all the rest we have k dummies: .. code:: python @@ -526,57 +531,15 @@ For alternative encoding methods used in data science check the :class:`OrdinalE and other encoders included in the :ref:`encoding module `. -Tutorials, books and courses ----------------------------- - -For more details into :class:`OneHotEncoder()`'s functionality visit: - -- `Jupyter notebook `_ - -For tutorials about this and other data preprocessing methods check out our online course: - -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| - -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. \ No newline at end of file +Additional resources +-------------------- + +For tutorials about this and other feature engineering methods check out these resources: + +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. + +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file From 8de87b59bd2fe2d5ac07677355f32d69e70102f5 Mon Sep 17 00:00:00 2001 From: solegalli Date: Fri, 27 Mar 2026 10:01:27 -0400 Subject: [PATCH 04/21] update ordinal encoder --- docs/user_guide/encoding/OrdinalEncoder.rst | 118 ++++++++------------ 1 file changed, 44 insertions(+), 74 deletions(-) diff --git a/docs/user_guide/encoding/OrdinalEncoder.rst b/docs/user_guide/encoding/OrdinalEncoder.rst index b7283a9bf..18510d57c 100644 --- a/docs/user_guide/encoding/OrdinalEncoder.rst +++ b/docs/user_guide/encoding/OrdinalEncoder.rst @@ -50,8 +50,11 @@ Ordered encoding attempts to define a monotonic relationship between the encoded method helps machine learning algorithms, particularly linear models (like linear regression), better capture and learn the relationship between the encoded feature and the target. -Keep in mind that ordered ordinal encoding will create a monotonic relationship between the encoded variable and the target -variable **only** when *there is* an intrinsic relationship between the categories and the target variable. +.. note:: + + Keep in mind that ordered ordinal encoding will create a monotonic relationship between the encoded variable and the target + variable **only** when *there is* an intrinsic relationship between the categories and the target variable. + Unseen categories ----------------- @@ -60,9 +63,12 @@ Ordinal encoding can't inherently deal with unseen categories. **Unseen categories** are categorical values that appear in test, validation, or live data but were not present in the training data. These categories are problematic because the encoding methods generate mappings only for categories present -in the training data. This means that we would lack encodings for any new, unseen category values. Unseen categories cause -errors during inference time (the phase when the machine learning model is used to make predictions on new data) because our -feature engineering pipeline is unable to convert that value into a number. +in the training data. This means that we would lack encodings for any new, unseen category values. + +.. note:: + + Unseen categories cause errors during inference time (the phase when the machine learning model is used to make predictions on new data) because our + feature engineering pipeline is unable to convert that value into a number. Ordinal encoding by itself does not deal with unseen categories. However, we could replace the unseen category with an arbitrary value, such as -1 (remember that ordinal encoding starts at 0). This procedure might work well for linear models @@ -88,11 +94,14 @@ unseen categories; and it is not suitable for a large number of categories, i.e. Ordinal encoding vs label encoding ---------------------------------- -Ordinal encoding is sometimes also referred to as label encoding. They follow the same procedure. Scikit-learn provides -2 different transformers: the OrdinalEncoder and the LabelEncoder. Both replace values, that is, categories, with ordinal -data. The OrdinalEncoder is designed to transform the predictor variables (those in the training set), while the LabelEncoder -is designed to transform the target variable. The end result of both transformers is the same; the original values are -replaced by ordinal numbers. +Ordinal encoding is sometimes also referred to as label encoding. They follow the same procedure. + +.. tip:: + + Scikit-learn provides 2 different transformers: the `OrdinalEncoder` and the `LabelEncoder`. Both replace categories with ordinal + data. However, `OrdinalEncoder` is designed to transform the predictor variables (those in the training set), while `LabelEncoder` + is designed to transform the target variable. The end result of both transformers is the same; the original values are + replaced by ordinal numbers. In our view, this has raised some confusion as to whether label encoding and ordinal encoding consist of different ways of preprocessing categorical data. Some argue that label encoding consists of replacing categories with numbers assigned @@ -104,7 +113,7 @@ OrdinalEncoder Feature-engine's :class:`OrdinalEncoder()` implements ordinal encoding. That is, it encodes categorical features by replacing each category with a unique number ranging from 0 to k-1, where 'k' is the distinct number of categories in -the dataset. +the variable. :class:`OrdinalEncoder()` supports both **arbitrary** and **ordered** encoding methods. The desired approach can be specified using the `encoding_method` parameter that accepts either **"arbitrary"** or **"ordered"**. If not defined, @@ -125,14 +134,14 @@ category, in which case it will be encoded as `np.nan`, or encode it into -1. Yo Python Implementation --------------------- -In the rest of the page, we'll show different ways how we can use ordinal encoding through Feature-engine's +In the rest of the page, we'll show different ways how we can use ordinal encoding through feature-engine's :class:`OrdinalEncoder()`. Arbitrary ordinal encoding ~~~~~~~~~~~~~~~~~~~~~~~~~~ -We'll show how ordinal encoding is implemented by Feature-engine's :class:`OrdinalEncoder()` using the **Titanic Dataset**. +We'll show how ordinal encoding is implemented by feature-engine's :class:`OrdinalEncoder()` using the **Titanic Dataset**. Let's load the dataset and split it into train and test sets: @@ -168,17 +177,19 @@ We see the Titanic dataset below: 686 3 female 22.000000 0 0 7.7250 M Q -Let's set up the :class:`OrdinalEncoder()` to encode the categorical variables `cabin', `embarked`, and `sex` with +Let's set up the :class:`OrdinalEncoder()` to encode the categorical variables cabin, embarked, and sex with integers assigned arbitrarily: .. code:: python - encoder = OrdinalEncoder( - encoding_method='arbitrary', - variables=['cabin', 'embarked', 'sex']) + encoder = OrdinalEncoder( + encoding_method='arbitrary', + variables=['cabin', 'embarked', 'sex']) -:class:`OrdinalEncoder()` will encode **all** categorical variables in the training set by default, unless we specify -which variables to encode, as we did in the previous code block. +.. tip:: + + :class:`OrdinalEncoder()` will encode **all** categorical variables in the training set by default, unless we specify + which variables to encode, as we did in the previous code block. Let's fit the encoder so that it learns the mappings for each category: @@ -304,9 +315,10 @@ If you want to see the resulting dataframe, go ahead and execute `train_t.head() Ordered ordinal encoding ~~~~~~~~~~~~~~~~~~~~~~~~ -Ordered encoding consists of assigning the integers based on the mean target. +Ordered encoding consists of assigning the integers based on the mean target value. + We will use the **California Housing Dataset** to demonstrate ordered encoding. This dataset contains numeric features -such as *MedInc*, *HouseAge* and *AveRooms*, among others. The target variable is *MedHouseVal* i.e., the median house +such as *MedInc*, *HouseAge* and *AveRooms*, among others. The target variable is *MedHouseVal*, i.e., the median house value for California districts, expressed in hundreds of thousands of dollars ($100,000). Let's first set up the dataset. @@ -411,8 +423,10 @@ variable to the `fit()` method: X_train_t = ordered_encoder.fit_transform(X_train, y_train) X_test_t = ordered_encoder.transform(X_test) -Note that we first fit the encoder on the training data and then transformed both the training and test data, using the -mappings learned from the training set. +.. tip:: + + Note that we first fit the encoder on the training data and then transformed both the training and test data, using the + mappings learned from the training set. Let's display the resulting dataframe: @@ -510,56 +524,12 @@ The power of ordinal ordered encoder resides in its intrinsic capacity of findin Additional resources -------------------- -In the following notebook, you can find more details into the :class:`OrdinalEncoder()`'s -functionality and example plots with the encoded variables: - -- `Jupyter notebook `_ +For tutorials about this and other feature engineering methods check out these resources: -For more details about this and other feature engineering methods check out these resources and tutorials: +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. - -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| - -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. \ No newline at end of file +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file From eef8e7e2d0ed6b783ac6a5d727e03d187b704d3e Mon Sep 17 00:00:00 2001 From: solegalli Date: Fri, 27 Mar 2026 10:10:42 -0400 Subject: [PATCH 05/21] update count encoder --- .../encoding/CountFrequencyEncoder.rst | 69 +++---------------- 1 file changed, 8 insertions(+), 61 deletions(-) diff --git a/docs/user_guide/encoding/CountFrequencyEncoder.rst b/docs/user_guide/encoding/CountFrequencyEncoder.rst index 3a14b1adb..d5cb9e7e9 100644 --- a/docs/user_guide/encoding/CountFrequencyEncoder.rst +++ b/docs/user_guide/encoding/CountFrequencyEncoder.rst @@ -37,7 +37,7 @@ This, of course, can result in the loss of information by placing two categories are otherwise different in the same pot. But on the other hand, if we are using count encoding or frequency encoding, we have reasons to believe that the count or the frequency are a good indicator of predictive performance or somehow capture data insight, so that -categories with similar counts would show similar patterns or behaviors. +categories with similar counts would show similar patterns or behaviours. Count and Frequency encoding with Feature-engine ------------------------------------------------ @@ -163,7 +163,7 @@ Now, we can go ahead and encode the variables: print(train_t.head()) We see the resulting dataframe where the categorical features are now replaced with -integer values corresponding to the category counts: +the category counts: .. code:: python @@ -251,65 +251,12 @@ values. Additional resources -------------------- -In the following notebook, you can find more details into the :class:`CountFrequencyEncoder()` -functionality and example plots with the encoded variables: +For tutorials about this and other feature engineering methods check out these resources: -- `Jupyter notebook `_ - -For more details about this and other feature engineering methods check out these resources: - - -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -.. figure:: ../../images/fetsf.png - :width: 300 - :figclass: align-center - :align: right - :target: https://www.trainindata.com/p/feature-engineering-for-forecasting - - Feature Engineering for Time Series Forecasting - - -| -| -| -| -| -| -| -| -| -| - -Our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. Both our book and courses are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. \ No newline at end of file +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file From f1a06fb32cc35fe36aa06678b14d4a5ee8f53bc0 Mon Sep 17 00:00:00 2001 From: solegalli Date: Fri, 27 Mar 2026 10:32:34 -0400 Subject: [PATCH 06/21] update mean encoder --- docs/user_guide/encoding/MeanEncoder.rst | 96 ++++++------------------ 1 file changed, 24 insertions(+), 72 deletions(-) diff --git a/docs/user_guide/encoding/MeanEncoder.rst b/docs/user_guide/encoding/MeanEncoder.rst index ef6d37fb1..c39690af3 100644 --- a/docs/user_guide/encoding/MeanEncoder.rst +++ b/docs/user_guide/encoding/MeanEncoder.rst @@ -92,7 +92,7 @@ rare categories together by using the :class:`RareLabelEncoder`. Alternative Python implementations of mean encoding --------------------------------------------------- -In Feature-engine, we blend the probabilities considering the target variability and the +In feature-engine, we blend the probabilities considering the target variability and the category frequency. In the original paper, there are alternative formulations to determine the blending. If you want to check those out, use the transformers from the Python library Category encoders: @@ -137,8 +137,8 @@ Mean encoding and machine learning Feature-engine's :class:`MeanEncoder()` can perform mean encoding for regression and binary classification datasets. At the moment, we do not support multi-class targets. -Python examples ---------------- +Python implementation +--------------------- In the following sections, we'll show the functionality of :class:`MeanEncoder()` using the Titanic Dataset. @@ -151,9 +151,11 @@ First, let's load the libraries, functions and classes: from feature_engine.datasets import load_titanic from feature_engine.encoding import MeanEncoder -To avoid data leakage, it is important to separate the data into training and test sets. -The mean target values, with or without smoothing, will be determined using the training -data only. +.. note:: + + To avoid data leakage, it is important to separate the data into training and test sets. + The mean target values, with or without smoothing, will be determined using the training + data only. Let's load and split the data: @@ -185,7 +187,7 @@ We see the resulting dataframe containing 3 categorical columns: sex, cabin and Simple mean encoding --------------------- +~~~~~~~~~~~~~~~~~~~~ Let's set up the :class:`MeanEncoder()` to replace the categories in the categorical features with the target mean, without smoothing: @@ -249,7 +251,7 @@ with the target mean values: Mean encoding with smoothing ----------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ By default, :class:`MeanEncoder()` determines the mean target values without blending. If we want to apply smoothing to control the cardinality of the variable and avoid @@ -325,10 +327,10 @@ Below we see the resulting dataframe with the encoded features: We can now use this dataframes to train machine learning models for regression or classification. -Mean encoding variables with numerical values ---------------------------------------------- +Mean encoding numerical variables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -:class:`MeanEncoder()`, and all Feature-engine encoders, have been designed to work with +:class:`MeanEncoder()`, and all feature-engine encoders, have been designed to work with variables of type object or categorical by default. If you want to encode variables that are numeric, you need to instruct the transformer to ignore the data type: @@ -344,72 +346,22 @@ are numeric, you need to instruct the transformer to ignore the data type: After encoding the features we can use the data sets to train machine learning algorithms. -Last thing to note before closing in is that mean encoding does not increase the -dimensionality of the resulting dataframes: from 1 categorical feature, we obtain 1 -encoded variable. Hence, this encoding method is suitable for predictive modeling that -uses models that are sensitive to the size of the feature space. +.. note:: + + Last thing to note before closing in is that mean encoding does not increase the + dimensionality of the resulting dataframes: from 1 categorical feature, we obtain 1 + encoded variable. Hence, this encoding method is suitable for predictive modeling that + uses models that are sensitive to the size of the feature space. Additional resources -------------------- -In the following notebook, you can find more details into the :class:`MeanEncoder()` -functionality and example plots with the encoded variables: - -- `Jupyter notebook `_ - For tutorials about this and other feature engineering methods check out these resources: - -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -.. figure:: ../../images/fetsf.png - :width: 300 - :figclass: align-center - :align: right - :target: https://www.trainindata.com/p/feature-engineering-for-forecasting - - Feature Engineering for Time Series Forecasting - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. Both our book and courses are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. \ No newline at end of file +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file From 26c3074195c91808fe0d7c62071602ce929d490b Mon Sep 17 00:00:00 2001 From: solegalli Date: Fri, 27 Mar 2026 17:00:25 -0400 Subject: [PATCH 07/21] update woe --- docs/user_guide/encoding/WoEEncoder.rst | 88 +++++++------------------ 1 file changed, 23 insertions(+), 65 deletions(-) diff --git a/docs/user_guide/encoding/WoEEncoder.rst b/docs/user_guide/encoding/WoEEncoder.rst index e501635d8..2807a131c 100644 --- a/docs/user_guide/encoding/WoEEncoder.rst +++ b/docs/user_guide/encoding/WoEEncoder.rst @@ -41,9 +41,12 @@ with three categories (A1, A2, and A3). The dataset has the following characteri - Category A3 has 5 positive cases and 50 negative cases. First, we find out the number of instances with a positive target value (1) per category, -and then we divide that by the total number of positive cases in the data. Then we determine -the number of instances with target value of 0 per category and divide that by the total -number of negative instances in the dataset: +and then we divide that by the total number of positive cases in the data (20 in our example). + +After that, we determine the number of instances with target value of 0 per category and +divide that by the total number of negative instances in the dataset (80 in our example). + +So that: - For category A1, we have 10 positive cases and 15 negative cases, resulting in a positive ratio of 10/20 and a negative ratio of 15/80. This means that the positive ratio is 0.5 and the negative ratio is 0.1875. - For category A2, we have 5 positive cases out of 20 positive cases, giving us a positive ratio of 5/20 and a negative ratio of 15/80. This results in a positive ratio of 0.25 and a negative ratio of 0.1875. @@ -62,7 +65,7 @@ the WoE values: 0.98, 0.28, -0.91. Characteristics of the WoE -------------------------- -The beauty of the WoE, is that we can directly understand the impact of the category on +The beauty of the WoE is, that we can directly understand the impact of the category on the probability of success (target variable being 1): - If WoE values are negative, there are more negative cases than positive cases for the category. @@ -90,7 +93,7 @@ Uses of the WoE In general, we use the WoE to encode both categorical and numerical variables. For continuous variables, we first need to do binning, that is, sort the variables into discrete intervals. You can do this by preprocessing the variable using any of -Feature-engine's discretizers. +feature-engine's discretisers. Some authors have extended the Weight of Evidence approach to neural networks and other algorithms, and although they have shown good results, the predictive modeling performance @@ -110,7 +113,7 @@ always takes 1 or 0). In practice, this happens mostly when a category has a low in the dataset, that is, when only very few observations show that category. To overcome this limitation, consider using a variable transformation method to group -those categories together, for example by using Feature-engine's :class:`RareLabelEncoder()`. +those categories together, for example by using feature-engine's :class:`RareLabelEncoder()`. Taking into account the above considerations, conducting a detailed exploratory data analysis (EDA) is essential as part of the data science and model-building process. @@ -144,7 +147,7 @@ raise an error. If you want to encode numerical, for example discrete variables, :class:`WoEEncoder()` does not handle missing values automatically, so make sure to replace them with a suitable value before the encoding. You can impute missing values -with Feature-engine's imputers. +with feature-engine's imputers. :class:`WoEEncoder()` will ignore unseen categories by default, in which case, they will be replaced by np.nan after the encoding. You have the option to make the encoder raise @@ -271,8 +274,8 @@ WoE in categorical and numerical variables In the previous example, we encoded only the variables 'cabin', 'pclass', 'embarked', and left the rest of the variables untouched. In the following example, we will use -Feature-engine's pipeline to transform variables in sequence. We'll group rare categories -in categorical variables. Next, we'll discretize numerical variables. And finally, we'll +feature-engine's pipeline to transform variables in sequence. We'll group rare categories +in categorical variables. Next, we'll discretise numerical variables. And finally, we'll encode them all with the WoE. First, let's load the data and separate it into train and test: @@ -318,7 +321,7 @@ Let's define lists with the categorical and numerical variables: numerical_features = ['fare', 'age'] all = categorical_features + numerical_features -Now, we will set up the pipeline to first discretize the numerical variables, then group +Now, we will set up the pipeline to first discretise the numerical variables, then group rare labels and low frequency intervals into a common group, and finally encode all variables with the WoE: @@ -365,7 +368,7 @@ We see the resulting dataframe below: 1193 0.012075 686 0.012075 -Finally, we can visualize the values of the WoE encoded variables respect to the original +Finally, we can visualise the values of the WoE encoded variables respect to the original values to corroborate the sigmoid function shape, which is the expected behavior of the WoE: @@ -482,8 +485,8 @@ used for feature selection for binary classification problems. Weight of Evidence and Information Value within Feature-engine ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If you're asking yourself whether Feature-engine allows you to automate this process, -the answer is: of course! You can utilize the :class:`SelectByInformationValue()` class +If you're asking yourself whether feature-engine allows you to automate this process, +the answer is: of course! You can utilise the :class:`SelectByInformationValue()` class and it will handle all these steps for you. Again, remember the given considerations. References @@ -497,57 +500,12 @@ References Additional resources -------------------- -In the following notebooks, you can find more details into the :class:`WoEEncoder()` -functionality and example plots with the encoded variables: - -- `WoE in categorical variables `_ -- `WoE in numerical variables `_ - -For more details about this and other feature engineering methods check out these resources: - - -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook +For tutorials about this and other feature engineering methods check out these resources: -| -| -| -| -| -| -| -| -| -| -| -| -| +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. \ No newline at end of file +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file From fba66d23afd593b921ddfcc520e8994f2a884472 Mon Sep 17 00:00:00 2001 From: solegalli Date: Fri, 27 Mar 2026 17:13:57 -0400 Subject: [PATCH 08/21] uodate dt encoder --- .../encoding/DecisionTreeEncoder.rst | 75 ++++++------------- 1 file changed, 24 insertions(+), 51 deletions(-) diff --git a/docs/user_guide/encoding/DecisionTreeEncoder.rst b/docs/user_guide/encoding/DecisionTreeEncoder.rst index 9794b68ab..0ee863288 100644 --- a/docs/user_guide/encoding/DecisionTreeEncoder.rst +++ b/docs/user_guide/encoding/DecisionTreeEncoder.rst @@ -13,18 +13,21 @@ We can also replace the categories with the predictions made by a decision tree on that category value. The process consists of fitting a decision tree using a single feature to predict the -target. The decision tree will try to find a relationship between these variables, if -one exists, and then we'll use the predictions as mappings to replace the categories. +target. The decision tree will try to find a relationship between these variables and +then we'll use the predictions as mappings to replace the categories. The advantage of this procedure is that it captures some information about the relationship -between the variables during the encoding. And if there is a relationship between the +between the variables during the encoding. If there is a relationship between the categorical feature and the target, the resulting encoded variable would have a monotonic relationship with the target, which can be useful for linear models. On the downside, it could cause overfitting, and it adds computational complexity to the -pipeline because we are fitting a tree per feature. If you plan to encode your features -with decision trees, make sure you have appropriate validation strategies and train the -decision trees with regularization. +pipeline because we are fitting a tree per feature. + +.. tip:: + + If you plan to encode your features with decision trees, make sure you have + appropriate validation strategies and train the decision trees with regularisation. DecisionTreeEncoder ------------------- @@ -54,8 +57,8 @@ of the decision tree for the category. The motivation for the :class:`DecisionTreeEncoder()` is to try and create monotonic relationships between the categorical variables and the target. -Python example --------------- +Python implementation +--------------------- Let's look at an example using the Titanic Dataset. First, let's load the data and separate it into train and test: @@ -97,7 +100,7 @@ We will encode the following categorical variables: We set up the encoder to encode the variables above with 3 fold cross-validation, using a grid search to find the optimal depth of the decision tree (this is the default -behaviour of the :class:`DecisionTreeEncoder()`). In this example, we optimize the +behaviour of the :class:`DecisionTreeEncoder()`). In this example, we optimise the tree using the roc-auc metric. .. code:: python @@ -265,7 +268,7 @@ Collisions ---------- This encoder can lead to collisions. Collisions are instances where different categories -are encoded with the same number. It is useful to reduce cardinality. On the other hand, +are encoded with the same number. Collisions reduce cardinality. On the other hand, if the mappings are not meaningful we might lose the information contained in those categories. @@ -418,51 +421,21 @@ In the following image we also see a monotonic relationship after the encoding: .. image:: ../../images/lotshape-price-per-cat-enc.png -Note -~~~~ +.. note:: -Not every encoding will result in monotonic relationshops. For that to occur there needs to -be some sort of relationship between the target and the categories that can be captured by -the decision tree. Use with caution. + Not every encoding will result in monotonic relationships. For that to occur there needs to + be some sort of relationship between the target and the categories that can be captured by + the decision tree. Use with caution. Additional resources -------------------- -In the following notebook, you can find more details into the :class:`DecisionTreeEncoder()` -functionality and example plots with the encoded variables: - -- `Jupyter notebook `_ - -For more details about this and other feature engineering methods check out these resources: - -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 +For tutorials about this and other feature engineering methods check out these resources: - Python Feature Engineering Cookbook +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. \ No newline at end of file +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file From e11e568beac67727dd0cb0d399ada75faf460502 Mon Sep 17 00:00:00 2001 From: solegalli Date: Fri, 27 Mar 2026 17:49:45 -0400 Subject: [PATCH 09/21] update rare encoder --- docs/user_guide/encoding/RareLabelEncoder.rst | 163 +++++++----------- .../encoding/StringSimilarityEncoder.rst | 14 +- docs/user_guide/encoding/index.rst | 3 +- 3 files changed, 78 insertions(+), 102 deletions(-) diff --git a/docs/user_guide/encoding/RareLabelEncoder.rst b/docs/user_guide/encoding/RareLabelEncoder.rst index 8ad1d724c..25e843cff 100644 --- a/docs/user_guide/encoding/RareLabelEncoder.rst +++ b/docs/user_guide/encoding/RareLabelEncoder.rst @@ -5,43 +5,51 @@ RareLabelEncoder ================ -The :class:`RareLabelEncoder()` groups infrequent categories into one new category -called 'Rare' or a different string indicated by the user. We need to specify the -minimum percentage of observations a category should have to be preserved and the -minimum number of unique categories a variable should have to be re-grouped. +:class:`RareLabelEncoder()` groups infrequent categories into one new category +called 'Rare' or a different string indicated by the user. -**tol** +This transformers requires 2 parameters: -In the parameter `tol` we indicate the minimum proportion of observations a category -should have, not to be grouped. In other words, categories which frequency, or proportion -of observations is <= `tol` will be grouped into a unique term. +- The minimum frequency a category should have not to be grouped. +- The minimum cardinality a variable should have to be processed. -**n_categories** +Category frequency +~~~~~~~~~~~~~~~~~~ -In the parameter `n_categories` we indicate the minimum cardinality of the categorical -variable in order to group infrequent categories. For example, if `n_categories=5`, -categories will be grouped only in those categorical variables with more than 5 unique -categories. The rest of the variables will be ignored. +The parameter `tol` specifies the minimum proportion of observations a category must +have to remain ungrouped. In other words, categories with a frequency <= `tol` are +grouped into a single category. -This parameter is useful when we have big datasets and do not have time to examine all -categorical variables individually. This way, we ensure that variables with low cardinality -are not reduced any further. +Variable cardinality +~~~~~~~~~~~~~~~~~~~~ -**max_n_categories** +The parameter `n_categories` specifies the minimum cardinality a categorical variable must +have for infrequent categories to be grouped. -In the parameter `max_n_categories` we indicate the maximum number of unique categories -that we want in the encoded variable. If `max_n_categories=5`, then the most popular 5 -categories will remain in the variable after the encoding, all other will be grouped into -a single category. +For example, if `n_categories = 5`, grouping is applied only to categorical variables +with more than five unique categories. Variables with five or fewer categories are left +unchanged. -This parameter is useful if we are going to perform one hot encoding at the back of it, -to control the expansion of the feature space. +.. tip:: -**Example** + This parameter is useful for large datasets, where it may not be practical to examine all + categorical variables individually. It ensures that variables with low cardinality are + not reduced further. -Let's look at an example using the Titanic Dataset. -First, let's load the data and separate it into train and test: +Encoding popular categories +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The parameter `max_n_categories` specifies the maximum number of unique categories +allowed in the encoded variable. If `max_n_categories = 5`, the five most frequent +categories are retained after encoding, and all others are grouped into a single category. + +Python implementation +--------------------- + +Let's explore how to use :class:`RareLabelEncoder()` using the Titanic Dataset. + +Let's load the data and separate it into train and test: .. code:: python @@ -74,7 +82,7 @@ We see the resulting data below: 1193 3 male 29.881135 0 0 7.7250 M Q 686 3 female 22.000000 0 0 7.7250 M Q -Let's explore the number of uniue categories in the variable `"cabin"`. +Let's explore the number of unique categories in the variable `"cabin"`. .. code:: python @@ -87,8 +95,9 @@ We see the number of unique categories in the output below: array(['M', 'E', 'C', 'D', 'B', 'A', 'F', 'T', 'G'], dtype=object) Now, we set up the :class:`RareLabelEncoder()` to group categories shown by less than 3% -of the observations into a new group or category called 'Rare'. We will group the -categories in the indicated variables if they have more than 2 unique categories each. +of the observations into a new group called 'Rare'. We will group the +categories in the variables cabin, pclass and embarked, only if they have more than 2 +unique categories each. .. code:: python @@ -103,8 +112,8 @@ categories in the indicated variables if they have more than 2 unique categories encoder.fit(X_train) With `fit()`, the :class:`RareLabelEncoder()` finds the categories present in more than -3% of the observations, that is, those that will not be grouped. These categories can -be found in the `encoder_dict_` attribute. +3% of the observations, that is, those that will not be grouped. These categories are stored +in the `encoder_dict_` attribute. .. code:: python @@ -149,12 +158,14 @@ category: .. code:: python - from feature_engine.encoding import RareLabelEncoder import pandas as pd + from feature_engine.encoding import RareLabelEncoder data = {'var_A': ['A'] * 10 + ['B'] * 10 + ['C'] * 2 + ['D'] * 1} data = pd.DataFrame(data) data['var_A'].value_counts() +In the following output, we see the number of observations per category: + .. code:: python A 10 @@ -163,14 +174,15 @@ category: D 1 Name: var_A, dtype: int64 -In this block of code, we group the categories only for variables with more than 3 -unique categories and then we plot the result: +Now, we group categories only for variables with more than 3 unique categories: .. code:: python rare_encoder = RareLabelEncoder(tol=0.05, n_categories=3) rare_encoder.fit_transform(data)['var_A'].value_counts() +Note that the variable was left unchanged because it has exactly 3 unique categories: + .. code:: python A 10 @@ -188,6 +200,9 @@ the 'Rare' group: Xt = rare_encoder.fit_transform(data) Xt['var_A'].value_counts() +In the following output we see that the 2 most infrequent categories have been grouped into +a new category called `Rare`: + .. code:: python A 10 @@ -195,75 +210,31 @@ the 'Rare' group: Rare 3 Name: var_A, dtype: int64 -Tips ----- +Considerations +-------------- -The :class:`RareLabelEncoder()` can be used to group infrequent categories and like this +:class:`RareLabelEncoder()` can be used to group infrequent categories and hence control the expansion of the feature space if using one hot encoding. -Some categorical encodings will also return NAN if a category is present in the test -set, but was not seen in the train set. This inconvenient can usually be avoided if we +Some categorical encodings will return NAN if a category is present in the test +set, but was not seen in the train set. This inconvenient can be mitigated if we group rare labels before training the encoders. -Some categorical encoders will also return NAN if there is not enough observations for -a certain category. For example the :class:`WoEEncoder()` and the :class:`PRatioEncoder()`. -This behaviour can be also prevented by grouping infrequent labels before the encoding -with the :class:`RareLabelEncoder()`. +Some categorical encoders will return NAN if there is not enough observations for +a certain category to calculate the mapping, for example :class:`WoEEncoder()`. These +type of errors can be prevented by grouping infrequent labels before the encoding with +:class:`RareLabelEncoder()`. Additional resources -------------------- -In the following notebook, you can find more details into the :class:`RareLabelEncoder()` -functionality and example plots with the encoded variables: - -- `Jupyter notebook `_ - -For more details about this and other feature engineering methods check out these resources: - - -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| - -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. \ No newline at end of file +For tutorials about this and other feature engineering methods check out these resources: + +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. + +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/encoding/StringSimilarityEncoder.rst b/docs/user_guide/encoding/StringSimilarityEncoder.rst index 211a50e79..9c0612919 100644 --- a/docs/user_guide/encoding/StringSimilarityEncoder.rst +++ b/docs/user_guide/encoding/StringSimilarityEncoder.rst @@ -264,11 +264,15 @@ Below, we see the resulting dataframe: 393 0.0 0.437500 0.666667 0.666667 -More details ------------- +Additional resources +-------------------- -For more details into :class:`StringSimilarityEncoder()`'s functionality visit: +For tutorials about feature engineering methods check out these resources: -- `Jupyter notebook `_ +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. -All notebooks can be found in a `dedicated repository `_. +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/encoding/index.rst b/docs/user_guide/encoding/index.rst index 587033cb3..8a0f9a406 100644 --- a/docs/user_guide/encoding/index.rst +++ b/docs/user_guide/encoding/index.rst @@ -399,6 +399,7 @@ Encoders CountFrequencyEncoder MeanEncoder WoEEncoder + StringSimilarityEncoder DecisionTreeEncoder RareLabelEncoder - StringSimilarityEncoder + From ef05024c156f69e1837e216defc1d9ccec3f98d5 Mon Sep 17 00:00:00 2001 From: solegalli Date: Fri, 27 Mar 2026 18:09:19 -0400 Subject: [PATCH 10/21] update string similarity --- .../encoding/StringSimilarityEncoder.rst | 80 ++++++++++++------- 1 file changed, 52 insertions(+), 28 deletions(-) diff --git a/docs/user_guide/encoding/StringSimilarityEncoder.rst b/docs/user_guide/encoding/StringSimilarityEncoder.rst index 9c0612919..7f1031eab 100644 --- a/docs/user_guide/encoding/StringSimilarityEncoder.rst +++ b/docs/user_guide/encoding/StringSimilarityEncoder.rst @@ -6,12 +6,12 @@ StringSimilarityEncoder ======================= -The :class:`StringSimilarityEncoder()` replaces categorical variables with a set of float +:class:`StringSimilarityEncoder()` replaces categorical variables with a set of float variables that capture the similarity between the category names. The new variables have values between 0 and 1, where 0 indicates no similarity and 1 is an exact match between the names of the categories. -To calculate the similarity between the categories, :class:`StringSimilarityEncoder()` +To calculate the similarity between categories, :class:`StringSimilarityEncoder()` uses Gestalt pattern matching. Under the hood, :class:`StringSimilarityEncoder()` uses the `quick_ratio` method from the `SequanceMatcher()` from `difflib`. @@ -27,8 +27,8 @@ For example, the similarity between the categories "dog" and "dig" is 0.66. T is total number of elements in both categories, that is 6. There are 2 matches between the words, the letters d and g, so: 2 * M / T = 2 * 2 / 6 = 0.66. -Output of the :class:`StringSimilarityEncoder()` ------------------------------------------------- +Understanding the output of string similarity encoding +------------------------------------------------------ Let's create a dataframe with the categories "dog", "dig" and "cat": @@ -59,7 +59,6 @@ Let's now encode the variable: We see the encoded variables below: - .. code:: python words_dog words_dig words_cat @@ -67,12 +66,20 @@ We see the encoded variables below: 1 0.666667 1.000000 0.0 2 0.000000 0.000000 1.0 +In the first variable, we see the string similarity between all categories and dog, in the +second variable we have the string similarity between all categories and dig, and in the +final column we observe the string similarity between all categories and cat. + +.. note:: + + :class:`StringSimilarityEncoder()` returns k variables to represent 1 categorical + feature, where k is the number of unique categories of that variable. Note that :class:`StringSimilarityEncoder()` replaces the original variables by the distance variables. -:class:`StringSimilarityEncoder()` vs One-hot encoding ------------------------------------------------------- +String similarity encoding vs one-hot encoding +---------------------------------------------- String similarity encoding is similar to one-hot encoding, in the sense that each category is encoded as a new variable. But the values, instead of 1 or 0, are the similarity @@ -83,26 +90,38 @@ Encoding only popular categories -------------------------------- The :class:`StringSimilarityEncoder()` can also create similarity variables for the *n* most popular -categories, *n* being determined by the user. For example, if we encode only the 6 more popular categories, by +categories, *n* being determined by the user. + +For example, if we encode only the 6 more popular categories, by setting the parameter `top_categories=6`, the transformer will add variables only -for the 6 most frequent categories. The most frequent categories are those with the largest -number of observations. This behaviour is useful when the categorical variables are highly cardinal, -to control the expansion of the feature space. +for the 6 most frequent categories. + +The most frequent categories are those with the largest +number of observations. + +.. note:: + + This behaviour is useful when the categorical variables are highly cardinal, + to control the expansion of the feature space. -Specifying how :class:`StringSimilarityEncoder()` should deal with missing values ---------------------------------------------------------------------------------- +Missing values +-------------- -The :class:`StringSimilarityEncoder()` has three options for dealing with missing values, which can be +:class:`StringSimilarityEncoder()` has three options for dealing with missing values, which can be specified with the parameter `missing_values`: - 1. Ignore NaNs (option `ignore`) - will leave the NaN in the resulting dataframe after transformation. - Could be useful, if the next step in the pipeline is imputation or if the machine learning algorithm - can handle missing data out-of-the-box. - 2. Impute NaNs (option `impute`) - will impute NaN with an empty string, and then calculate the similarity - between the empty string and the variable's categories. Most of the time, the similarity value will be - 0 in resulting dataframe. This is the default option. - 3. Raise an error (option `raise`) - will raise an error if NaN is present during `fit`, `transform` or - `fit_transform`. Could be useful for debugging and monitoring purposes. +1. Ignore NaNs (option `ignore`) - will leave the NaN in the resulting dataframe after transformation. + +Could be useful if the next step in the pipeline is imputation or if the machine learning algorithm +can handle missing data out-of-the-box. + +2. Impute NaNs (option `impute`) - will impute NaN with an empty string, and then calculate the similarity between the empty string and the variable's categories. + +Most of the time, the similarity value will be 0 in resulting dataframe. This is the default option. + +3. Raise an error (option `raise`) - will raise an error if NaN is present during `fit`, `transform` or `fit_transform`. + +Could be useful for debugging and monitoring purposes. Important @@ -114,12 +133,12 @@ string similarity to the seen categories. No text preprocessing is applied by :class:`StringSimilarityEncoder()`. Be mindful of preparing string categorical variables if needed. -:class:`StringSimilarityEncoder()` works with categorical variables by default. And it has the option to +:class:`StringSimilarityEncoder()` works with categorical variables by default. Tt has the option to encode numerical variables as well. This is useful, when the values of the numerical variables are more useful as strings, than as numbers. For example, for variables like barcode. -Examples --------- +Python implementation +--------------------- Let's look at an example using the Titanic Dataset. First we load the data and divide it into a train and a test set: @@ -214,7 +233,9 @@ are stored in the attribute `encoder_dict_`. .. code:: python - encoder.encoder_dict_ + encoder.encoder_dict_ + +In the following output, we see the most frequent categories per variable: .. code:: python @@ -227,8 +248,11 @@ are stored in the attribute `encoder_dict_`. The `encoder_dict_` contains the categories that will derive similarity variables for each categorical variable. -With transform, we go ahead and encode the variables. Note that the -:class:`StringSimilarityEncoder()` will drop the original variables. +With transform, we go ahead and encode the variables: + +.. note:: + + Note that the :class:`StringSimilarityEncoder()` will drop the original variables. .. code:: python From 297c8d7822cbb6bfdb652c3b55b549559f773c28 Mon Sep 17 00:00:00 2001 From: solegalli Date: Sat, 28 Mar 2026 09:20:03 -0400 Subject: [PATCH 11/21] update discretisation module --- .../discretisation/ArbitraryDiscretiser.rst | 56 +-------- .../DecisionTreeDiscretiser.rst | 111 ++++++------------ .../EqualFrequencyDiscretiser.rst | 108 +++++------------ .../discretisation/EqualWidthDiscretiser.rst | 102 +++++----------- .../GeometricWidthDiscretiser.rst | 58 ++------- docs/user_guide/discretisation/index.rst | 96 +++++++++++++-- 6 files changed, 192 insertions(+), 339 deletions(-) diff --git a/docs/user_guide/discretisation/ArbitraryDiscretiser.rst b/docs/user_guide/discretisation/ArbitraryDiscretiser.rst index aac67201a..3f212b708 100644 --- a/docs/user_guide/discretisation/ArbitraryDiscretiser.rst +++ b/docs/user_guide/discretisation/ArbitraryDiscretiser.rst @@ -108,56 +108,12 @@ this functionality `here `_ -- `Jupyter notebook - Discretiser plus Mean Encoding `_ - For more details about this and other feature engineering methods check out these resources: +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| - -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. \ No newline at end of file +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/discretisation/DecisionTreeDiscretiser.rst b/docs/user_guide/discretisation/DecisionTreeDiscretiser.rst index 283bd7800..c055c2c4a 100644 --- a/docs/user_guide/discretisation/DecisionTreeDiscretiser.rst +++ b/docs/user_guide/discretisation/DecisionTreeDiscretiser.rst @@ -5,27 +5,27 @@ DecisionTreeDiscretiser ======================= -Discretization consists of transforming continuous variables into discrete features by creating +Discretisation consists of transforming continuous variables into discrete features by creating a set of contiguous intervals, or bins, that span the range of the variable values. -Discretization is a common data preprocessing step in many data science projects, as it simplifies +Discretisation is a common data preprocessing step in many data science projects, as it simplifies continuous attributes and has the potential to improve model performance or speed up model training. -Decision tree discretization +Decision tree discretisation ---------------------------- Decision trees make decisions based on discrete partitions over continuous features. During training, a decision tree evaluates all possible feature values to find the best cut-point, that is, -the feature value at which the split maximizes the information gain, or in other words, reduces the +the feature value at which the split maximises the information gain, or in other words, reduces the impurity. It repeats the procedure at each node until it allocates all samples to certain leaf nodes or end nodes. Hence, classification and regression trees can naturally find the optimal limits -of the intervals to maximize class coherence. +of the intervals to maximise class coherence. -Discretization with decision trees consists of using a decision tree algorithm to identify the optimal +Discretisation with decision trees consists of using a decision tree algorithm to identify the optimal partitions for each continuous variable. After finding the optimal partitions, we sort the variable's values into those intervals. -Discretization with decision trees is a supervised discretization method, in that, the interval +Discretisation with decision trees is a supervised discretisation method, in that, the interval limits are found based on class or target coherence. In simpler words, we need the target variable to train the decision trees. @@ -42,10 +42,10 @@ Limitations - We need to tune some of the decision tree parameters to obtain the optimal number of intervals. -Decision tree discretizer +Decision tree discretiser ------------------------- -The :class:`DecisionTreeDiscretiser()` applies discretization based on the interval limits found +The :class:`DecisionTreeDiscretiser()` applies discretisation based on the interval limits found by decision trees algorithms. It uses decision trees to find the optimal interval limits. Next, it sorts the variable into those intervals. @@ -53,14 +53,14 @@ The transformed variable can either have the limits of the intervals as values, representing the interval into which the value was sorted, or alternatively, the prediction of the decision tree. In any case, the number of values of the variable will be finite. -In theory, decision tree discretization creates discrete variables with a monotonic relationship +In theory, decision tree discretisation creates discrete variables with a monotonic relationship with the target, and hence, the transformed features would be more suitable to train linear models, like linear or logistic regression. Original idea ------------- -The method of decision tree discretization is based on the winning solution of the KDD 2009 competition: +The method of decision tree discretisation is based on the winning solution of the KDD 2009 competition: `Niculescu-Mizil, et al. "Winning the KDD Cup Orange Challenge with Ensemble Selection". JMLR: Workshop and Conference Proceedings 7: 23-34. KDD 2009 @@ -77,14 +77,14 @@ on the performance of linear models. Code examples ------------- -In the following sections, we will do decision tree discretization to showcase the functionality of -the :class:`DecisionTreeDiscretiser()`. We will discretize 2 numerical variables of the Ames house +In the following sections, we will do decision tree discretisation to showcase the functionality of +the :class:`DecisionTreeDiscretiser()`. We will discretise 2 numerical variables of the Ames house prices dataset using decision trees. First, we will transform the variables using the predictions of the decision trees, next, we will return the interval limits, and finally, we will return the bin order. -Discretization with the predictions of the decision tree +Discretisation with the predictions of the decision tree ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ First we load the data and separate it into a training set and a test set: @@ -136,9 +136,9 @@ In the following output we see the predictor variables of the house prices datas We set up the decision tree discretiser to find the optimal intervals using decision trees. -The :class:`DecisionTreeDiscretiser()` will optimize the depth of the decision tree classifier +The :class:`DecisionTreeDiscretiser()` will optimise the depth of the decision tree classifier or regressor by default and using cross-validation. That's why we need to select the appropriate -metric for the optimization. In this example, we are using decision tree regression, so we select +metric for the optimisation. In this example, we are using decision tree regression, so we select the mean squared error metric. We specify in the `bin_output` that we want to replace the continuous attribute values with the @@ -211,8 +211,8 @@ The `binner_dict_` stores the details of each decision tree. scoring='neg_mean_squared_error')} -With decision tree discretization, each bin, that is, each prediction value in this case, does not -necessarily contain the same number of observations. Let's check that out with a visualization: +With decision tree discretisation, each bin, that is, each prediction value in this case, does not +necessarily contain the same number of observations. Let's check that out with a visualisation: .. code:: python @@ -239,7 +239,7 @@ Rounding the prediction value ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Sometimes, the output of the prediction can have multiple values after the comma, which makes the -visualization and interpretation a bit uncomfortable. Fortunately, we can round those values through +visualisation and interpretation a bit uncomfortable. Fortunately, we can round those values through the `precision` parameter: .. code:: python @@ -266,7 +266,7 @@ the `precision` parameter: In this example, we are predicting house prices, which is a continuous target. The procedure for classification models is identical, we just need to set the parameter `regression` to False. -Discretization with interval limits +Discretisation with interval limits ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In this section, instead of replacing the original variable values with the predictions of the @@ -314,7 +314,7 @@ of the decision trees: 4576.0, inf]} -The :class:`DecisionTreeDiscretiser()` will use these limits with `pandas.cut` to discretize the +The :class:`DecisionTreeDiscretiser()` will use these limits with `pandas.cut` to discretise the continuous variable values during transform: .. code:: python @@ -337,7 +337,7 @@ In the following output we see the interval limits into which the values of the To train machine learning algorithms we would follow that up with any categorical data encoding method. -Discretization with ordinal numbers +Discretisation with ordinal numbers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In the last part of this guide, we will replace the variable values with the number of bin into @@ -384,7 +384,7 @@ The `binner_dict_` will also contain the limits of the intervals: inf]} When we apply transform, :class:`DecisionTreeDiscretiser()` will use these limits with `pandas.cut` to -discretize the continuous variable: +discretise the continuous variable: .. code:: python @@ -408,62 +408,19 @@ were sorted: Additional considerations ------------------------- -Decision tree discretization uses scikit-learn's DecisionTreeRegressor or DecisionTreeClassifier under +Decision tree discretisation uses scikit-learn's DecisionTreeRegressor or DecisionTreeClassifier under the hood to find the optimal interval limits. These models do not support missing data. Hence, we need -to replace missing values with numbers before proceeding with the disrcretization. +to replace missing values with numbers before proceeding with the disrcretisation. Tutorials, books and courses ---------------------------- -Check also for more details on how to use this transformer: - -- `Jupyter notebook `_ -- `tree_pipe in cell 21 of this Kaggle kernel `_ - -For tutorials about this and other discretization methods and feature engineering techniques check out our online course: - -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| - -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. \ No newline at end of file +For tutorials about this and other discretisation methods and feature engineering techniques check out our online course: + +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. + +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst b/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst index 6d7f3e46c..b501f01ee 100644 --- a/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst +++ b/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst @@ -5,19 +5,19 @@ EqualFrequencyDiscretiser ========================= -Equal frequency discretization consists of dividing continuous attributes into equal-frequency bins. These bins +Equal frequency discretisation consists of dividing continuous attributes into equal-frequency bins. These bins contain roughly the same number of observations, with boundaries set at specific quantile values determined by the desired number of bins. -Equal frequency discretization ensures a uniform distribution of data points across the range of values, enhancing the +Equal frequency discretisation ensures a uniform distribution of data points across the range of values, enhancing the handling of skewed data and outliers. -Discretization is a common data preprocessing technique used in data science. It's also known as binning data (or simply "binning"). +Discretisation is a common data preprocessing technique used in data science. It's also known as binning data (or simply "binning"). Advantages and Limitations -------------------------- -Equal frequency discretization has some advantages and shortcomings: +Equal frequency discretisation has some advantages and shortcomings: Advantages ~~~~~~~~~~ @@ -29,7 +29,7 @@ Some advantages of equal frequency binning: - **Data Smoothing:** Helps smooth the data, reduces noise, and improves the model's ability to generalize. - **Improved value distribution:** Returns an uniform distribution of values across the value range. -Equal frequency discretization improves the data distribution, **optimizing the spread of values**. This is particularly +Equal frequency discretisation improves the data distribution, **optimising the spread of values**. This is particularly beneficial for datasets with skewed distributions (see the Python example code). Limitations @@ -44,10 +44,10 @@ would potentially impact the model's performance in this scenario. EqualFrequencyDiscretiser ------------------------- -Feature-engine's :class:`EqualFrequencyDiscretiser` applies equal frequency discretization to numerical variables. It uses +Feature-engine's :class:`EqualFrequencyDiscretiser` applies equal frequency discretisation to numerical variables. It uses the `pandas.qcut()` function under the hood, to determine the interval limits. -You can specify the variables to be discretized by passing their names in a list when you set up the transformer. Alternatively, +You can specify the variables to be discretised by passing their names in a list when you set up the transformer. Alternatively, :class:`EqualFrequencyDiscretiser` will automatically infer the data types to compute the interval limits for all numeric variables. **Optimal number of intervals:** With :class:`EqualFrequencyDiscretiser`, the user defines the number of bins. Smaller intervals @@ -83,10 +83,10 @@ test sets: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) -Equal-frequency Discretization +Equal-frequency Discretisation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In this example, let's discretize two variables, LotArea and GrLivArea, into 10 intervals of approximately equal +In this example, let's discretise two variables, LotArea and GrLivArea, into 10 intervals of approximately equal number of observations. .. code:: python @@ -94,7 +94,7 @@ number of observations. # List the target numeric variables to be transformed TARGET_NUMERIC_FEATURES= ['LotArea','GrLivArea'] - # Set up the discretization transformer + # Set up the discretisation transformer disc = EqualFrequencyDiscretiser(q=10, variables=TARGET_NUMERIC_FEATURES) # Fit the transformer @@ -104,7 +104,7 @@ number of observations. Note that if we do not specify the variables (default=`None`), :class:`EqualFrequencyDiscretiser` will automatically infer the data types to compute the interval limits for all numeric variables. -With the `fit()` method, the discretizer learns the bin boundaries and saves them into a dictionary so we can use them +With the `fit()` method, the discretiser learns the bin boundaries and saves them into a dictionary so we can use them to transform unseen data: .. code:: python @@ -153,7 +153,7 @@ impute missing values before fitting the transformer. test_t = disc.transform(X_test) -Let's visualize the first rows of the raw data and the transformed data: +Let's visualise the first rows of the raw data and the transformed data: .. code:: python @@ -177,7 +177,7 @@ Here we see the original variables: # Transformed data print(train_t[TARGET_NUMERIC_FEATURES].head()) -Here we observe the variables after discretization: +Here we observe the variables after discretisation: .. code:: python @@ -192,7 +192,7 @@ Here we observe the variables after discretization: The transformed data now contains discrete values corresponding to the ordered computed buckets (0 being the first and q-1 the last). -Now, let's visualize the plots for equal-width intervals with a histogram and the transformed data with equal-frequency discretiser: +Now, let's visualise the plots for equal-width intervals with a histogram and the transformed data with equal-frequency discretiser: .. code:: python @@ -248,7 +248,7 @@ If we want to output the intervals limits instead of integers, we can set `retur .. code:: python - # Set up the discretization transformer + # Set up the discretisation transformer disc = EqualFrequencyDiscretiser( q=10, variables=TARGET_NUMERIC_FEATURES, @@ -257,16 +257,16 @@ If we want to output the intervals limits instead of integers, we can set `retur # Fit the transformer disc.fit(X_train) - # Transform test set & visualize limit + # Transform test set & visualise limit test_t = disc.transform(X_test) - # Visualize output (boundaries) + # Visualise output (boundaries) print(test_t[TARGET_NUMERIC_FEATURES].head()) The transformed variables now show the interval limits in the output. We can immediately see that the bin width for these -intervals varies. In other words, they don't have the same width, contrarily to what we see with :ref:`equal width discretization `. +intervals varies. In other words, they don't have the same width, contrarily to what we see with :ref:`equal width discretisation `. -Unlike the variables discretized into integers, these variables cannot be used to train machine learning models; however, +Unlike the variables discretised into integers, these variables cannot be used to train machine learning models; however, they are still highly helpful for data analysis in this format, and they may be sent to any Feature-engine encoder for additional processing. @@ -284,7 +284,7 @@ additional processing. Binning skewed data ~~~~~~~~~~~~~~~~~~~ -Let's now show the benefits of equal frequency discretization for skewed variables. We'll +Let's now show the benefits of equal frequency discretisation for skewed variables. We'll start by importing the libraries and classes: .. code:: python @@ -311,17 +311,17 @@ one that is skewed: # Create dataframe with simulated data X = pd.DataFrame({'feature1': normal_data, 'feature2': skewed_data}) -Let's discretize both variables into 5 equal frequency bins: +Let's discretise both variables into 5 equal frequency bins: .. code:: python - # Instantiate discretizer + # Instantiate discretiser disc = EqualFrequencyDiscretiser(q=5) # Transform simulated data X_transformed = disc.fit_transform(X) -Let's plot the original distribution and the distribution after discretization for the variable that was normally +Let's plot the original distribution and the distribution after discretisation for the variable that was normally distributed: .. code:: python @@ -338,12 +338,12 @@ distributed: plt.show() -In the following image, we see that after the discretization there is an even distribution of the values across +In the following image, we see that after the discretisation there is an even distribution of the values across the value range, hence, the variable does no look normally distributed any more. .. image:: ../../images/equalfrequencydiscretisation_gaussian.png -Let's now plot the original distribution and the distribution after discretization for the variable that was skewed: +Let's now plot the original distribution and the distribution after discretisation for the variable that was skewed: .. code:: python @@ -359,7 +359,7 @@ Let's now plot the original distribution and the distribution after discretizati plt.show() -In the following image, we see that after the discretization there is an even distribution of the values across +In the following image, we see that after the discretisation there is an even distribution of the values across the value range. .. image:: ../../images/equalfrequencydiscretisation_skewed.png @@ -380,56 +380,12 @@ Check out also: Additional resources -------------------- -Check also for more details on how to use this transformer: - -- `Jupyter notebook `_ -- `Jupyter notebook - Discretizer plus Weight of Evidence encoding `_ - For more details about this and other feature engineering methods check out these resources: +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| - -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. diff --git a/docs/user_guide/discretisation/EqualWidthDiscretiser.rst b/docs/user_guide/discretisation/EqualWidthDiscretiser.rst index 1e630ac1a..ec71fad76 100644 --- a/docs/user_guide/discretisation/EqualWidthDiscretiser.rst +++ b/docs/user_guide/discretisation/EqualWidthDiscretiser.rst @@ -5,7 +5,7 @@ EqualWidthDiscretiser ===================== -Equal width discretization consist of dividing continuous variables into intervals of equal width, calculated +Equal width discretisation consist of dividing continuous variables into intervals of equal width, calculated using the following formula: .. math:: @@ -13,15 +13,15 @@ using the following formula: bin_{width} = ( max(X) - min(X) ) / bins Here, `bins` is the number of intervals specified by the user and `max(X)` and `min(X)` are the minimum and maximum values -of the variable to discretize. +of the variable to discretise. -Discretization is a common data preprocessing technique used in data science. It's also known as data binning (or simply +Discretisation is a common data preprocessing technique used in data science. It's also known as data binning (or simply "binning"). Advantages and Limitations -------------------------- -Equal binning discretization has some advantages and also shortcomings. +Equal binning discretisation has some advantages and also shortcomings. Advantages ~~~~~~~~~~ @@ -30,12 +30,12 @@ Some advantages of equal width binning: - **Algorithm Efficiency:** Enhances the performance of data mining and machine learning algorithms by providing a simplified representation of the dataset. - **Outlier Management:** Efficiently mitigates the effect of outliers by grouping them into the extreme bins, thus preserving the integrity of the main data distribution. -- **Data Smoothing:** Helps smooth the data, reduces noise, and improves the model's ability to generalize. +- **Data Smoothing:** Helps smooth the data, reduces noise, and improves the model's ability to generalise. Limitations ~~~~~~~~~~~ -On the other hand, equal width discretzation can lead to a loss of information by aggregating data into broader categories. +On the other hand, equal width discretsation can lead to a loss of information by aggregating data into broader categories. This is particularly concerning if the data in the same bin has predictive information about the target. Let's consider a binary classifier task using a decision tree model. A bin with a high proportion of both target categories would @@ -44,11 +44,11 @@ potentially impact the model's performance in this scenario. EqualWidthDiscretiser --------------------- -Feture-engine's :class:`EqualWidthDiscretiser()` applies equal width discretization to numerical variables. It uses +Feture-engine's :class:`EqualWidthDiscretiser()` applies equal width discretisation to numerical variables. It uses the `pandas.cut()` function under the hood to find the interval limits and then sort the continuous variables into the bins. -You can specify the variables to be discretized by passing their names in a list when you set up the transformer. Alternatively, +You can specify the variables to be discretised by passing their names in a list when you set up the transformer. Alternatively, :class:`EqualWidthDiscretiser()` will automatically infer the data types to compute the interval limits for all numeric variables. @@ -85,17 +85,17 @@ test sets: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) -Equal-width Discretization +Equal-width Discretisation ~~~~~~~~~~~~~~~~~~~~~~~~~~ -In this example, let's discretize two variables, LotArea and GrLivArea, into 10 intervals of equal width: +In this example, let's discretise two variables, LotArea and GrLivArea, into 10 intervals of equal width: .. code:: python - # List the target numeric variables for equal-width discretization + # List the target numeric variables for equal-width discretisation TARGET_NUMERIC_FEATURES= ['LotArea','GrLivArea'] - # Set up the discretization transformer + # Set up the discretisation transformer disc = EqualWidthDiscretiser(bins=10, variables=TARGET_NUMERIC_FEATURES) # Fit the transformer @@ -105,7 +105,7 @@ In this example, let's discretize two variables, LotArea and GrLivArea, into 10 Note that if we do not specify the variables (default=`None`), :class:`EqualWidthDiscretiser` will automatically infer the data types to compute the interval limits for all numeric variables. -With the `fit()` method, the discretizer learns the bin boundaries and saves them into a dictionary so we can use them +With the `fit()` method, the discretiser learns the bin boundaries and saves them into a dictionary so we can use them to transform unseen data: .. code:: python @@ -149,11 +149,11 @@ impute missing values before fitting the transformer. .. code:: python - # Transform the data (data discretization) + # Transform the data (data discretisation) train_t = disc.transform(X_train) test_t = disc.transform(X_test) -Let's visualize the first rows of the raw data and the transformed data: +Let's visualise the first rows of the raw data and the transformed data: .. code:: python @@ -178,7 +178,7 @@ Here we see the original variables: # Transformed data print(train_t[TARGET_NUMERIC_FEATURES].head()) -Here we observe the variables after discretization: +Here we observe the variables after discretisation: .. code:: python @@ -209,8 +209,8 @@ histogram: | -Equal width discretization does not improve the spread of values over the value range. If the variable is skewed, it will -still be skewed after the discretization. +Equal width discretisation does not improve the spread of values over the value range. If the variable is skewed, it will +still be skewed after the discretisation. Finally, since the default value for the `return_object` parameter is `False`, the transformer outputs integer variables: @@ -230,7 +230,7 @@ Return variables as object ~~~~~~~~~~~~~~~~~~~~~~~~~~ Categorical encoders in Feature-engine are designed to work by default with variables of type object. Therefore, to -further encode the discretized output with Feature-engine's encoders, we can set `return_object=True` instead. This will +further encode the discretised output with Feature-engine's encoders, we can set `return_object=True` instead. This will return the transformed variables as object. Let's say we want to obtain monotonic relationships between the variable and the target. We can do that seamlessly by @@ -244,7 +244,7 @@ If we want to output the intervals limits instead of integers, we can set `retur .. code:: python - # Set up the discretization transformer + # Set up the discretisation transformer disc = EqualFrequencyDiscretiser( bins=10, variables=TARGET_NUMERIC_FEATURES, @@ -253,14 +253,14 @@ If we want to output the intervals limits instead of integers, we can set `retur # Fit the transformer disc.fit(X_train) - # Transform test set & visualize limit + # Transform test set & visualise limit test_t = disc.transform(X_test) - # Visualize output (boundaries) + # Visualise output (boundaries) print(test_t[TARGET_NUMERIC_FEATURES].head()) In the following output we see that the transformed variables now display the interval limits. While we can't use these -variables to train machine learning models, as opposed to the variables discretized into integers, they are very useful +variables to train machine learning models, as opposed to the variables discretised into integers, they are very useful in this format for data analysis, and they can also be passed on to any Feature-engine encoder for further processing. .. code:: python @@ -289,56 +289,12 @@ Check out also: Additional resources -------------------- -Check also for more details on how to use this transformer: - -- `Jupyter notebook `_ -- `Jupyter notebook - Discretizer plus Ordinal encoding `_ - For more details about this and other feature engineering methods check out these resources: +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| - -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. diff --git a/docs/user_guide/discretisation/GeometricWidthDiscretiser.rst b/docs/user_guide/discretisation/GeometricWidthDiscretiser.rst index ce9626595..ec33f279d 100644 --- a/docs/user_guide/discretisation/GeometricWidthDiscretiser.rst +++ b/docs/user_guide/discretisation/GeometricWidthDiscretiser.rst @@ -118,7 +118,7 @@ The `binner_dict_` stores the interval limits identified for each variable. With increasing width discretisation, each bin does not necessarily contain the same number of observations. This transformer is suitable for variables with right skewed distributions. -Let's compare the variable distribution before and after the discretization: +Let's compare the variable distribution before and after the discretisation: .. code:: python @@ -149,56 +149,12 @@ this functionality `here `_ -- `Jupyter notebook - Geometric Discretiser plus Mean encoding `_ - For more details about this and other feature engineering methods check out these resources: +- `Feature Engineering for Machine Learning `_, online course. +- `Feature Engineering for Time Series Forecasting `_, online course. +- `Python Feature Engineering Cookbook `_, book. -.. figure:: ../../images/feml.png - :width: 300 - :figclass: align-center - :align: left - :target: https://www.trainindata.com/p/feature-engineering-for-machine-learning - - Feature Engineering for Machine Learning - -| -| -| -| -| -| -| -| -| -| - -Or read our book: - -.. figure:: ../../images/cookbook.png - :width: 200 - :figclass: align-center - :align: left - :target: https://www.packtpub.com/en-us/product/python-feature-engineering-cookbook-9781835883587 - - Python Feature Engineering Cookbook - -| -| -| -| -| -| -| -| -| -| -| -| -| - -Both our book and course are suitable for beginners and more advanced data scientists -alike. By purchasing them you are supporting Sole, the main developer of Feature-engine. \ No newline at end of file +Both our book and courses are suitable for beginners and more advanced data scientists +alike. By purchasing them you are supporting `Sole `_, +the main developer of feature-engine. \ No newline at end of file diff --git a/docs/user_guide/discretisation/index.rst b/docs/user_guide/discretisation/index.rst index 559dc751a..35a8b020a 100644 --- a/docs/user_guide/discretisation/index.rst +++ b/docs/user_guide/discretisation/index.rst @@ -5,11 +5,9 @@ Discretisation ============== -Feature-engine's variable discretisation transformers transform continuous numerical -variables into discrete variables. The discrete variables will contain contiguous -intervals in the case of the equal frequency and equal width transformers. The -Decision Tree discretiser will return a discrete variable, in the sense that the -new feature takes a finite number of values. +Data discretisation, also known as binning, is the process of grouping continuous +variable values into adjacent intervals. This procedure transforms continuous +variables into discrete ones and is commonly used in data science and machine learning. The following illustration shows the process of discretisation: @@ -17,17 +15,91 @@ The following illustration shows the process of discretisation: :align: center :width: 500 +.. tip:: -With discretisation, sometimes we can obtain a more homogeneous value spread from an -originally skewed variable. But this is not always possible. + With discretisation, we can often make the value spread of skewed variables more + homogeneous across the value range. -**Discretisation plus encoding** +In discretisation, we convert continuous variables into discrete features. This involves +calculating the boundaries of contiguous intervals that cover the entire range of +variable values. The original values are then sorted into these intervals. -Very often, after we discretise the numerical continuous variables into discrete intervals -we want to proceed their engineering as if they were categorical. This is common practice. -Throughout the user guide, we point to jupyter notebooks that showcase this functionality. +A key challenge in discretisation is determining the thresholds or boundaries that define +the intervals into which the continuous values are sorted. To address this, +various discretisation methods are available, each with its own advantages and limitations. -**Discretisers** +How is Discretisation Useful? +----------------------------- + +Several regression and classification models, such as decision trees and Naive Bayes, +perform better with discrete values. + +Decision trees make decisions based on discrete attribute partitions. A decision tree +evaluates all feature values during training to determine the optimal cut-point. +Consequently, the more values a feature has, the longer the decision tree's training +time. Therefore, discretising continuous features can speed up the training process. + +Discretisation also offers additional benefits. Discrete values are easier for people +to interpret. Moreover, when observations are sorted into bins with equal frequency, +skewed values become more evenly distributed across the range. + +Furthermore, discretisation can reduce the impact of outliers by grouping them into +the lower or upper intervals, along with the other values in the distribution. This +approach helps prevent outliers from biasing the coefficients in linear regression models. + +Overall, discretisation of continuous features simplifies the data, accelerates the +learning process, and can lead to more accurate results. + +Shortcomings of Discretisation +------------------------------ + +Discretisation can lead to information loss, for instance, by combining +values that are strongly associated with different target classes into the same bin. + +.. note:: + + The goal of a discretisation algorithm is to determine the fewest possible intervals + without significant information loss. The algorithm's task, then, is to identify the + optimal cut-points for those intervals. + + This brings up the question of how to discretise variables in machine learning. + +Discretisation Methods +---------------------- + +The most popular discretisation algorithms are equal-width and equal-frequency +discretisation. These are unsupervised techniques, as they determine the interval +limits without considering the target variable. + +Another unsupervised method consists of using +k-means to find the interval limits. In all of these methods, the user must specify +the number of bins into which the continuous data will be sorted in advance. + +On the other hand, decision tree-based discretisation techniques can automatically +determine the cut-points and the optimal number of divisions. This is a supervised +method, as it uses the target variable to guide the determination of interval limits. + +Feature-engine's Discretisers +----------------------------- + +Feature-engine's discretisation transformers transform continuous variables into +discrete features. They use different logic to determine the limits of those intervals. + +**Summary of Feature-engine's discretisers** + +===================================== ======================================================================== + Transformer Functionality +===================================== ======================================================================== +:class:`EqualFrequencyDiscretiser()` Sorts values into intervals with similar number of observations. +:class:`EqualWidthDiscretiser()` Sorts values into intervals of equal size. +:class:`ArbitraryDiscretiser()` Sorts values into intervals predefined by the user. +:class:`DecisionTreeDiscretiser()` Replaces values by predictions of a decision tree, which are discrete. +:class:`GeometricWidthDiscretiser()` Sorts variable into geometrical intervals. +===================================== ======================================================================== + + +Discretisers +------------ .. toctree:: :maxdepth: 1 From e30417e8c855acfb374c752407b6b0f9fc4c7e25 Mon Sep 17 00:00:00 2001 From: solegalli Date: Sat, 28 Mar 2026 10:02:31 -0400 Subject: [PATCH 12/21] update eq freq disc --- .../EqualFrequencyDiscretiser.rst | 127 ++++++++++-------- 1 file changed, 71 insertions(+), 56 deletions(-) diff --git a/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst b/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst index b501f01ee..ed11984d6 100644 --- a/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst +++ b/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst @@ -5,32 +5,34 @@ EqualFrequencyDiscretiser ========================= -Equal frequency discretisation consists of dividing continuous attributes into equal-frequency bins. These bins -contain roughly the same number of observations, with boundaries set at specific quantile values determined by the desired -number of bins. +Equal frequency discretisation involves dividing continuous attributes into bins that +each contain approximately the same number of observations. The boundaries of these +bins are determined by specific **quantile values**, based on the desired number of bins. -Equal frequency discretisation ensures a uniform distribution of data points across the range of values, enhancing the -handling of skewed data and outliers. +.. tip:: + + This method ensures a more uniform distribution of data points across the value range, + which helps in handling skewed data and outliers more effectively. -Discretisation is a common data preprocessing technique used in data science. It's also known as binning data (or simply "binning"). Advantages and Limitations -------------------------- -Equal frequency discretisation has some advantages and shortcomings: +Equal frequency discretisation has advantages and limitations: Advantages ~~~~~~~~~~ -Some advantages of equal frequency binning: +Advantages of equal frequency binning include: - **Algorithm Efficiency:** Enhances the performance of data mining and machine learning algorithms by providing a simplified representation of the dataset. - **Outlier Management:** Efficiently mitigates the effect of outliers by grouping them into the extreme bins. -- **Data Smoothing:** Helps smooth the data, reduces noise, and improves the model's ability to generalize. +- **Data Smoothing:** Helps smooth the data, reduces noise, and improves the model's ability to generalise. - **Improved value distribution:** Returns an uniform distribution of values across the value range. Equal frequency discretisation improves the data distribution, **optimising the spread of values**. This is particularly -beneficial for datasets with skewed distributions (see the Python example code). +beneficial for datasets with skewed distributions (see the Python implementation section +for an example). Limitations ~~~~~~~~~~~ @@ -45,9 +47,9 @@ EqualFrequencyDiscretiser ------------------------- Feature-engine's :class:`EqualFrequencyDiscretiser` applies equal frequency discretisation to numerical variables. It uses -the `pandas.qcut()` function under the hood, to determine the interval limits. +the `pandas.qcut()` function under the hood to determine the interval limits. -You can specify the variables to be discretised by passing their names in a list when you set up the transformer. Alternatively, +You can specify the variables to be discretised by passing their names in a list when setting up the transformer. Alternatively, :class:`EqualFrequencyDiscretiser` will automatically infer the data types to compute the interval limits for all numeric variables. **Optimal number of intervals:** With :class:`EqualFrequencyDiscretiser`, the user defines the number of bins. Smaller intervals @@ -56,62 +58,66 @@ may be required if the variable is highly skewed or not continuous. **Integration with scikit-learn:** :class:`EqualFrequencyDiscretiser` and all other feature-engine transformers seamlessly integrate with scikit-learn `pipelines `_. -Python code example -------------------- +Python implementation +--------------------- In this section, we'll show the main functionality of :class:`EqualFrequencyDiscretiser` Load dataset ~~~~~~~~~~~~ -In this example, we'll use the Ames House Prices' Dataset. First, let's load the dataset and split it into train and +We'll use the Ames House Prices' Dataset. First, let's load the dataset and split it into train and test sets: .. code:: python - import matplotlib.pyplot as plt - from sklearn.datasets import fetch_openml - from sklearn.model_selection import train_test_split + import matplotlib.pyplot as plt + from sklearn.datasets import fetch_openml + from sklearn.model_selection import train_test_split - from feature_engine.discretisation import EqualFrequencyDiscretiser + from feature_engine.discretisation import EqualFrequencyDiscretiser - # Load dataset - X, y = fetch_openml(name='house_prices', version=1, return_X_y=True, as_frame=True) - X.set_index('Id', inplace=True) + # Load dataset + X, y = fetch_openml( + name='house_prices', version=1, return_X_y=True, as_frame=True) + X.set_index('Id', inplace=True) - # Separate into train and test sets - X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + # Separate into train and test sets + X_train, X_test, y_train, y_test = train_test_split( + X, y, test_size=0.3, random_state=42) Equal-frequency Discretisation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In this example, let's discretise two variables, LotArea and GrLivArea, into 10 intervals of approximately equal +Let's discretise two variables, LotArea and GrLivArea, into 10 intervals of equal number of observations. .. code:: python - - # List the target numeric variables to be transformed - TARGET_NUMERIC_FEATURES= ['LotArea','GrLivArea'] - # Set up the discretisation transformer - disc = EqualFrequencyDiscretiser(q=10, variables=TARGET_NUMERIC_FEATURES) + # Set up the discretisation transformer + disc = EqualFrequencyDiscretiser( + q=10, + variables=['LotArea','GrLivArea'], + ) - # Fit the transformer - disc.fit(X_train) + # Fit the transformer + disc.fit(X_train) +.. note:: -Note that if we do not specify the variables (default=`None`), :class:`EqualFrequencyDiscretiser` will automatically -infer the data types to compute the interval limits for all numeric variables. + If we do not specify the variables to discretise, :class:`EqualFrequencyDiscretiser` will automatically + infer the data types and compute the interval limits for all numeric variables. With the `fit()` method, the discretiser learns the bin boundaries and saves them into a dictionary so we can use them -to transform unseen data: +to transform new data: .. code:: python # Learned limits for each variable disc.binner_dict_ +In the following output, we see the interval limits calculated for each variable: .. code:: python @@ -139,12 +145,16 @@ to transform unseen data: inf]} -Note that the lower and upper boundaries are set to -inf and inf, respectively. his behavior ensures that the transformer -will be able to allocate to the extreme bins values that are smaller or greater than the observed minimum and maximum +Note that the lower and upper boundaries are set to -inf and inf, respectively. This behavior ensures that the transformer +is able to allocate to the extreme bins values that are smaller or greater than the observed minimum and maximum values in the training set. -:class:`EqualFrequencyDiscretiser` will not work in the presence of missing values. Therefore, we should either remove or -impute missing values before fitting the transformer. +.. note:: + + :class:`EqualFrequencyDiscretiser` will not work in the presence of missing values. Therefore, we should either remove or + impute missing values before fitting the transformer. + +Let's now discretise the variables in the training and test sets: .. code:: python @@ -153,12 +163,12 @@ impute missing values before fitting the transformer. test_t = disc.transform(X_test) -Let's visualise the first rows of the raw data and the transformed data: +Let's visualise the first rows of the raw data: .. code:: python # Raw data - print(X_train[TARGET_NUMERIC_FEATURES].head()) + print(X_train[['LotArea','GrLivArea']].head()) Here we see the original variables: @@ -172,10 +182,12 @@ Here we see the original variables: 933 11670 1905 436 10667 1661 +Let's display the transformed variables now: + .. code:: python - # Transformed data - print(train_t[TARGET_NUMERIC_FEATURES].head()) + # Transformed data + print(train_t[['LotArea','GrLivArea']].head()) Here we observe the variables after discretisation: @@ -190,9 +202,11 @@ Here we observe the variables after discretisation: 436 6 6 -The transformed data now contains discrete values corresponding to the ordered computed buckets (0 being the first and q-1 the last). +The transformed data now contains discrete values corresponding to the ordered computed +buckets (0 being the first and q-1 the last). -Now, let's visualise the plots for equal-width intervals with a histogram and the transformed data with equal-frequency discretiser: +Now, let's visualise the data with a histogram of the original distribution next to a bar +plot of the discretised variable: .. code:: python @@ -211,17 +225,19 @@ Now, let's visualise the plots for equal-width intervals with a histogram and th plt.tight_layout(w_pad=2) plt.show() -As we see in the following image, the intervals contain approximately the same number of observations: +As we see in the following image, the intervals contain approximately the same number of +observations and a uniform distribution: .. image:: ../../images/equalfrequencydiscretisation_gaussian.png -Finally, as the default value for the `return_object` parameter is `False`, the transformer outputs integer variables: +Note that the discretised variables are of type integer by default: .. code:: python - train_t[TARGET_NUMERIC_FEATURES].dtypes + train_t[['LotArea','GrLivArea']].dtypes +We see that the dtype of the variable after discretisation is integer: .. code:: python @@ -234,7 +250,7 @@ Return variables as object ~~~~~~~~~~~~~~~~~~~~~~~~~~ Categorical encoders in Feature-engine are designed to work by default with variables of type object. Therefore, to further -encode the discretised output with Feature-engine, we can set `return_object=True` instead. This will return the transformed +encode the discretised output with feature-engine's encoders, we can set `return_object=True` instead. This will return the transformed variables as object. Let's say we want to obtain monotonic relationships between the variable and the target. We can do that seamlessly by setting @@ -251,7 +267,7 @@ If we want to output the intervals limits instead of integers, we can set `retur # Set up the discretisation transformer disc = EqualFrequencyDiscretiser( q=10, - variables=TARGET_NUMERIC_FEATURES, + variables=['LotArea','GrLivArea'], return_boundaries=True) # Fit the transformer @@ -261,15 +277,11 @@ If we want to output the intervals limits instead of integers, we can set `retur test_t = disc.transform(X_test) # Visualise output (boundaries) - print(test_t[TARGET_NUMERIC_FEATURES].head()) + print(test_t[['LotArea','GrLivArea']].head()) The transformed variables now show the interval limits in the output. We can immediately see that the bin width for these intervals varies. In other words, they don't have the same width, contrarily to what we see with :ref:`equal width discretisation `. -Unlike the variables discretised into integers, these variables cannot be used to train machine learning models; however, -they are still highly helpful for data analysis in this format, and they may be sent to any Feature-engine encoder for -additional processing. - .. code:: python LotArea GrLivArea @@ -280,6 +292,9 @@ additional processing. 523 (-inf, 5000.0] (1601.6, 1717.7] 1037 (12208.2, 14570.7] (1601.6, 1717.7] +Unlike the variables discretised into integers, these variables cannot be used to train machine learning models; however, +they are still highly helpful for data analysis in this format, and they may be sent to any Feature-engine encoder for +additional processing. Binning skewed data ~~~~~~~~~~~~~~~~~~~ @@ -369,7 +384,7 @@ See Also For alternative binning techniques, check out the following resources: -- Further feature-engine :ref:`discretizers / binning methods ` +- Further feature-engine :ref:`discretisers / binning methods ` - Scikit-learn's `KBinsDiscretizer `_. Check out also: From 94ebd5b1cd98a3f621cf96fef01e6be04ac338d3 Mon Sep 17 00:00:00 2001 From: solegalli Date: Sat, 28 Mar 2026 10:17:49 -0400 Subject: [PATCH 13/21] update eq width disc --- .../EqualFrequencyDiscretiser.rst | 2 +- .../discretisation/EqualWidthDiscretiser.rst | 90 ++++++++++--------- 2 files changed, 50 insertions(+), 42 deletions(-) diff --git a/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst b/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst index ed11984d6..8b488db8d 100644 --- a/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst +++ b/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst @@ -249,7 +249,7 @@ We see that the dtype of the variable after discretisation is integer: Return variables as object ~~~~~~~~~~~~~~~~~~~~~~~~~~ -Categorical encoders in Feature-engine are designed to work by default with variables of type object. Therefore, to further +Categorical encoders in feature-engine are designed to work by default with variables of type object. Therefore, to further encode the discretised output with feature-engine's encoders, we can set `return_object=True` instead. This will return the transformed variables as object. diff --git a/docs/user_guide/discretisation/EqualWidthDiscretiser.rst b/docs/user_guide/discretisation/EqualWidthDiscretiser.rst index ec71fad76..8333992a1 100644 --- a/docs/user_guide/discretisation/EqualWidthDiscretiser.rst +++ b/docs/user_guide/discretisation/EqualWidthDiscretiser.rst @@ -15,18 +15,16 @@ using the following formula: Here, `bins` is the number of intervals specified by the user and `max(X)` and `min(X)` are the minimum and maximum values of the variable to discretise. -Discretisation is a common data preprocessing technique used in data science. It's also known as data binning (or simply -"binning"). Advantages and Limitations -------------------------- -Equal binning discretisation has some advantages and also shortcomings. +Equal binning discretisation has some advantages and also limitations. Advantages ~~~~~~~~~~ -Some advantages of equal width binning: +Advantages of equal width binning include: - **Algorithm Efficiency:** Enhances the performance of data mining and machine learning algorithms by providing a simplified representation of the dataset. - **Outlier Management:** Efficiently mitigates the effect of outliers by grouping them into the extreme bins, thus preserving the integrity of the main data distribution. @@ -49,7 +47,7 @@ the `pandas.cut()` function under the hood to find the interval limits and then the bins. You can specify the variables to be discretised by passing their names in a list when you set up the transformer. Alternatively, -:class:`EqualWidthDiscretiser()` will automatically infer the data types to compute the interval limits for all numeric +:class:`EqualWidthDiscretiser()` will automatically infer the data types and compute the interval limits for all numeric variables. **Optimal number of intervals:** With :class:`EqualWidthDiscretiser()`, the user defines the number of bins. Smaller intervals @@ -58,8 +56,8 @@ may be required if the variable is highly skewed or not continuous. **Integration with scikit-learn:** :class:`EqualWidthDiscretiser()` and all other Feature-engine transformers seamlessly integrate with scikit-learn `pipelines `_. -Python code example -------------------- +Python implementation +--------------------- In this section, we'll show the main functionality of :class:`EqualWidthDiscretiser()`. @@ -71,18 +69,20 @@ test sets: .. code:: python - import matplotlib.pyplot as plt - from sklearn.datasets import fetch_openml - from sklearn.model_selection import train_test_split + import matplotlib.pyplot as plt + from sklearn.datasets import fetch_openml + from sklearn.model_selection import train_test_split - from feature_engine.discretisation import EqualFrequencyDiscretiser + from feature_engine.discretisation import EqualFrequencyDiscretiser - # Load dataset - X, y = fetch_openml(name='house_prices', version=1, return_X_y=True, as_frame=True) - X.set_index('Id', inplace=True) + # Load dataset + X, y = fetch_openml( + name='house_prices', version=1, return_X_y=True, as_frame=True) + X.set_index('Id', inplace=True) - # Separate into train and test sets - X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + # Separate into train and test sets + X_train, X_test, y_train, y_test = train_test_split( + X, y, test_size=0.3, random_state=42) Equal-width Discretisation @@ -92,27 +92,26 @@ In this example, let's discretise two variables, LotArea and GrLivArea, into 10 .. code:: python - # List the target numeric variables for equal-width discretisation - TARGET_NUMERIC_FEATURES= ['LotArea','GrLivArea'] - # Set up the discretisation transformer - disc = EqualWidthDiscretiser(bins=10, variables=TARGET_NUMERIC_FEATURES) + disc = EqualWidthDiscretiser(bins=10, variables=['LotArea','GrLivArea']) # Fit the transformer disc.fit(X_train) +.. note:: -Note that if we do not specify the variables (default=`None`), :class:`EqualWidthDiscretiser` will automatically infer -the data types to compute the interval limits for all numeric variables. + Note that if we do not specify the variables (default=`None`), :class:`EqualWidthDiscretiser` will automatically infer + the data types to compute the interval limits for all numeric variables. With the `fit()` method, the discretiser learns the bin boundaries and saves them into a dictionary so we can use them -to transform unseen data: +to transform new data: .. code:: python # Learned limits for each variable disc.binner_dict_ +In the following dictionary, we see the interval limits determined for each variable: .. code:: python @@ -141,11 +140,15 @@ to transform unseen data: Note that the lower and upper boundaries are set to -inf and inf, respectively. This behavior ensures that the transformer -will be able to allocate to the extreme bins values that are smaller or greater than the observed minimum and maximum +is able to allocate to the extreme bins values that are smaller or greater than the observed minimum and maximum values in the training set. -:class:`EqualWidthDiscretiser` will not work in the presence of missing values. Therefore, we should either remove or -impute missing values before fitting the transformer. +.. note:: + + :class:`EqualWidthDiscretiser` will not work in the presence of missing values. Therefore, we should either remove or + impute missing values before fitting the transformer. + +Let's now discretise the variables in the training and test sets: .. code:: python @@ -153,12 +156,12 @@ impute missing values before fitting the transformer. train_t = disc.transform(X_train) test_t = disc.transform(X_test) -Let's visualise the first rows of the raw data and the transformed data: +Let's display the first rows of the raw data: .. code:: python # Raw data - print(X_train[TARGET_NUMERIC_FEATURES].head()) + print(X_train[['LotArea','GrLivArea']].head()) Here we see the original variables: @@ -172,11 +175,12 @@ Here we see the original variables: 933 11670 1905 436 10667 1661 +Let's display the first rows of the transformed data: .. code:: python # Transformed data - print(train_t[TARGET_NUMERIC_FEATURES].head()) + print(train_t[['LotArea','GrLivArea']].head()) Here we observe the variables after discretisation: @@ -209,15 +213,18 @@ histogram: | -Equal width discretisation does not improve the spread of values over the value range. If the variable is skewed, it will -still be skewed after the discretisation. +.. note:: + + Equal width discretisation does not improve the spread of values over the value range. If the variable is skewed, it will + still be skewed after the discretisation. -Finally, since the default value for the `return_object` parameter is `False`, the transformer outputs integer variables: +By default, the data type of the transformed variables is integer. Let's check that out: .. code:: python - train_t[TARGET_NUMERIC_FEATURES].dtypes + train_t[['LotArea','GrLivArea']].dtypes +In the following output, we see that the discretised variables are of type integer: .. code:: python @@ -229,8 +236,8 @@ Finally, since the default value for the `return_object` parameter is `False`, t Return variables as object ~~~~~~~~~~~~~~~~~~~~~~~~~~ -Categorical encoders in Feature-engine are designed to work by default with variables of type object. Therefore, to -further encode the discretised output with Feature-engine's encoders, we can set `return_object=True` instead. This will +Categorical encoders in feature-engine are designed to work by default with variables of type object. Therefore, to +further encode the discretised output with feature-engine's encoders, we can set `return_object=True` instead. This will return the transformed variables as object. Let's say we want to obtain monotonic relationships between the variable and the target. We can do that seamlessly by @@ -247,7 +254,7 @@ If we want to output the intervals limits instead of integers, we can set `retur # Set up the discretisation transformer disc = EqualFrequencyDiscretiser( bins=10, - variables=TARGET_NUMERIC_FEATURES, + variables=['LotArea','GrLivArea'], return_boundaries=True) # Fit the transformer @@ -257,11 +264,9 @@ If we want to output the intervals limits instead of integers, we can set `retur test_t = disc.transform(X_test) # Visualise output (boundaries) - print(test_t[TARGET_NUMERIC_FEATURES].head()) + print(test_t[['LotArea','GrLivArea']].head()) -In the following output we see that the transformed variables now display the interval limits. While we can't use these -variables to train machine learning models, as opposed to the variables discretised into integers, they are very useful -in this format for data analysis, and they can also be passed on to any Feature-engine encoder for further processing. +In the following output we see that the transformed variables now display the interval limits. .. code:: python @@ -273,13 +278,16 @@ in this format for data analysis, and they can also be passed on to any Feature- 523 (-inf, 22694.5] (1395.6, 1926.4] 1037 (-inf, 22694.5] (1395.6, 1926.4] +While we can't use these +variables to train machine learning models, as opposed to the variables discretised into integers, they are very useful +in this format for data analysis, and they can also be passed on to any Feature-engine encoder for further processing. See Also -------- For alternative binning techniques, check out the following resources: -- Further feature-engine :ref:`discretizers / binning methods ` +- Further feature-engine :ref:`discretisers / binning methods ` - Scikit-learn's `KBinsDiscretizer `_. Check out also: From 1a089b1c323a87759defa5a2f62ca04987c8898e Mon Sep 17 00:00:00 2001 From: solegalli Date: Sat, 28 Mar 2026 10:24:15 -0400 Subject: [PATCH 14/21] update arbitrary disc --- .../discretisation/ArbitraryDiscretiser.rst | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/docs/user_guide/discretisation/ArbitraryDiscretiser.rst b/docs/user_guide/discretisation/ArbitraryDiscretiser.rst index 3f212b708..736635721 100644 --- a/docs/user_guide/discretisation/ArbitraryDiscretiser.rst +++ b/docs/user_guide/discretisation/ArbitraryDiscretiser.rst @@ -6,21 +6,22 @@ ArbitraryDiscretiser ==================== The :class:`ArbitraryDiscretiser()` sorts the variable values into contiguous intervals -which limits are arbitrarily defined by the user. Thus, you must provide a dictionary -with the variable names as keys and a list with the limits of the intervals as values, -when setting up the discretiser. +whose limits are arbitrarily defined by the user. -The :class:`ArbitraryDiscretiser()` works only with numerical variables. The discretiser -will check that the variables entered by the user are present in the train set and cast -as numerical. +.. note:: + You must provide a dictionary + with the variable names as keys and a list with the limits of the intervals as values, + when setting up the discretiser. -Example -------- -Let's take a look at how this transformer works. First, let's load a dataset and plot a -histogram of a continuous variable. We use the california housing dataset that comes +Python implementation +--------------------- + +Let's take a look at how this transformer works. We'll use the california housing dataset that comes with Scikit-learn. +Let's load the dataset: + .. code:: python import numpy as np @@ -31,6 +32,10 @@ with Scikit-learn. X, y = fetch_california_housing( return_X_y=True, as_frame=True) +Let's plot a histogram of a continuous variable. + +.. code:: python + X['MedInc'].hist(bins=20) plt.xlabel('MedInc') plt.ylabel('Number of obs') @@ -99,7 +104,7 @@ If we return the interval values as integers, the discretiser has the option to the transformed variable as integer or as object. Why would we want the transformed variables as object? -Categorical encoders in Feature-engine are designed to work with variables of type +Categorical encoders in feature-engine are designed to work with variables of type object by default. Thus, if you wish to encode the returned bins further, say to try and obtain monotonic relationships between the variable and the target, you can do so seamlessly by setting `return_object` to True. You can find an example of how to use From d6c6771ea91e80368960198d0aa63fead52a7ca3 Mon Sep 17 00:00:00 2001 From: solegalli Date: Tue, 31 Mar 2026 13:23:21 -0400 Subject: [PATCH 15/21] final edits to eqd --- .../EqualFrequencyDiscretiser.rst | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst b/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst index 8b488db8d..0e520de5b 100644 --- a/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst +++ b/docs/user_guide/discretisation/EqualFrequencyDiscretiser.rst @@ -6,7 +6,7 @@ EqualFrequencyDiscretiser ========================= Equal frequency discretisation involves dividing continuous attributes into bins that -each contain approximately the same number of observations. The boundaries of these +contain approximately the same number of observations. The boundaries of these bins are determined by specific **quantile values**, based on the desired number of bins. .. tip:: @@ -50,10 +50,13 @@ Feature-engine's :class:`EqualFrequencyDiscretiser` applies equal frequency disc the `pandas.qcut()` function under the hood to determine the interval limits. You can specify the variables to be discretised by passing their names in a list when setting up the transformer. Alternatively, -:class:`EqualFrequencyDiscretiser` will automatically infer the data types to compute the interval limits for all numeric variables. +:class:`EqualFrequencyDiscretiser` will automatically infer the data types and compute the interval limits for all numeric variables. -**Optimal number of intervals:** With :class:`EqualFrequencyDiscretiser`, the user defines the number of bins. Smaller intervals -may be required if the variable is highly skewed or not continuous. +**Optimal number of intervals:** With :class:`EqualFrequencyDiscretiser`, the user defines the number of bins. + +.. tip:: + + Fewer intervals may be required if the variable is highly skewed or not continuous. **Integration with scikit-learn:** :class:`EqualFrequencyDiscretiser` and all other feature-engine transformers seamlessly integrate with scikit-learn `pipelines `_. @@ -91,7 +94,7 @@ Equal-frequency Discretisation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Let's discretise two variables, LotArea and GrLivArea, into 10 intervals of equal -number of observations. +number of observations: .. code:: python @@ -293,7 +296,7 @@ intervals varies. In other words, they don't have the same width, contrarily to 1037 (12208.2, 14570.7] (1601.6, 1717.7] Unlike the variables discretised into integers, these variables cannot be used to train machine learning models; however, -they are still highly helpful for data analysis in this format, and they may be sent to any Feature-engine encoder for +they are still highly helpful for data analysis in this format, and we can use any Feature-engine encoder with them for additional processing. Binning skewed data @@ -384,7 +387,7 @@ See Also For alternative binning techniques, check out the following resources: -- Further feature-engine :ref:`discretisers / binning methods ` +- Other feature-engine :ref:`discretisers / binning methods ` - Scikit-learn's `KBinsDiscretizer `_. Check out also: From 59122b2db18766c15c8cb08103d807bcc7368b67 Mon Sep 17 00:00:00 2001 From: solegalli Date: Tue, 31 Mar 2026 13:37:38 -0400 Subject: [PATCH 16/21] final update ewd --- .../discretisation/EqualWidthDiscretiser.rst | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/user_guide/discretisation/EqualWidthDiscretiser.rst b/docs/user_guide/discretisation/EqualWidthDiscretiser.rst index 8333992a1..918f72116 100644 --- a/docs/user_guide/discretisation/EqualWidthDiscretiser.rst +++ b/docs/user_guide/discretisation/EqualWidthDiscretiser.rst @@ -15,11 +15,17 @@ using the following formula: Here, `bins` is the number of intervals specified by the user and `max(X)` and `min(X)` are the minimum and maximum values of the variable to discretise. +In short, we determine the variable's value range and divide it into the number of desired intervals +to get the interval size. + +For example, if the variable's minimum and maximum value are 0 and 100, +the value range is 100 - 0 = 100. If we want 5 intervals, then the interval width is 100 / 5 = 20. +The bins are then 0 - 20, 20 - 40, 40 - 60, 60 - 80 and 80 - 100. Advantages and Limitations -------------------------- -Equal binning discretisation has some advantages and also limitations. +Equal width discretisation has some advantages and also limitations. Advantages ~~~~~~~~~~ @@ -50,8 +56,11 @@ You can specify the variables to be discretised by passing their names in a list :class:`EqualWidthDiscretiser()` will automatically infer the data types and compute the interval limits for all numeric variables. -**Optimal number of intervals:** With :class:`EqualWidthDiscretiser()`, the user defines the number of bins. Smaller intervals -may be required if the variable is highly skewed or not continuous. +**Optimal number of intervals:** With :class:`EqualWidthDiscretiser()`, the user defines the number of bins. + +.. tip:: + + Fewer intervals may be required if the variable is highly skewed or not continuous. **Integration with scikit-learn:** :class:`EqualWidthDiscretiser()` and all other Feature-engine transformers seamlessly integrate with scikit-learn `pipelines `_. @@ -101,7 +110,7 @@ In this example, let's discretise two variables, LotArea and GrLivArea, into 10 .. note:: Note that if we do not specify the variables (default=`None`), :class:`EqualWidthDiscretiser` will automatically infer - the data types to compute the interval limits for all numeric variables. + the data types and compute the interval limits for all numeric variables. With the `fit()` method, the discretiser learns the bin boundaries and saves them into a dictionary so we can use them to transform new data: @@ -206,8 +215,7 @@ Now, let's check out the number of observations per bin by creating a bar plot: plt.ylabel('Number of houses') plt.show() -As we see in the following image, the intervals contain different number of observations. It's a similar output to a -histogram: +As we see in the following image, the intervals contain different number of observations: .. image:: ../../images/equalwidthdiscretisation.png @@ -280,14 +288,14 @@ In the following output we see that the transformed variables now display the in While we can't use these variables to train machine learning models, as opposed to the variables discretised into integers, they are very useful -in this format for data analysis, and they can also be passed on to any Feature-engine encoder for further processing. +in this format for data analysis, and we can use any feature-engine encoder for further processing. See Also -------- For alternative binning techniques, check out the following resources: -- Further feature-engine :ref:`discretisers / binning methods ` +- Other feature-engine :ref:`discretisers / binning methods ` - Scikit-learn's `KBinsDiscretizer `_. Check out also: From 6688ac2bd5a70cdd033af848dee4be0ff83b12be Mon Sep 17 00:00:00 2001 From: solegalli Date: Tue, 31 Mar 2026 13:42:15 -0400 Subject: [PATCH 17/21] final edits to arbitrary disc --- .../user_guide/discretisation/ArbitraryDiscretiser.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/user_guide/discretisation/ArbitraryDiscretiser.rst b/docs/user_guide/discretisation/ArbitraryDiscretiser.rst index 736635721..0bd4b10db 100644 --- a/docs/user_guide/discretisation/ArbitraryDiscretiser.rst +++ b/docs/user_guide/discretisation/ArbitraryDiscretiser.rst @@ -5,7 +5,7 @@ ArbitraryDiscretiser ==================== -The :class:`ArbitraryDiscretiser()` sorts the variable values into contiguous intervals +:class:`ArbitraryDiscretiser()` sorts the variable values into contiguous intervals whose limits are arbitrarily defined by the user. .. note:: @@ -30,7 +30,7 @@ Let's load the dataset: from sklearn.datasets import fetch_california_housing from feature_engine.discretisation import ArbitraryDiscretiser - X, y = fetch_california_housing( return_X_y=True, as_frame=True) + X, y = fetch_california_housing(return_X_y=True, as_frame=True) Let's plot a histogram of a continuous variable. @@ -80,7 +80,7 @@ setting `return_boundaries` to `True`. .. code:: python - X, y = fetch_california_housing( return_X_y=True, as_frame=True) + X, y = fetch_california_housing(return_X_y=True, as_frame=True) user_dict = {'MedInc': [0, 2, 4, 6, np.inf]} @@ -107,8 +107,8 @@ variables as object? Categorical encoders in feature-engine are designed to work with variables of type object by default. Thus, if you wish to encode the returned bins further, say to try and obtain monotonic relationships between the variable and the target, you can do so -seamlessly by setting `return_object` to True. You can find an example of how to use -this functionality `here `_. +seamlessly by setting `return_object` to True. You can find an example of discretisation followed +by encoding to obtain monotonic releationships `here `_. Additional resources -------------------- From 98634a12d0e727c82364e1aa983aa561b0ef83eb Mon Sep 17 00:00:00 2001 From: solegalli Date: Tue, 31 Mar 2026 14:40:47 -0400 Subject: [PATCH 18/21] update decision tree disc --- .../DecisionTreeDiscretiser.rst | 70 +++++++++++++------ 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/docs/user_guide/discretisation/DecisionTreeDiscretiser.rst b/docs/user_guide/discretisation/DecisionTreeDiscretiser.rst index c055c2c4a..5cdf43f20 100644 --- a/docs/user_guide/discretisation/DecisionTreeDiscretiser.rst +++ b/docs/user_guide/discretisation/DecisionTreeDiscretiser.rst @@ -45,7 +45,7 @@ Limitations Decision tree discretiser ------------------------- -The :class:`DecisionTreeDiscretiser()` applies discretisation based on the interval limits found +:class:`DecisionTreeDiscretiser()` applies discretisation based on the interval limits found by decision trees algorithms. It uses decision trees to find the optimal interval limits. Next, it sorts the variable into those intervals. @@ -74,10 +74,10 @@ monotonically) related with the target. According to the authors, the addition of these new features had a significant impact on the performance of linear models. -Code examples -------------- +Python implementation +--------------------- -In the following sections, we will do decision tree discretisation to showcase the functionality of +In the following sections, we will apply decision tree discretisation to showcase the functionality of the :class:`DecisionTreeDiscretiser()`. We will discretise 2 numerical variables of the Ames house prices dataset using decision trees. @@ -136,10 +136,12 @@ In the following output we see the predictor variables of the house prices datas We set up the decision tree discretiser to find the optimal intervals using decision trees. -The :class:`DecisionTreeDiscretiser()` will optimise the depth of the decision tree classifier -or regressor by default and using cross-validation. That's why we need to select the appropriate -metric for the optimisation. In this example, we are using decision tree regression, so we select -the mean squared error metric. +.. note:: + + :class:`DecisionTreeDiscretiser()` will optimise the depth of the decision tree classifier + or regressor by default using cross-validation. That's why we need to select the appropriate + metric for the optimisation. In this example, we are using decision tree regression, so we select + the mean squared error metric. We specify in the `bin_output` that we want to replace the continuous attribute values with the predictions of the decision tree. @@ -156,8 +158,11 @@ predictions of the decision tree. disc.fit(X_train, y_train) -The scoring and cv parameter work exactly as those from any scikit-learn estimator. So we can pass -any value that is also valid for those estimators. Check scikit-learn's documentation for more information. +.. note:: + + The scoring and cv parameter work exactly as those from any scikit-learn estimator. So we can pass + any value that is also valid for those estimators. Check scikit-learn's documentation for more information. + With `fit()` the transformer fits a decision tree for each one of the continuous features. Then, we can go ahead replace the variable values by the predictions of the trees and display the transformed @@ -188,6 +193,8 @@ transformed variables: train_t[['LotArea', 'GrLivArea']].nunique() +In the following output, we see the unique number of bins per variable: + .. code:: python LotArea 4 @@ -200,6 +207,7 @@ The `binner_dict_` stores the details of each decision tree. disc.binner_dict_ +Below the decision tree parameters per variable: .. code:: python @@ -221,10 +229,12 @@ necessarily contain the same number of observations. Let's check that out with a plt.ylabel('Number of houses') plt.show() +In the following image we see that there is a different number of observations on each bin: .. image:: ../../images/treediscretisation.png -Finally, we can determine if we have a monotonic relationship with the target after the transformation: +Finally, we can determine if we have a monotonic relationship with the target after the transformation. +We'll make a scatter plot of the observations within each bin vs the target variable: .. code:: python @@ -233,6 +243,8 @@ Finally, we can determine if we have a monotonic relationship with the target af plt.ylabel('Sale Price') plt.show() +In the following image we see that as GrLivArea grows, so does the house sales price: + .. image:: ../../images/treemonotonicprediction.png Rounding the prediction value @@ -261,17 +273,24 @@ the `precision` parameter: plt.ylabel('Number of houses') plt.show() +In the following image, we see the number of observations per interval after discretising the +variable. Here, the intervals are represented as the tree predictions with only 1 decimal after +the comma: + .. image:: ../../images/treepredictionrounded.png -In this example, we are predicting house prices, which is a continuous target. The procedure for -classification models is identical, we just need to set the parameter `regression` to False. +.. note:: + + In this Python implementation, we are predicting house prices, which is a continuous target. Hence, we used regression + trees to discretise the variables. For classification models, we must select classification trees by setting + the parameter `regression` to `False`. Discretisation with interval limits ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In this section, instead of replacing the original variable values with the predictions of the -decision tree, we will return the limits of the intervals. When returning interval boundaries, -we need to set the precision to a positive integer. +decision tree, we will return the limits of the intervals. To return interval boundaries, +we need to set the precision to a positive integer: .. code:: python @@ -286,13 +305,17 @@ we need to set the precision to a positive integer. # fit the transformer disc.fit(X_train, y_train) -In this case, when we explore the `binner_dict_` attribute, we will see the interval limits instead +With `fit()`, :class:`DecisionTreeDiscretiser()` trained a decision tree per variable to +discretise, but instead of storing the decision tree, it saves the interval limits. Hence, +when we explore the `binner_dict_` attribute, we will see the interval limits instead of the decision trees: .. code:: python disc.binner_dict_ +In the following output we see the limits of the intervals determined with decision trees: + .. code:: python {'LotArea': [-inf, 8637.5, 10924.0, 13848.5, inf], @@ -335,7 +358,8 @@ In the following output we see the interval limits into which the values of the 799 (-inf, 8637.5] (1651.5, 1825.0] 380 (-inf, 8637.5] (1651.5, 1825.0] -To train machine learning algorithms we would follow that up with any categorical data encoding method. +These values per se are not suitable to train machine learning models. Instead, we can return the +intervals as integers (see next section), or use any categorical data encoding procedure instead. Discretisation with ordinal numbers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -356,12 +380,16 @@ which the value was sorted. Here, 0 is the first bin, 1 the second, and so on. # fit the transformer disc.fit(X_train, y_train) -The `binner_dict_` will also contain the limits of the intervals: +When discretising into bin number, :class:`DecisionTreeDiscretiser()` saves the interval +limits in the `binner_dict_` attribute: .. code:: python disc.binner_dict_ +In the following output, we see the limits of the intervals that were determined using +decision trees: + .. code:: python {'LotArea': [-inf, 8637.5, 10924.0, 13848.5, inf], @@ -408,12 +436,12 @@ were sorted: Additional considerations ------------------------- -Decision tree discretisation uses scikit-learn's DecisionTreeRegressor or DecisionTreeClassifier under +Decision tree discretisation uses scikit-learn's `DecisionTreeRegressor` or `DecisionTreeClassifier` under the hood to find the optimal interval limits. These models do not support missing data. Hence, we need to replace missing values with numbers before proceeding with the disrcretisation. -Tutorials, books and courses ----------------------------- +Additional resources +-------------------- For tutorials about this and other discretisation methods and feature engineering techniques check out our online course: From 87978543e43cd30b1be2f677449aad7bdbb0d9ff Mon Sep 17 00:00:00 2001 From: solegalli Date: Tue, 31 Mar 2026 15:41:59 -0400 Subject: [PATCH 19/21] update geometric mean disc --- docs/images/increasingwidthdisc.png | Bin 17321 -> 136798 bytes docs/images/increasingwidthintervalsize.png | Bin 0 -> 81702 bytes .../GeometricWidthDiscretiser.rst | 157 +++++++++++++----- 3 files changed, 114 insertions(+), 43 deletions(-) create mode 100644 docs/images/increasingwidthintervalsize.png diff --git a/docs/images/increasingwidthdisc.png b/docs/images/increasingwidthdisc.png index e6f70b9e0b0099816d116407c55d17bcd06be482..2be904612340a17e52205e69c89023501c90aab3 100644 GIT binary patch literal 136798 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�Yea^I@Cn*B@5HjpZz+o?dBE+kB`TV)?(x9 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 Km8%qO!u}Uoe{Q@0 literal 17321 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 a_g$}7m6&PCIQZXYAeUsX%A`r_-uXYqEfpvL diff --git a/docs/images/increasingwidthintervalsize.png b/docs/images/increasingwidthintervalsize.png new file mode 100644 index 0000000000000000000000000000000000000000..01ad2a6cde9a3d90dc1d61d2fbdb771d5e4ddc6f GIT binary patch literal 81702 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 hmZjwXR78KRpg^9_-XZJ)CiM#zxVw0h>xe`). - -Let's load the house prices dataset and separate it into train and test sets: +Let's look at an example using the house prices dataset. Let's load the house prices +dataset and separate it into train and test sets: .. code:: python - import numpy as np - import pandas as pd - import matplotlib.pyplot as plt - from sklearn.model_selection import train_test_split + import numpy as np + import pandas as pd + import matplotlib.pyplot as plt + from sklearn.datasets import fetch_openml + from sklearn.model_selection import train_test_split - from feature_engine.discretisation import GeometricWidthDiscretiser + from feature_engine.discretisation import GeometricWidthDiscretiser - # Load dataset - data = pd.read_csv('houseprice.csv') + # Load dataset + data = fetch_openml( + name='house_prices', + version=1, + as_frame=True, + parser='auto', + ).frame - # Separate into train and test sets - X_train, X_test, y_train, y_test = train_test_split( - data.drop(['Id', 'SalePrice'], axis=1), - data['SalePrice'], test_size=0.3, random_state=0) + # Separate into train and test sets + X_train, X_test, y_train, y_test = train_test_split( + data.drop(['Id', 'SalePrice'], axis=1), + data['SalePrice'], test_size=0.3, random_state=0) Now, we want to discretise the 2 variables indicated below into 10 intervals of increasing @@ -69,20 +80,21 @@ width: .. code:: python - # set up the discretisation transformer - disc = GeometricWidthDiscretiser(bins=10, variables=['LotArea', 'GrLivArea']) + # set up the discretisation transformer + disc = GeometricWidthDiscretiser( + bins=10, variables=['LotArea', 'GrLivArea']) - # fit the transformer - disc.fit(X_train) + # fit the transformer + disc.fit(X_train) -With `fit()` the transformer learns the boundaries of each interval. Then, we can go +With `fit()` the transformer learned the boundaries of each interval. Then, we can go ahead and sort the values into the intervals: .. code:: python # transform the data - train_t= disc.transform(X_train) - test_t= disc.transform(X_test) + train_t = disc.transform(X_train) + test_t = disc.transform(X_test) The `binner_dict_` stores the interval limits identified for each variable. @@ -90,6 +102,8 @@ The `binner_dict_` stores the interval limits identified for each variable. disc.binner_dict_ +In the following output, we see the interval limits determined for each variable: + .. code:: python 'LotArea': [-inf, @@ -115,35 +129,92 @@ The `binner_dict_` stores the interval limits identified for each variable. 2212.974, inf]} +The interval width varies. Let's print out the width of each interval to corroborate that: + +.. code:: python + + bin_0 = disc.binner_dict_['LotArea'][1] + interval = [] + for bin_ in disc.binner_dict_['LotArea'][2:-1]: + int_ = bin_ - bin_0 + print(int_) + interval.append(int_) + bin_0 = bin_ + +In the following output we see how the width of each interval increases: + +.. code:: python + + 8.230713691228857 + 28.084565482384278 + 95.82921334936668 + 326.98523097744055 + 1115.728049311767 + 3807.0498667474258 + 12990.287997905882 + 44325.025459335004 + +To better examine the width of the intervals, we can plot the interval number vs its width: + +.. code:: python + + pd.Series(interval).plot.bar() + plt.title("Size of the geometric intervals") + plt.ylabel("Interval width") + plt.xlabel("Interval number") + plt.plot() + +In the following image we see the how the width of the interval (y-axis) increases with the +interval number (x-axis): + +.. image:: ../../images/increasingwidthintervalsize.png + +.. tip:: + + This transformer is suitable for variables with right skewed distributions. + With increasing width discretisation, each bin does not necessarily contain the same number -of observations. This transformer is suitable for variables with right skewed distributions. +of observations. -Let's compare the variable distribution before and after the discretisation: +Let's compare the variable distribution before and after the discretisation. We'll plot a +histogram of the original variable next to a bar plot of the discretised variable: .. code:: python - fig, ax = plt.subplots(1, 2) - X_train['LotArea'].hist(ax=ax[0], bins=10); - train_t['LotArea'].hist(ax=ax[1], bins=10); + # Instantiate a figure with two axes + fig, axes = plt.subplots(ncols=2, figsize=(10,5)) + + # Plot raw distribution + X_train['LotArea'].plot.hist(bins=20, ax=axes[0]) + axes[0].set_title('Original variable: Histogram') + axes[0].set_xlabel('LotArea') + + # Plot transformed distribution + train_t['LotArea'].value_counts().sort_index().plot.bar(ax=axes[1]) + axes[1].set_title('Transformed variable \n geometric width binning') + + plt.tight_layout(w_pad=2) + plt.show() -We can see below that the intervals contain different number of observations. We can also -see that the shape from the distribution changed from skewed to a more "bell shaped" -distribution. +We can see on the right panel (bar plot) that the intervals contain different number of +observations. We can also see that the shape from the distribution changed from skewed +(left panel) to a more "bell shaped" distribution (right panel). .. image:: ../../images/increasingwidthdisc.png | -**Discretisation plus encoding** +Return variables as object +~~~~~~~~~~~~~~~~~~~~~~~~~~ If we return the interval values as integers, the discretiser has the option to return the transformed variable as integer or as object. Why would we want the transformed variables as object? -Categorical encoders in Feature-engine are designed to work with variables of type +Categorical encoders in feature-engine are designed to work with variables of type object by default. Thus, if you wish to encode the returned bins further, say to try and obtain monotonic relationships between the variable and the target, you can do so -seamlessly by setting `return_object` to True. You can find an example of how to use +seamlessly by setting `return_object` to `True`. You can find an example of how to use this functionality `here `_. Additional resources From b30a7c94f98bf5751a167b25d8d83bc6c93702dc Mon Sep 17 00:00:00 2001 From: solegalli Date: Tue, 31 Mar 2026 15:56:42 -0400 Subject: [PATCH 20/21] fixed interval calculation --- docs/images/increasingwidthintervalsize.png | Bin 81702 -> 84954 bytes .../GeometricWidthDiscretiser.rst | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/images/increasingwidthintervalsize.png b/docs/images/increasingwidthintervalsize.png index 01ad2a6cde9a3d90dc1d61d2fbdb771d5e4ddc6f..4a11a405bd99b620e5834a3570e05c6555e7c33c 100644 GIT binary patch literal 84954 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 hmZjwXR78KRpg^9_-XZJ)CiM#zxVw0h>xe Date: Tue, 31 Mar 2026 16:00:38 -0400 Subject: [PATCH 21/21] finalise update geo disc --- .../user_guide/discretisation/GeometricWidthDiscretiser.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/user_guide/discretisation/GeometricWidthDiscretiser.rst b/docs/user_guide/discretisation/GeometricWidthDiscretiser.rst index da216153e..4c0d8fad3 100644 --- a/docs/user_guide/discretisation/GeometricWidthDiscretiser.rst +++ b/docs/user_guide/discretisation/GeometricWidthDiscretiser.rst @@ -129,6 +129,9 @@ In the following output, we see the interval limits determined for each variable 2212.974, inf]} +Interval width +~~~~~~~~~~~~~~ + The interval width varies. Let's print out the width of each interval to corroborate that: .. code:: python @@ -174,6 +177,9 @@ interval number (x-axis): This transformer is suitable for variables with right skewed distributions. +Observations per bin +~~~~~~~~~~~~~~~~~~~~ + With increasing width discretisation, each bin does not necessarily contain the same number of observations.