解释与Python中的类相关的代码段

解释与Python中的类相关的代码段,python,pandas,numpy,Python,Pandas,Numpy,《使用Scikit Learn、Keras和TensorFlow进行机器学习》一书中有一段代码片段: 该类用于组合两个属性以创建其他属性。我不明白第二个函数(def fit)的用法?因为它不执行任何操作,所以它是多余的吗?在scikit学习中,估计器是所有其他操作的基础类。预计将实施.fit方法。这是我的建议 通常使用.fit方法 在这种特殊情况下,.transform方法可以对任何数据进行操作,而无需从.fit中了解任何附加状态,因此它实际上不需要执行任何操作。您仍然需要定义.fit方法,因为

《使用Scikit Learn、Keras和TensorFlow进行机器学习》一书中有一段代码片段:


该类用于组合两个属性以创建其他属性。我不明白第二个函数(def fit)的用法?因为它不执行任何操作,所以它是多余的吗?

在scikit学习中,估计器是所有其他操作的基础类。预计将实施
.fit
方法。这是我的建议

通常使用
.fit
方法

在这种特殊情况下,
.transform
方法可以对任何数据进行操作,而无需从
.fit
中了解任何附加状态,因此它实际上不需要执行任何操作。您仍然需要定义
.fit
方法,因为
scikit learn
期望所有估计器都有一个,即使它不起任何作用

最后,这段代码很脆弱,因为列索引是在对象外部定义的。我建议您始终使用该对象跟踪它们。然后您可以将它们称为
self.room_ix
,并且它们始终与对象一起保存(例如,如果保存并重新加载)

from sklearn.base import BaseEstimator, TransformerMixin
    
    # column index
    rooms_ix, bedrooms_ix, population_ix, households_ix = 3, 4, 5, 6
    
    class CombinedAttributesAdder(BaseEstimator, TransformerMixin):
        def __init__(self, add_bedrooms_per_room=True): # no *args or **kargs
            self.add_bedrooms_per_room = add_bedrooms_per_room
        def fit(self, X, y=None):
            return self  # nothing else to do
        def transform(self, X):
            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)