在职位招聘数据处理中使用Loess回归曲线以及分箱、回归、聚类方法 检查离群点及光滑数据【机器学习】
635 打赏
在职位招聘数据处理中使用Loess回归曲线以及分箱、回归、聚类方法 检查离群点及光滑数据【机器学习】 上进小菜猪 2023-03-22 11:29:25

一.需求分析

本文主题:使用局部回归(Loess)曲线(增加一条光滑曲线到散布图)方法处理数据以及使用分箱、回归、聚类方法 检查离群点及光滑数据;

前文回顾,我们上篇文章写了招聘网站的职位招聘数据的分位数图、分位数-分位数图以及散点图、使用线性回归算法拟合散点图处理。之前的文章我们已经对爬取的数据做了清洗处理,然后又对其数据做了一个薪资数据的倾斜情况以及盒图离群点的探究。

我们到了现在对机器学习已经是做了很多的工作了。

我们这次的任务需求是:

使用局部回归(Loess)曲线(增加一条光滑曲线到散布图)方法处理数据 使用分箱、回归、聚类方法 检查离群点及光滑数据;

二.使用局部回归(Loess)曲线(增加一条光滑曲线到散布图)方法处理数据

Loess:

局部加权回归是一种非参数学习算法,它使我们不必太担心自变量的最高阶项的选择 我们知道,对于普通线性回归算法,我们希望通过以下方式预测x点的y值:

我们现实生活中的许多数据可能无法用线性模型来描述。这仍然是一个房价问题。显然,直线不能很好地拟合所有数据点,误差非常大,但类似于二次函数的曲线可以很好地吻合。为了解决为非线性模型建立线性模型的问题,当我们预测一个点的值时,我们选择接近该点的点,而不是所有点进行线性回归。在此基础上,提出了一种局部加权线性回归算法。在这个算法中,其他人越接近一个点,权重越大,他们对回归系数的贡献越大。

公式为:

1.第一步都是老规矩了,先读取我们的目标文件,然后,我们使用关键词“java”对数据进行筛选,循环筛选过程中将职位名,薪资需要的关键字放到列表里面,然后存入字典里,经过pandas的处理:

事前准备:将需要的包引入:

  1. import re
  2. import numpy as np
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. from pylab import mpl

指定默认字体:解决plot不能显示中文问题,解决保存图像是负号’-‘显示为方块的问题

  1. mpl.rcParams['font.sans-serif'] = ['STZhongsong']
  2. mpl.rcParams['axes.unicode_minus'] = False

使用关键词“java”对数据进行筛选:

  1. xingzhi={}
  2. zhiwei = []
  3. xin1 = []
  4. xin2 =[]
  5. for i in range(len(data)):
  6. if "java" in data.iloc[i]['职位名']:
  7. a = re.findall("\d+.?\d*", data.iloc[i]['薪资'])
  8. # print(data.iloc[i]['职位名'])
  9. zhiwei.append(data.iloc[i]['职位名'])
  10. xin1.append(int(a[0]))
  11. xin2.append(int(a[1]))
  12. xingzhi={"职位名":zhiwei,'最低薪资':xin1,'最高薪资':xin2}
  13. df = pd.DataFrame(xingzhi)
  14. java1=xin1
  15. java2=xin2

2.使用lowess函数,先对数据集进行一个排序,然后传入lowess函数进行一个计算,得到的数据进行一个绘图:

  1. import numpy as np
  2. import statsmodels.api as sm
  3. lowess = sm.nonparametric.lowess
  4. import pylab as pl
  5. yest = lowess(np.sort(java1),np.sort(java2), frac=0.01)[:,0]
  6. print(yest)
  7. print(java1.sort)
  8. pl.clf()
  9. plt.scatter(java1,java2, c="red", marker='o', label='java')
  10. pl.plot(np.sort(java1), yest, label='y pred')
  11. plt.xlabel('Java岗位薪资下限')
  12. plt.ylabel('Java岗位薪资上限')
  13. pl.legend()
  14. plt.show()
  1. 效果图

