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