【问题标题】:How to make scikit-learn Nearest Neighbors algorithm run faster?如何让 scikit-learn 最近邻算法运行得更快?
【发布时间】:2019-09-10 03:20:45
【问题描述】:

我正在尝试运行基于文本的推荐系统,以从大约 56K 零件的文件中查找零件的类别: 例如:铜管 -> 电线, 电视 -> 电子产品等

但是,在我的 8GB RAM 系统中运行时,获得推荐系统输出大约需要 4 个小时。我尝试在大约 32 GB 的 ram 上运行相同的脚本,但计算时间没有任何改善,仍然需要 4 小时。推荐系统的训练集约为 11k。

如何让我的推荐系统运行得更快?脚本似乎没有有效地利用内存。任何帮助将不胜感激。

注意:显示的示例仅用于说明,原始数据集要复杂得多。

from sklearn.neighbors import NearestNeighbors

#Code for recommendation system
def recommendhts(x,model,train):
    distance,index=model.kneighbors(x.toarray(),n_neighbors=1)
    mi=distance.argmax()
    idx=index[mi][0]
    return(train.iloc[idx]['sHTS'],distance[0][0])

#Training the model of training set
train=pd.read_csv('train0207190144.csv')
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(train['keywords'])
x=X.toarray()
df=pd.DataFrame(x,columns=vectorizer.get_feature_names())
model=NearestNeighbors(metric='correlation',n_neighbors=1)
model.fit(df)
vect=vectorizer.fit(train['keywords'])

#Fitting the Count vectoriser on keywords(product description to be queried)

x_new=vect.transform(product['keywords'])

for i in range(len(product)):
    key=x_new[i]
    output,probability=recommendhts(key,model,train)

编辑: 按照 cmets 中的建议,我附上了分析 Code profiling results 的结果的快照。我对 1000 行的样本运行它,所用时间约为 1085 秒。

【问题讨论】:

  • 我建议您进行一些分析,以确定您将所有时间都花在了哪里。如果你发现时间都集中在一个地方,那就更容易做推荐了。您可能将大部分时间都花在 sci-kit 学习上,在这种情况下,您可以做些什么来改进代码时间。
  • 训练数据集有多大?
  • @davidrpugh 训练集约为 11,000。问题是我在 8GB 系统还是 32GB 系统上运行,计算时间没有区别。
  • @fiveclubs 感谢您的回复,我会尝试您的建议。
  • 计算时间不受添加更多内存影响的事实表明,计算而非内存是绑定约束。

标签: python scikit-learn knn recommendation-engine


【解决方案1】:

首先,您肯定需要分析您的代码。我建议在 IPython/Jupyter 中为 profiling your script 使用 %prun 魔术命令。

尝试其他几件事

  1. 设置“n_jobs”参数以在进行预测时允许并行。

    # setting n_jobs=2 will use 2 cores; setting n_jobs=-1 will use all cores
    model=NearestNeighbors(metric='correlation',n_neighbors=1, n_jobs=2)
    
  2. 我不清楚是否需要重新安装 vectorizer

    vect=vectorizer.fit(train['keywords'])  # can be removed?
    

最后,您应该能够向量化预测并替换 for 循环,但这需要重构您的推荐系统,如果没有更多信息,我无能为力。

【讨论】:

  • 嗨大卫,感谢您的建议。我尝试按照建议对 1000 行样本进行分析,并在原始问题中附加了结果的快照。我还尝试将“n_jobs”设置为 2,但不幸的是,它恶化了我的表现。相同的 1000 行现在需要大约 90 分钟。我还纠正了countvectoriser的拟合,但没有任何区别。如果您有更多建议,请告诉我。这对我有很大帮助。
猜你喜欢
  • 2018-09-06
  • 2021-11-04
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 2020-09-10
  • 2016-06-01
  • 1970-01-01
  • 2018-02-11
相关资源
最近更新 更多