Java岗位薪资的的下限和上限的局部回归(Loess)曲线:

Go岗位薪资的的下限和上限的局部回归(Loess)曲线

python岗位薪资的的下限和上限的局部回归(Loess)曲线

三.使用分箱、回归、聚类方法 检查离群点及光滑数据;

为什么要分箱:

1.在盒分个裂离散化之后,变量的容忍度增强,异常值对模型的影响将很小。例如,平均消耗量为1000,当一个样本的消耗量为10000时,可以忽略对模型的干扰 2.它具有很强的稳定性。

例如,一个样本现在是22岁,明年是23岁,一个盒子一个盒子的划分在[20,30]的范围内。虽然样本的年龄发生了变化,但仍在原始的盒划分范围内 3.离散化后,变量的值减小,可以减少模型的过拟合;例如,盒子分割前的值为1-10。如果每个值为1个盒子,则有10个盒子,模型将过度学习;如果将模型分为四个框,则模型不会过度学习所有变量的信息 4.盒离散化可以将缺失的值作为一个独立的盒,并将缺失的信息集成到模型中 5.变量装箱也是数据标准化处理的一种方式,它可以将不同尺度的所有变量转换为同一尺度,避免模型给大尺度变量太多权重

1.与上文一样,我们使用关键词“java”对数据进行筛选,循环筛选过程中将职位名,薪资需要的关键字放到列表里面,然后存入字典里,经过pandas的处理: 将上限和下限分别处理:

  1. xingzhi={}
  2. zhiwei = []
  3. xin1 = []
  4. xin2 =[]
  5. for i in range(len(data)):
  6. if "java" in data.iloc[i]['职位名']:
  7. a = re.findall("\d+.?\d*", data.iloc[i]['薪资'])
  8. # print(data.iloc[i]['职位名'])
  9. zhiwei.append(data.iloc[i]['职位名'])
  10. xin1.append(int(a[0]))
  11. xin2.append(int(a[1]))
  12. xingzhi={"职位名":zhiwei,'最低薪资':xin1,'最高薪资':xin2}
  13. df = pd.DataFrame(xingzhi)
  14. java1=xin1
  15. java2=xin2

2.引入分箱、回归、聚类方法的一些模块包:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.linear_model import LinearRegression
  4. from sklearn.preprocessing import KBinsDiscretizer
  5. from sklearn.tree import DecisionTreeRegressor

3.构建数据集

  1. X = np.reshape(java1,(-1, 1))
  2. y = np.reshape(java2,(-1, 1))
  3. X = (np.sort(X))
  4. y = (np.sort(y))

4.用KBinsDiscretizer转换数据集

  1. enc = KBinsDiscretizer(n_bins=50, encode='ordinal', strategy='uniform')
  2. X_binned = enc.fit_transform(X)

‘ordinal’:返回编码为整数值的 bin 标识符。

5.用原始数据集进行预测

  1. fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True, figsize=(10, 4))
  2. line = X
  3. reg1 = LinearRegression().fit(X, y)
  4. ax1.plot(line, reg1.predict(line), linewidth=2, color='green',
  5. label="线性回归")
  6. print(line)
  7. print("reg.predict(line)::",reg1.predict(line))
  8. reg = DecisionTreeRegressor().fit(X, y)
  9. ax1.plot(X, reg.predict(y), linewidth=2, color='red',
  10. label="决策树")
  11. ax1.plot(X, y, 'o', c='k')
  12. ax1.legend(loc="best")
  13. ax1.set_ylabel("Java薪资上限")
  14. ax1.set_xlabel("Java薪资下限")
  15. ax1.set_title("没有分箱前")

