如何解决为什么我在 python 中创建的类无法识别设置为 False 的属性?
我正在尝试参加房价 - 高级回归技术 kaggle 比赛
我正在编写一个自定义转换器,可与添加组合属性的 Scikit-Learn 功能无缝协作
transformer 有四个超参数 (add_baths,add_bsmt_baths,add_above_grade_baths,add_porch_area
) 默认设置为 True。这个超参数可以让我很容易地发现添加这个属性是否有助于机器学习算法。
但问题是,当我将这些超参数之一设置为 False 时,该类仍将列返回给我,就像我将其设置为 True
class CombinedAttributesAdder(BaseEstimator,TransformerMixin):
def __init__(self,add_baths=True,add_bsmt_baths=True,add_above_grade_baths=True,add_porch_area=True):
self.add_baths = add_baths
self.add_bsmt_baths = add_bsmt_baths
self.add_above_grade_baths = add_above_grade_baths
self.add_porch_area = add_porch_area
def fit(self,X,y=None):
return self
def transform(self,X):
X['T_FlrsF'] = X['1stFlrsF'] + X['2ndFlrsF']
if self.add_baths:
X['T_Bath'] = X['BsmtFullBath'] + X['BsmtHalfBath'] + X['FullBath'] + X['HalfBath']
if self.add_bsmt_baths:
X['T_BsmtBath'] = X['BsmtFullBath'] + X['BsmtHalfBath']
if self.add_above_grade_baths:
X['T_agBath'] = X['FullBath'] + X['HalfBath']
if self.add_porch_area:
X['T_Porch'] = X['OpenPorchSF'] + X['EnclosedPorch'] + X['3SsnPorch'] + X['ScreenPorch']
return X
attr_adder = CombinedAttributesAdder(add_baths=False,add_bsmt_baths=False)
housing_extra_attribs = attr_adder.transform(housing)
这里应该返回所有列,因为我设置了参数 add_baths=False,add_bsmt_baths=False
它不应该创建 T_Bath
和 T_BsmtBath
列
housing_extra_attribs.columns
...
Index(['Id','MSSubClass','MSZoning','LotFrontage','LotArea','Street','Alley','LotShape','LandContour','Utilities','LotConfig','LandSlope','Neighborhood','Condition1','Condition2','BldgType','HouseStyle','OverallQual','OverallCond','YearBuilt','YearRemodAdd','RoofStyle','RoofMatl','Exterior1st','Exterior2nd','MasVnrType','MasVnrArea','ExterQual','ExterCond','Foundation','BsmtQual','BsmtCond','BsmtExposure','BsmtFinType1','BsmtFinSF1','BsmtFinType2','BsmtFinSF2','BsmtUnfSF','TotalBsmtSF','Heating','HeatingQC','CentralAir','Electrical','1stFlrsF','2ndFlrsF','LowQualFinSF','GrLivArea','BsmtFullBath','BsmtHalfBath','FullBath','HalfBath','bedroomAbvGr','KitchenAbvGr','KitchenQual','TotRmsAbvGrd','Functional','Fireplaces','FireplaceQu','GarageType','GarageYrBlt','GarageFinish','GarageCars','GarageArea','GarageQual','GarageCond','PavedDrive','WoodDeckSF','OpenPorchSF','EnclosedPorch','3SsnPorch','ScreenPorch','PoolArea','PoolQC','MiscFeature','MiscVal','MoSold','YrSold','SaleType','SaleCondition','T_FlrsF','T_Bath','T_BsmtBath','T_agBath','T_Porch'],dtype='object')
解决方法
如果不复制转换部分中的训练数据,您就是在修改原始训练数据,因此如果您之前已经使用 True 属性对其进行了转换,那么列已经在之前创建。 请尝试以下操作,但要确保之前没有修改过训练数据:
class CombinedAttributesAdder(BaseEstimator,TransformerMixin):
def __init__(self,add_baths=True,add_bsmt_baths=True,add_above_grade_baths=True,add_porch_area=True):
self.add_baths = add_baths
self.add_bsmt_baths = add_bsmt_baths
self.add_above_grade_baths = add_above_grade_baths
self.add_porch_area = add_porch_area
def fit(self,X,y=None):
return self
def transform(self,X):
X_=X.copy()
X_['T_FlrSF'] = X_['1stFlrSF'] + X_['2ndFlrSF']
if self.add_baths:
X_['T_Bath'] = X_['BsmtFullBath'] + X_['BsmtHalfBath'] + X_['FullBath'] + X_['HalfBath']
if self.add_bsmt_baths:
X_['T_BsmtBath'] = X_['BsmtFullBath'] + X_['BsmtHalfBath']
if self.add_above_grade_baths:
X_['T_agBath'] = X_['FullBath'] + X_['HalfBath']
if self.add_porch_area:
X_['T_Porch'] = X_['OpenPorchSF'] + X_['EnclosedPorch'] + X_['3SsnPorch'] + X_['ScreenPorch']
return X_
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。