赞
踩
对每一个未知点执行:
优缺点
本文主要是利用KNN算法对薪资进行预测,其自变量不是我们熟悉的数字,而是利用字符串进行预测,最后达到的效果是当我们输入自己的特征时输出一个薪资,例如输入是‘杭州Java本科3年掌握大数据’ 输出为22k。
接下来就开始吧
首先是载入数据:
- import pandas as pd
- file = 'jobs_4k.xls'
- content = pd.read_excel(file)
- print(content.head())
-
- 结果为:
- id positionName district stationname jobNature \
- 0 3 财务产品经理 海淀区 上地 全职
- 1 4 产品专家 海淀区 中关村 全职
- 2 5 产品总监 海淀区 中关村 全职
- 3 6 联盟广告产品运营专家/专员-【商业化】 海淀区 东单 全职
- 4 7 产品总监 海淀区 中关村 全职
-
- companyLabelList industryField salary companySize \
- 0 ['节日礼物', '年底双薪', '定期体检', '七险一金'] 物流丨运输,软件开发 10k-15k 500-2000人
- 1 ['五险一金', '弹性工作', '带薪年假', '免费两餐'] 企业服务 30k-50k 500-2000人
- 2 ['五险一金', '弹性工作', '带薪年假', '免费两餐'] 企业服务 40k-75k 500-2000人
- 3 ['股票期权', '弹性工作', '定期体检', '岗位晋升'] 文娱丨内容 20k-40k 2000人以上
- 4 ['领导好', '五险一金', '领军企业', '脑力密集型'] 移动互联网,社交 20k-38k 15-50人
-
- skillLables createTime companyFullName \
- 0 ['产品设计', '后台', 'B2B'] 2020-05-15 15:10:02 北京福佑多多信息技术有
- ....(省略)
对每行信息进行处理,并且合并除薪资的所有内容,生成新的一个列表cutted_X
- import jieba
- import re
-
- #输入技能点,预测工资
- X_content = content.drop(['salary'],axis =1)#content 内容不变把丢掉salary列的赋值给X_content
- #目标target
- target = content['salary'].tolist()
- string_training_corpus = []
- X_content['merged'] = X_content.apply(lambda x:''.join(str(x)),axis=1)#axis =1 所有列的每行,对每行进行计算,生成一个序列放在merged下面,''.join通过引号里面的东西连接join后面的字符串
- X_string = X_content['merged'].tolist()
-
-
- def get_one_row_job_string(x_string_row): #生成字符串包含所有内容
- job_string = ''
- for i,element in enumerate(x_string_row.split('\n')):
- #只有两个才正确
- if len(element.split())==2:
- _,value = element.split()
- if i==0:continue #不要id
- job_string = job_string + value
- return job_string
- def token(string): #对字符串进行分割,遇到标点符号分割生成一个列表
- return re.findall('\w+',string)
- cutted_X = []
- for i,row in enumerate(X_string):
- job_string = get_one_row_job_string(row)
- if i%1000 ==0:
- print(i)
- cutted_X.append(' '.join(list(jieba.cut(''.join(token(job_string))))))
- print(cutted_X[0])
-
- 结果是:
- 0
- 1000
- 2000
- 3000
- 4000
- 财务 产品 经理 海淀区 上 地 全职 物流 丨 运输 软件开发 5002000 人 北京 福佑 多多 信息技术 有限公司 13 年 本科 福利待遇 好 创业 黑马 技术 氛围 好 httpswwwlagoucomjobs7149613html 岗位职责 1 负责 财务 相关 业务 解决方案 架构 并 主导 与 产品 技术 等 交付 团队 的 对接 能够 从 完整 的 财务 产品线
接着计算cutted_X的TF-IDF
- from sklearn.feature_extraction.text import TfidfVectorizer
- vectorizer = TfidfVectorizer() ##构建一个计算TF-IDF的玩意儿 TF是词频(Term Frequency),IDF是逆文本频率指数
- X= vectorizer.fit_transform(cutted_X)
- # tfidf_model = TfidfVectorizer().fit(cutted_X)
- # print(tfidf_model.vocabulary_)
最后将处理完成的数据带入KNN模型,并设置k值为3,如下:
- import numpy as np
- target_numical = [np.mean(list(map(float,re.findall('\d+',s)))) for s in target] # map(function, iterable, ...) 这里的map是把列表里的字符转为成数字
- Y= target_numical
- #使用knn模型
- from sklearn.neighbors import KNeighborsRegressor
- model = KNeighborsRegressor(n_neighbors=3)
- model.fit(X,Y)
-
- def predict_by_label(test_string,model):
- test_words = list(jieba.cut(test_string))
- test_vec = vectorizer.transform(test_words)
- predict_value = model.predict(test_vec)
- return predict_value[0]
- test = '测试北京3年专科'
- print(predict_by_label(test,model))
-
- 结果为:
- 10.166666666666666
再代入两个试试:
- aa = ["杭州Java本科3年掌握大数据",
- "北京算法硕士3年掌握图像识别"]
- for i in aa:
- print("{}的薪资是{}".format(i,predict_by_label(i,model)))
-
-
- 结果是:
- 杭州Java本科3年掌握大数据的薪资是22.5
- 北京算法硕士3年掌握图像识别的薪资是23.0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。