6.用转换后的数据进行预测

  1. line_binned = enc.transform(X)
  2. # print("line::",line)
  3. # print("line_binned::",line_binned)
  4. reg = LinearRegression().fit(X_binned, y)
  5. a=reg.predict(line_binned)
  6. ax2.plot(line,reg.predict(line_binned), linewidth=2, color='green',
  7. label='线性回归')
  8. print(line)
  9. print(a[a[:, 0].argsort()])
  10. print(reg.predict(line_binned))
  11. print(type(a))
  12. reg = DecisionTreeRegressor(min_samples_split=3,
  13. random_state=0).fit(X_binned, y)
  14. ax2.plot(np.sort(java1), np.sort(reg.predict(line_binned)), linewidth=2, color='red',
  15. linestyle='-', label='决策树')
  16. ax2.plot(X, y, 'o', c='k')
  17. ax2.vlines(enc.bin_edges_[0], *plt.gca().get_ylim(), linewidth=1, alpha=.2)
  18. ax2.legend(loc="best")
  19. ax2.set_xlabel("Java薪资下限")
  20. ax2.set_title("50个为一组分箱后")
  21. plt.tight_layout()
  22. plt.show()

7.效果图:

Java岗位薪资的的下限和上限的分箱、回归、聚类结果图

Python岗位薪资的的下限和上限的分箱、回归、聚类结果图

Go岗位薪资的的下限和上限的分箱、回归、聚类结果图

本次总结:

对python数据的操作又有了很高程度的提升,对数据处理工具kettle的使用也加深了熟练度,对数据预处理技术也有了很深的理解和运用,后面我对之前机器学习的一些算法也进行了较为深入的复习和实战,后面我又帮助了小组的成员解决他们遇到的问题,对数据可视化也起到了复习的作用,而且我全程还使用gitee来管理项目代码,虽然小组成员对git操作较为陌生,但是随着大家项目的推进,大家也是耳濡目染了一些git的基本操作。 本次让我有了一定对数据处理和机器学习以至于对后面深度学习的一些兴趣,同时也认识到了这个方向的难度,和自己掌握的内容不过是冰山一角,后续我会对其进行一个模块化的深入学习。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
评论
0个
时间排序
内容存在敏感词
    0 条记录 第 0 /
    相关专栏
    打赏作者
    易百纳技术社区
    上进小菜猪
    您的支持将鼓励我继续创作!
    打赏金额:
    ¥1 易百纳技术社区
    ¥5 易百纳技术社区
    ¥10 易百纳技术社区
    ¥50 易百纳技术社区
    ¥100 易百纳技术社区
    支付方式:
    微信支付
    支付宝支付
    易百纳技术社区 微信支付
    易百纳技术社区
    打赏成功!

    感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

    举报反馈

    举报类型

    • 内容涉黄/赌/毒
    • 内容侵权/抄袭
    • 政治相关
    • 涉嫌广告
    • 侮辱谩骂
    • 其他

    详细说明

    审核成功

    发布时间设置
    发布时间:
    是否关联周任务-专栏模块

    审核失败

    失败原因
    备注
    Loading...
    易百纳技术社区
    确定要删除此文章、专栏、评论吗?
    确定
    取消
    易百纳技术社区
    易百纳技术社区
    在专栏模块发布专栏,可获得其他E友的打赏
    易百纳技术社区
    回答悬赏问答,被题主采纳后即可获得悬赏金
    易百纳技术社区
    在上传资料时,有价值的资料可设置为付费资源
    易百纳技术社区
    达到一定金额,收益即可提现~
    收益也可用来充值ebc,下载资料、兑换礼品更容易
    易百纳技术社区
    活动规则
    • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
    • 2.发布的专栏与资料需要与平台的板块有相关性,禁止注水,专栏/资料任务以审核通过的篇数为准,专栏需为原创文章且首次在社区发布
    • 3.任务完成后,现金奖励直接打款到微信账户;EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换
    易百纳技术社区
    升级提醒
    升级

    恭喜您的社区称号由 升级为 “社区游民”

    同时为了感谢您对社区的支持,我们将送出xxx礼品一份, 记得领取哦~

    升级提醒
    易百纳技术社区