为了执行适当的CV,建议使用流水线,以便可以对CV中的每个折叠应用相同的转换。我可以使用tools:replace="android:appComponentFactory"
android:appComponentFactory="whateverString"
或<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
tools:replace="android:appComponentFactory"
android:appComponentFactory="@string/action_settings">
定义自定义转换。推荐哪种方法?为什么?
答案 0 :(得分:7)
完全取决于您,两者都会或多或少地达到相同的结果,只是编写代码的方式有所不同。
例如,在使用sklearn.preprocessing.FunctionTransformer
时,您可以简单地定义要使用的函数并像这样(code from official documentation)直接调用它
def all_but_first_column(X):
return X[:, 1:]
def drop_first_component(X, y):
"""
Create a pipeline with PCA and the column selector and use it to
transform the dataset.
"""
pipeline = make_pipeline(PCA(), FunctionTransformer(all_but_first_column),)
X_train, X_test, y_train, y_test = train_test_split(X, y)
pipeline.fit(X_train, y_train)
return pipeline.transform(X_test), y_test
另一方面,在使用subclassing sklearn.base.TransformerMixin
时,您必须定义整个类以及该类的fit
和transform
函数。
因此,您将必须创建一个这样的类(示例代码摘自this blog post)
class FunctionFeaturizer(TransformerMixin):
def __init__(self, *featurizers):
self.featurizers = featurizers
def fit(self, X, y=None):
return self
def transform(self, X):
#Do transformations
return transformed data
因此,如您所见,与FunctionTransformer相比,TransformerMixin
在转换功能方面给您更大的灵活性。您可以根据值应用多个转换或部分转换,等等。例如,对于您要记录的前50个值,而对于接下来的50个希望进行逆记录的值,依此类推。您可以轻松定义转换方法以选择性地处理数据。
如果您只是想直接使用函数,请使用sklearn.preprocessing.FunctionTrasformer
,否则,如果您想进行更多修改或说复杂的转换,我建议您使用subclassing sklearn.base.TransformerMixin
在这里,请看以下链接以获得更好的主意
答案 1 :(得分:3)
FunctionTransformer
和TransformerMixin
的子类之间的主要区别在于,对于后者,您有可能通过应用fit
方法来学习自定义转换器。
例如StandardScaler
在fit
方法期间学习列的均值和标准偏差,在transform
方法中,这些属性用于转换。这不可能通过简单的FunctionTransformer
来实现,至少不能以规范的方式实现,因为您必须以某种方式通过火车。
这种学习的可能性实际上是使用自定义转换器和管道的原因-如果仅通过使用FunctionTransformer
来应用普通函数,则在交叉验证过程中将一无所获。无论您是在交叉验证之前进行一次转换还是在交叉验证的每个步骤中进行转换都没有什么区别(除了后者会花费更多时间)。