当前位置:   article > 正文

用python实现KNN回归算法_以学生活跃表现数据集为例(如下表所示),采用sklearn组件编写knn回归的python

以学生活跃表现数据集为例(如下表所示),采用sklearn组件编写knn回归的python

算法流程 


对每一个未知点执行:

  1. 计算未知点到所有已知类别点的距离
  2. 按距离排序(升序)
  3. 选取其中前k个与未知点离得最近的点
  4. 统计k个点中各个类别的个数
  5. 上述k个点里类别出现频率最高的作为未知点的类别

优缺点

  1. 优点: 
    简单有效、易理解
  2. 缺点: 
    k近邻需要保存全部数据集,因此对内存消耗大,当数据集较大时对设备要求非常高; 
    需要计算每个未知点到全部已知点的距离,可能会很耗时; 
    分类结果不易理解

  本文主要是利用KNN算法对薪资进行预测,其自变量不是我们熟悉的数字,而是利用字符串进行预测,最后达到的效果是当我们输入自己的特征时输出一个薪资,例如输入是‘杭州Java本科3年掌握大数据’ 输出为22k。

  接下来就开始吧

  首先是载入数据:

  1. import pandas as pd
  2. file = 'jobs_4k.xls'
  3. content = pd.read_excel(file)
  4. print(content.head())
  5. 结果为:
  6. id positionName district stationname jobNature \
  7. 0 3 财务产品经理 海淀区 上地 全职
  8. 1 4 产品专家 海淀区 中关村 全职
  9. 2 5 产品总监 海淀区 中关村 全职
  10. 3 6 联盟广告产品运营专家/专员-【商业化】 海淀区 东单 全职
  11. 4 7 产品总监 海淀区 中关村 全职
  12. companyLabelList industryField salary companySize \
  13. 0 ['节日礼物', '年底双薪', '定期体检', '七险一金'] 物流丨运输,软件开发 10k-15k 500-2000
  14. 1 ['五险一金', '弹性工作', '带薪年假', '免费两餐'] 企业服务 30k-50k 500-2000
  15. 2 ['五险一金', '弹性工作', '带薪年假', '免费两餐'] 企业服务 40k-75k 500-2000
  16. 3 ['股票期权', '弹性工作', '定期体检', '岗位晋升'] 文娱丨内容 20k-40k 2000人以上
  17. 4 ['领导好', '五险一金', '领军企业', '脑力密集型'] 移动互联网,社交 20k-38k 15-50
  18. skillLables createTime companyFullName \
  19. 0 ['产品设计', '后台', 'B2B'] 2020-05-15 15:10:02 北京福佑多多信息技术有
  20. ....(省略)

对每行信息进行处理,并且合并除薪资的所有内容,生成新的一个列表cutted_X

  1. import jieba
  2. import re
  3. #输入技能点,预测工资
  4. X_content = content.drop(['salary'],axis =1)#content 内容不变把丢掉salary列的赋值给X_content
  5. #目标target
  6. target = content['salary'].tolist()
  7. string_training_corpus = []
  8. X_content['merged'] = X_content.apply(lambda x:''.join(str(x)),axis=1)#axis =1 所有列的每行,对每行进行计算,生成一个序列放在merged下面,''.join通过引号里面的东西连接join后面的字符串
  9. X_string = X_content['merged'].tolist()
  10. def get_one_row_job_string(x_string_row): #生成字符串包含所有内容
  11. job_string = ''
  12. for i,element in enumerate(x_string_row.split('\n')):
  13. #只有两个才正确
  14. if len(element.split())==2:
  15. _,value = element.split()
  16. if i==0:continue #不要id
  17. job_string = job_string + value
  18. return job_string
  19. def token(string): #对字符串进行分割,遇到标点符号分割生成一个列表
  20. return re.findall('\w+',string)
  21. cutted_X = []
  22. for i,row in enumerate(X_string):
  23. job_string = get_one_row_job_string(row)
  24. if i%1000 ==0:
  25. print(i)
  26. cutted_X.append(' '.join(list(jieba.cut(''.join(token(job_string))))))
  27. print(cutted_X[0])
  28. 结果是:
  29. 0
  30. 1000
  31. 2000
  32. 3000
  33. 4000
  34. 财务 产品 经理 海淀区 上 地 全职 物流 丨 运输 软件开发 5002000 人 北京 福佑 多多 信息技术 有限公司 13 年 本科 福利待遇 好 创业 黑马 技术 氛围 好 httpswwwlagoucomjobs7149613html 岗位职责 1 负责 财务 相关 业务 解决方案 架构 并 主导 与 产品 技术 等 交付 团队 的 对接 能够 从 完整 的 财务 产品线

接着计算cutted_X的TF-IDF

  1. from sklearn.feature_extraction.text import TfidfVectorizer
  2. vectorizer = TfidfVectorizer() ##构建一个计算TF-IDF的玩意儿 TF是词频(Term Frequency),IDF是逆文本频率指数
  3. X= vectorizer.fit_transform(cutted_X)
  4. # tfidf_model = TfidfVectorizer().fit(cutted_X)
  5. # print(tfidf_model.vocabulary_)

最后将处理完成的数据带入KNN模型,并设置k值为3,如下:

  1. import numpy as np
  2. target_numical = [np.mean(list(map(float,re.findall('\d+',s)))) for s in target] # map(function, iterable, ...) 这里的map是把列表里的字符转为成数字
  3. Y= target_numical
  4. #使用knn模型
  5. from sklearn.neighbors import KNeighborsRegressor
  6. model = KNeighborsRegressor(n_neighbors=3)
  7. model.fit(X,Y)
  8. def predict_by_label(test_string,model):
  9. test_words = list(jieba.cut(test_string))
  10. test_vec = vectorizer.transform(test_words)
  11. predict_value = model.predict(test_vec)
  12. return predict_value[0]
  13. test = '测试北京3年专科'
  14. print(predict_by_label(test,model))
  15. 结果为:
  16. 10.166666666666666

再代入两个试试:

  1. aa = ["杭州Java本科3年掌握大数据",
  2. "北京算法硕士3年掌握图像识别"]
  3. for i in aa:
  4. print("{}的薪资是{}".format(i,predict_by_label(i,model)))
  5. 结果是:
  6. 杭州Java本科3年掌握大数据的薪资是22.5
  7. 北京算法硕士3年掌握图像识别的薪资是23.0

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/549052
推荐阅读
相关标签
  

闽ICP备14008679号