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