繁体   English   中英

Python中类相关的代码片段说明

[英]Explaination for a code snippet related to classes in Python

《Hands on Machine Learning using Scikit-Learn, Keras and TensorFlow》一书中有一段代码片段:

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)

class 用于组合两个属性以创建附加属性。 不明白第二个function(def fit)的用途? 既然它没有执行任何动作,是不是多余的?

在 scikit-learn 中,估计器是 class,其他一切都基于它。 预计将实现.fit方法。 是文档中的参考

通常, .fit方法对训练数据进行操作,并将一些结果 state 存储在 object 上

在这种特殊情况下, .transform方法可以对任何数据进行操作,而无需从.fit中学习任何额外的 state,因此它实际上不需要做任何事情。 您仍然需要定义.fit方法,因为scikit-learn期望所有估计器都有一个,即使它不做任何事情。

最后,此代码很脆弱,因为列索引是在 object 之外定义的。 我建议将它们传递给__init__ ,以便始终使用 object 跟踪它们。 然后您可以将它们称为self.room_ix并且它们始终与 object 一起保存(例如,如果它被保存并重新加载)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM