Python 是否有一些固定的开销运行时间来学习转换?

Python 是否有一些固定的开销运行时间来学习转换?,python,scikit-learn,Python,Scikit Learn,我希望使用sklearn中的PCA模块对我们应用程序中的用户功能进行实时转换(用于垃圾邮件检测算法)。我们团队的负责人已经指定模型需要在100毫秒(最好是10-50毫秒)以下进行预测。到目前为止,在我的计时测试中,我得到了大约150毫秒。这是一个非常小的数据量(即我可以想象在实际应用中使用的最小数据量)。只是想知道是否有人遇到过这个问题,如果有,我能做些什么?在某个时刻,我是否需要冒险推出自己的PCA?我的第一个想法是,如果sklearn不能那么快地完成它,我无法想象我幼稚的代码能够更快地完成它

我希望使用sklearn中的PCA模块对我们应用程序中的用户功能进行实时转换(用于垃圾邮件检测算法)。我们团队的负责人已经指定模型需要在100毫秒(最好是10-50毫秒)以下进行预测。到目前为止,在我的计时测试中,我得到了大约150毫秒。这是一个非常小的数据量(即我可以想象在实际应用中使用的最小数据量)。只是想知道是否有人遇到过这个问题,如果有,我能做些什么?在某个时刻,我是否需要冒险推出自己的PCA?我的第一个想法是,如果sklearn不能那么快地完成它,我无法想象我幼稚的代码能够更快地完成它。对于这样的实时应用程序,Python是否只是限制了性能

要构建模型,有一组变压器组合在一个特征联合中:

    transformer_list=[
        ('age', Pipeline([
            ('selector', ColumnSelector(column='birthdate')),
            ('birthdate', BirthdateTransformer()),
            ('vect', DictVectorizer(sparse=False))
        ])),
        ('domain', Pipeline([
            ('selector', ColumnSelector(column='email')),
            ('counter', EmailDomainName()),
            ('vect', DictVectorizer(sparse=False))])),
        ('sex', Pipeline([
            ('selector', ColumnSelector(column='sex')),
            ('dict', DictTransformer()),
            ('vect', DictVectorizer(sparse=False))
        ]))],
    n_jobs=2,
    transformer_weights=weights)
仅有的自定义类有BirthdateTransformer和EmailDomainName:

class BirthdateTransformer(TransformerMixin):
    """
    takes list of Unix timestamps (seconds since epoch) and converts to list of ages in years
    """

    def fit(self, dates, y=None):
        return self

    def transform(self, timestamps, y=None):
        return [{'age group': age_group(ts / 1000)} for ts in timestamps]

class EmailDomainName(TransformerMixin):
    """
    Class for building sklearn Pipeline step. This class takes a list of email addresses and returns a list of dicts
    created by the Counter class from the collections module.
    """

    regex = re.compile(r"@[\w.]+")

    def pre_filter(self, email_list):

        for e in email_list:
            match = self.regex.search(e)

            if match is not None:
                yield match.group()
            else:
                yield ""

    def fit(self, x, y=None):
        return self

    def transform(self, email_list):
        """
        Use regular expression to pull out domain name from email address and convert to list of dicts containing
        count of characters.
        :param email_list:
        :return:
        """

        return [{k: v for (k, v) in Counter(result).most_common()} for result in
                self.pre_filter(email_list)]

然后我只需传入一个带有数据的Pandas数据帧,并对要投影到PCA空间的数据调用transform()。

您能列出150ms中涉及的确切步骤吗?如果您有一些示例代码,这将使它更清晰。我有点被“非常少量的数据”搞糊涂了,你不是在为单个样本进行定时预测吗?我应该说是少量的特性。你能添加一些代码,这样我们就可以找出错误(或者看到一切都是正确的)吗?我认为“少量功能”在已经适合PCA的环境中没有真正意义。除非你的意思是你适合PCA有少量的功能?。。。代码会让它更清晰;)我添加了定义模型的代码。正如你所看到的,这里真的没有那么多事情发生。您是否构建了运行速度更快(例如<50毫秒)的模型?如果我知道这是可能的,我会继续挖掘。如果这是不可能的,那么我需要知道。谢谢添加您的代码。我不知道这是否能在50毫秒以下运行,但如果这不可能,我会感到惊讶。你确定是PCA占据了150毫秒的大部分吗?变换只是特征向量和主分量之间的点积。有了50个组件和2000个功能,我的笔记本电脑上的PCA.transform(PCA.transform)(PCA.transform)就有了224个功能。你能列出150毫秒的具体步骤吗?如果您有一些示例代码,这将使它更清晰。我有点被“非常少量的数据”搞糊涂了,你不是在为单个样本进行定时预测吗?我应该说是少量的特性。你能添加一些代码,这样我们就可以找出错误(或者看到一切都是正确的)吗?我认为“少量功能”在已经适合PCA的环境中没有真正意义。除非你的意思是你适合PCA有少量的功能?。。。代码会让它更清晰;)我添加了定义模型的代码。正如你所看到的,这里真的没有那么多事情发生。您是否构建了运行速度更快(例如<50毫秒)的模型?如果我知道这是可能的,我会继续挖掘。如果这是不可能的,那么我需要知道。谢谢添加您的代码。我不知道这是否能在50毫秒以下运行,但如果这不可能,我会感到惊讶。你确定是PCA占据了150毫秒的大部分吗?变换只是特征向量和主分量之间的点积。有了50个组件和2000个功能,我的笔记本电脑上有224个PCA.transform。