Dimas Mukhlas Widiantoro

Welcome To dimasmukhlas.com

I am Dimas Mukhlas Widiantoro, a seasoned growth expert with 12 years of experience growing Brainly. I share my expertise in growth strategies, user acquisition, and product development. View my complete portfolio at codify.my.id

Purpose on making transformer

 See this code


from sklearn.base import BaseEstimator, TransformerMixin


rooms_ix, bedrooms_ix, population_ix, households_ix = 3,4,5,6


class CombinedAttributesAdder(BaseEstimator, TransformerMixin):

    def __init__(self, add_bedrooms_per_room = True):

        self.add_bedrooms_per_room = add_bedrooms_per_room

    def fit(self, X, y=None):

        return self 

    def transform(self, X, y=None):

        rooms_per_household = X[:,rooms_ix]/X[:,households_ix]

        population_per_household = X[:, population_ix]/X[:,households_ix]

        if self.add_bedrooms_per_room:

            bedrooms_per_room = X[:,bedrooms_ix]/X[:,rooms_ix]

            return np.c_[X, rooms_per_household, population_per_household, bedrooms_per_room]

        else:

            return np.c_[X, rooms_per_household,population_per_household]


attr_adder = CombinedAttributesAdder(add_bedrooms_per_room=False)

housing_extra_attribs = attr_adder.transform(housing.values)


what does it mean? 

Sure! Here is a clear, simple line-by-line explanation of your transformer code.

I’ll explain every row in a beginner-friendly way.


📌 

Line-by-line explanation


1. Import classes needed to create a custom transformer

from sklearn.base import BaseEstimator, TransformerMixin

  • BaseEstimator → makes your transformer compatible with scikit-learn (e.g., it can be used in pipelines).

  • TransformerMixin → gives the class a default .fit_transform() behavior.


2. Indices of the columns in the data

rooms_ix, bedrooms_ix, population_ix, households_ix = 3, 4, 5, 6

This means:

  • Column 3 = total rooms

  • Column 4 = total bedrooms

  • Column 5 = population

  • Column 6 = households


These are index positions inside your housing.values NumPy array.


3. Start defining a new transformer class

class CombinedAttributesAdder(BaseEstimator, TransformerMixin):

You are creating a new class that can:

  • fit

  • transform


data like scikit-learn transformers do.


4. Constructor (runs when the object is created)

    def __init__(self, add_bedrooms_per_room=True):
        self.add_bedrooms_per_room = add_bedrooms_per_room

  • Saves whether you want to add the new column bedrooms_per_room.

  • Setting it here makes the transformer work well inside pipelines.


5. The fit method

    def fit(self, X, y=None):
        return self

  • This transformer does not need to learn anything from the data.

  • So .fit() simply returns itself.

  • Required by scikit-learn’s interface.


6. The transform method (creates new features)

    def transform(self, X, y=None):

This method is run when you call .transform() or inside a pipeline.


7. Compute rooms per household

        rooms_per_household = X[:, rooms_ix] / X[:, households_ix]

  • Takes column 3 (rooms)

  • Divides by column 6 (households)

    → A new, more helpful feature.


8. Compute population per household

        population_per_household = X[:, population_ix] / X[:, households_ix]

Same idea:

  • Column 5 (population)

  • Divided by column 6 (households)


9. If user wants bedrooms_per_room, calculate it

        if self.add_bedrooms_per_room:
            bedrooms_per_room = X[:, bedrooms_ix] / X[:, rooms_ix]

Computes:

  • Column 4 (bedrooms)

  • Divided by column 3 (rooms)


This shows how many bedrooms each room has → a useful density measure.


10. Return X plus the new columns

            return np.c_[X, rooms_per_household, population_per_household, bedrooms_per_room]

np.c_[] = concatenate columns side-by-side.


So you return:

  • original data

    • rooms_per_household

    • population_per_household

    • bedrooms_per_room


11. If bedrooms_per_room is disabled, return fewer columns

        else:
            return np.c_[X, rooms_per_household, population_per_household]

Only returns two engineered features.


12. Create a transformer object

attr_adder = CombinedAttributesAdder(add_bedrooms_per_room=False)

  • Creates the transformer

  • Tells it not to add the bedrooms_per_room column.


13. Apply the transformer to the housing data

housing_extra_attribs = attr_adder.transform(housing.values)

  • housing.values converts the DataFrame to a NumPy array

  • Transformer adds new features

  • Returns a new expanded dataset containing the extra columns


🎉 

In one simple sentence


This transformer adds new useful columns (rooms per household, population per household, and optionally bedrooms per room) to improve the model’s learning.


Here’s a simple, visual “before and after” table that shows exactly what your transformer does to the data.


I’ll use small sample numbers so you can clearly see how new features are created.


🟦 

Before: Original Columns (from housing.values)

Index

Total Rooms

Total Bedrooms

Population

Households

3

6

1

150

1

3

8

2

200

2

3

10

3

300

2

(Only showing the 4 relevant columns.)


🟩 

After: New Columns Added by Transformer


New columns created:

  • rooms_per_household = rooms / households

  • population_per_household = population / households

  • bedrooms_per_room = bedrooms / rooms (only if enabled)


If 

add_bedrooms_per_room=False


(Your current setting)

Total Rooms

Total Bedrooms

Population

Households

rooms_per_household

population_per_household

6

1

150

1

6/1 = 6

150/1 = 150

8

2

200

2

8/2 = 4

200/2 = 100

10

3

300

2

10/2 = 5

300/2 = 150


If 

add_bedrooms_per_room=True


(Only if you turn it on)

Total Rooms

Total Bedrooms

Population

Households

rooms_per_household

population_per_household

bedrooms_per_room

6

1

150

1

6

150

1/6 = 0.167

8

2

200

2

4

100

2/8 = 0.25

10

3

300

2

5

150

3/10 = 0.3


🎉 

What you can see clearly


Your transformer:


✔ keeps all original columns

✔ adds useful “ratio” columns

✔ improves model quality by giving it more informative patterns


Post a Comment

0 Comments