[英]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.