【机器学习】基于Pandas的数据预处理技术【california_housing加州房价数据集】
529 打赏
【机器学习】基于Pandas的数据预处理技术【california_housing加州房价数据集】 上进小菜猪 2023-03-22 11:45:34

一.需求分析

本文主题:基于Pandas的数据预处理技术

本次任务共分为16个任务,将其分为前七个任务和后9个任务,本文探讨其后9个任务。

本次实验内容:

  1. 对第一个特征(收入中位数)排序后画散点图

  2. 对第一个特征(收入中位数)画分位数图并分析

  3. 【选做】对所有特征画分位数图并进行分析

  4. 使用散点图、使用线性回归方法拟合第一个特征(收入中位数)并分析

  5. 【选做】使用局部回归(Loess)曲线(用一条曲线拟合散点图)方法拟合第一个特征(收入中位数)数据

  6. 对第一个特征(收入中位数)画分位数-分位数图并分析

  7. 对第一个特征(收入中位数)画直方图,查看数据的分布和数据倾斜情况

  8. 【选做】对所有特征画直方图,查看数据的分布和数据倾斜情况

  9. 寻找所有特征之间的相关性并找出相关性大于 0.7 的特征对,做特征规约

二.需求解决

2.1 对第一个特征(收入中位数)排序后画散点图

对第一个特征(收入中位数)数据排序,画散点图,画x,y坐标轴标签

  1. x_sorted=np.sort(df.iloc[:,0].values)
  2. plt.scatter([i for i in range(X.shape[0])],x_sorted)
  3. plt.xlabel('Count')
  4. plt.ylabel('sorted'+housing['feature_names'][0])
  5. plt.show()

运行结果如下

2.2 对第一个特征(收入中位数)画分位数图并分析

对第一个特征(收入中位数)画分位数图并分析:

对第一个特征(收入中位数)数据排序,画散点图,画中位数点,画x,y坐标轴标签

  1. x_sorted=np.sort(df.iloc[:,0].values)
  2. plt.scatter([i for i in range (X.shape[0])],x_sorted)
  3. plt.scatter([round(X.shape[0]/4),round(X.shape[0]/2),round(X.shape[0]*3/4)],[np.quantile(x_sorted,0.25),np.quantile(x_sorted,0.5), np.quantile(x_sorted,0.75)],color='red')
  4. plt.xlabel('Count')
  5. plt.ylabel('sorted'+housing['feature_names'][0])
  6. plt.show()

运行结果如下:

2.3 【选做】对所有特征画分位数图并进行分析

【选做】对所有特征画分位数图并进行分析解决方案如下:

人均收入(MedInc)、房龄(HouseAge)、房间数(AveRooms)、卧室数(AveBedrooms)、小区人口数(Population)、

房屋居住人数(AveOccup)、小区经度(Longitude)、小区纬度(Latitude)

  1. import matplotlib.pyplot as plt
  2. plt.figure(figsize=(12,12))
  3. for i in range(8):
  4. plt.subplot(4, 2, i+1)
  5. # 对第一个特征(收入中位数)数据排序
  6. x_sorted=np.sort(df.iloc[:,i].values)
  7. # 画散点图
  8. plt.scatter([i for i in range (X.shape[0])],x_sorted)
  9. # 画中位数点
  10. plt.scatter([round(X.shape[0]/4),round(X.shape[0]/2),round(X.shape[0]*3/4)],[np.quantile(x_sorted,0.25),np.quantile(x_sorted,0.5),
  11. np.quantile(x_sorted,0.75)],color='red')
  12. # 画x,y坐标轴标签
  13. plt.xlabel('Count')
  14. plt.ylabel('sorted'+housing['feature_names'][0])
  15. plt.show()

运行结果如下:

上图可以看到:8个特征的分位数图。

2.4 使用线性回归方法拟合第一个特征(收入中位数)

使用线性回归方法拟合第一个特征(收入中位数)解决方案如下:

准备数据:

  1. X_list=[i for i in range(X.shape[0])]

转换为np.array一维向量

  1. X_array=np.array(X_list)

转换为矩阵

  1. X_reshape=X_array.reshape(X.shape[0],1)

对第一个特征(收入中位数)排序

  1. x_sorted=np.sort(df.iloc[:,0].values)

线性回归

  1. from sklearn import linear_model
  2. linear=linear_model.LinearRegression()

进行线性回归拟合

  1. linear.fit(X_reshape,x_sorted)

对训练结果做拟合度评分

  1. print("training score:",linear.score(X_reshape,x_sorted))

画散点图

  1. plt.scatter(X_list,x_sorted)

使用sklearn线性回归的predict函数计算预测值

  1. y_predict=linear.predict(X_reshape)

画线性回归算法拟合的直线

  1. plt.plot(X_reshape,y_predict,color='red')
  2. plt.show()

运行结果如下:

2.5 【选做】使用局部回归(Loess)曲线(用一条曲线拟合散点图)方法拟合第一个特征(收入中位数)数据

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

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

