我正在创建一个自定义Estimator
,如果变量是连续变量还是离散变量,则需要执行其他操作。即,通过插入“虚拟变量”获得的任何变量都不满足我的模型对连续变量的假设,并且我的连续变量不满足我的模型对离散变量的假设。因此,我必须区别对待它们。
直到现在,我一直在输入pandas
帧,并仅包括作为参数提供的哪些列是连续的列(其余列假定为离散列)的列表:
class MyEstimator(sklearn.base.BaseEstimator):
def __init__(self, a_list_of_continuous_column_names=None):
self.a_list_of_continuous_column_names = a_list_of_continuous_column_names
def fit(self, X,y,**fit_params):
dcs = self.figure_out_which_columns_are_discrete_(X)
ccs = self.a_list_of_continuous_column_names
self.fit_discrete_(X[dcs],y,**fit_params)
self.fit_continuous_(X[ccs],y,**fit_params)
...
一切都很好。但是,随着模型的发展,我已经实现了Pipeline
来进行数据转换等。熊猫列名称列表过程变得站不住脚了。首先,我正在做交叉验证的工作,sklearn
交叉验证方法不喜欢pandas
框架。可以,因为我可以发送列索引列表而不是列名。但是,我的Pipeline
也正在执行功能选择。因此,在X
实际到达MyEstimator
时,列索引自其构造以来已发生变化。
我可以重构sklearn
交叉验证以便与DataFrames
一起很好地玩,但是我希望有更好的方法,特别是因为我认为需要发送pandas
帧刚开始很烂。谁能想到一种使这种事情发生的好方法?