python - 如何使 scikit-learn 最近邻算法运行得更快?
问题描述
我正在尝试运行基于文本的推荐系统,以从大约 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)
编辑:我附上了评论中建议的分析代码分析结果结果的快照。我对 1000 行样本运行它,所用时间约为 1085 秒。
解决方案
首先,您肯定需要分析您的代码。我建议使用%prun
IPython/Jupyter 中的魔法命令来分析您的脚本。
其他几件事要尝试
设置“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)
我不清楚重新安装
vectorizer
是必要的。vect=vectorizer.fit(train['keywords']) # can be removed?
最后,您应该能够对预测进行矢量化并替换for
循环,但这需要重构您的推荐系统,如果没有更多信息,我将无能为力。
推荐阅读
- java - 无法将数据从 Activity 传递到 Fragment
- javascript - Safari 上的 `navigator.userAgent` 返回 UA,后跟 `= $1` 或 `= $2`
- css - 从中心开始渐变 - 反应原生中的 LinearGradient
- java - 将 Vault 与 Spring Cloud 数据流一起使用
- javascript - 数据进入控制台但未显示在应用程序中
- .htaccess - 带有查询字符串的 url 的 htaccess 重写规则
- python - 如何将数组类型从 swagger.json 传输到 python 中的 List[int] 而不是 list[int]?
- qa - 多条件覆盖
- javascript - Google Appscript - 处理多个谷歌帐户
- angular - Ionic 6 ERROR TypeError:无法将未定义或空值转换为对象