一般来说,两个变量之间的关系非常微妙,仅用线性和曲线参数方程来描述是不够的,因此此时需要非参数回归。非参数方法和参数方法的区别在于,在分析之前预测是否存在一些限制。例如,如果我们认为特征和响应变量之间存在线性关系,我们可以使用线性方程拟合。我们只需要找到方程的系数,这是一种参数化方法,例如前面提到的线性回归和多项式回归。如果我们直接从数据中进行分析,这是一种非参数方法。因为没有限制,所以无论曲线关系如何复杂,用非参数方法拟合的曲线都能更好地描述变量之间的关系。
黄土(局部加权区域)是一种非参数的局部回归分析方法。它主要将样本划分为小单元,对区间中的样本进行多项式拟合,并重复此过程以获得不同区间中的加权回归曲线。最后,将这些回归曲线的中心连接在一起,形成一条完整的回归曲线。具体流程如下:

  • 确定拟合点的数量和位置
  • 以拟合点为中心确定k个最近点
  • 通过权重函数计算k个点的权重
  • 加权线性回归多项式拟合(一次或二次)
  • 对所有拟合点重复上述步骤
  1. import math
  2. import numpy as np
  3. import statsmodels.api as sm
  4. lowess = sm.nonparametric.lowess
  5. import pylab as pl
  6. # 准备数据
  7. X_list=[i for i in range(X.shape[0])]
  8. # 转换为np.array一维向量
  9. X_array=np.array(X_list)
  10. # 转换为矩阵
  11. X_reshape=X_array.reshape(X.shape[0],1)
  12. # 对第一个特征(收入中位数)排序
  13. x_sorted=np.sort(df.iloc[:,0].values)
  14. yest = lowess(X_list,x_sorted, frac=0.01)[:,0]
  15. print(yest)
  16. # print(java1.sort)
  17. pl.clf()
  18. # plt.scatter(X_list,x_sorted)
  19. plt.scatter(X_list,x_sorted,c="red", marker='o')
  20. pl.plot(X_list, yest, label='y pred')
  21. plt.xlabel('Count')
  22. plt.ylabel('收入中位数')
  23. # plt.legend(loc=1)
  24. pl.legend()
  25. plt.show()

运行结果如下:

2.6 对第一个特征(收入中位数)按平均房间数分两段画分位数-分位数图并分析

对第一个特征按AveRooms平均房间数的平均值划分为两段,画分位数-分位数图:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. plt.figure(figsize=(5,5))

对所有特征按AveRooms平均房间数的平均值划分为两段

  1. df_new1=df[df['AveRooms']<=df['AveRooms'].mean()]
  2. df_new2=df[df['AveRooms']>df['AveRooms'].mean()]

按照划分的两段对第一个特征排序

  1. part1=np.sort(df_new1.iloc[:,0].values)[:df_new2['AveRooms'].count()]
  2. part2=np.sort(df_new2.iloc[:,0].values)[:df_new2['AveRooms'].count()]

设置坐标轴刻度区间一致,画45°线

  1. plt.xlim(part2[0],part2[-1])
  2. plt.ylim(part2[0],part2[-1])
  3. plt.plot([part2[0],part2[-1]],[part2[0],part2[-1]])

画分位数-分位数图

  1. plt.scatter(part1,part2)
  2. plt.scatter([np.quantile(part1,0.25),np.quantile(part1,0.5),np.quantile(part1,0.75)], [np.quantile(part2,0.25),np.quantile(part2,0.5),np.quantile(part2,0.75)],color='red')
  3. plt.show()

运行截图如下:

2.7 画直方图,查看各个特征的分布和数据倾斜情况

画直方图,查看各个特征的分布和数据倾斜情况。这个需求十分简单:

绘制特征1的直方图

  1. plt.hist(X[:,0],edgecolor='k')
  2. plt.show()

运行结果如图:

2.8 【选做】对所有特征画直方图,查看数据的分布和数据倾斜情况

【选做】对所有特征画直方图,查看数据的分布和数据倾斜情况,需求解决方案如下:

人均收入(MedInc)、房龄(HouseAge)、房间数(AveRooms)、卧室数(AveBedrooms)、小区人口数(Population)、

房屋居住人数(AveOccup)、小区经度(Longitude)、小区纬度(Latitude)

  1. import matplotlib.pyplot as plt
  2. plt.figure(figsize=(12,12))
  3. for i in range(8):
  4. plt.subplot(4, 2, i+1)
  5. plt.hist(X[:,i],edgecolor='k')
  6. plt.xlabel('Count')
  7. plt.ylabel('sorted'+housing['feature_names'][0])
  8. plt.show()

运行结果如下:

2.9 寻找所有特征之间的相关性并找出相关性大于 0.7 的特征对,做特征规约

寻找所有特征之间的相关性并找出相关性大于 0.7 的特征对,做特征规约,需求解决方案如下:

  1. for column in df.columns:
  2. correlations_data=df.corr()[column].sort_values()
  3. print('%s:'%column)
  4. for key in correlations_data.keys():
  5. if key!=column and abs(correlations_data[key])>=0.7:
  6. print(" %s:" %key,correlations_data[key])

运行截图如下:

2.10 总结

本次实验收获非常的大,学习到了检测是否有空值,对数据集做中心化度量,对数据集做离散化度量,包括散点图,分位数图、分位数-分位数图、包括题目要求的所有选做题目,包括局部回归的理解和使用等等,都有了较深刻的理解和运用。

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

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

    举报反馈

    举报类型

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

    详细说明

    审核成功

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

    审核失败

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

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

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

    升级提醒
    易百纳技术社区