tnblog
首页
视频
资源
登录

python 数据探索与可视化洞见(二)

6769人阅读 2023/3/29 10:09 总访问:3455508 评论:0 收藏:0 手机
分类: AI

python 数据探索与可视化洞见(二)


请根据上一篇结合。

地理数据的可视化


可使用DataFrame上的plot方法。

举例:以经度和维度创建一个散点图,密集的地方以比较透明的方式做区分,并且以人员的多少来决定散点的大小,通过不同的房价来显示有区别的颜色,并显示颜色条。

  1. # kind="scatter" 散点图
  2. # x 经度
  3. # y 维度
  4. housing.plot(kind="scatter", x="longitude", y="latitude")

  1. # alpha 透明度
  2. # 这里只的是在密度比较高的地方透明度就比较深反之比较浅
  3. housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.1)

  1. # 然后我们通过人口比较多的圆圈就设置大一点。
  2. # s 设置圈圈的大小
  3. # label 就是标签
  4. # figsize 改变大小
  5. # c color通过什么属性代表颜色
  6. # cmap 设置颜色表
  7. # colorbar 是否显示彩色条
  8. import matplotlib.pyplot as plt
  9. housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4, s=housing['population']/100, label="population", figsize=(10, 7),c="median_house_value",cmap=plt.get_cmap("jet"),colorbar=True)
  10. # legend 显示图例
  11. plt.legend()


这里population表示人,红色的表示房价比较贵,蓝色的比较便宜这样就比较直观了。

寻找相关性


如上图第一列所示,第一个一条直线相关性就是一,开始慢慢分散就是0.8,然后0.4最后没有关系为0,然后反方向为-0.4、-0.8然后-1等。
第二列以斜度为主。
第三列两者与其他图片根本没有相关性所以都为0.
corr函数可以表示其中的相关性。

  1. # 安装jinja2包
  2. pip install jinja2


首先以当前的例子显示其中的关联性,以及通过颜色来进行区分它们的关联性。

  1. # numeric_only 关闭警告
  2. corr_matrix = housing.corr(numeric_only=True)
  3. corr_matrix

  1. # 设置背景颜色为coolwarm
  2. corr_matrix.style.background_gradient(cmap="coolwarm")

  1. # 仅预测房价的相关性
  2. corr_matrix["median_house_value"].sort_values(ascending=False)

  1. # 通过房价预测、收入中位、房间数量、房间的年龄
  2. from pandas.plotting import scatter_matrix
  3. attributes = ["median_house_value","median_income","total_rooms","housing_median_age"]
  4. scatter_matrix(housing[attributes],figsize=(12,8))


我们可以看到median_house_value(房价)与median_income(收入中位数)相关性比较强。

  1. # 通过散点图,再次查看收入中位数与房价的相关性
  2. housing.plot(kind="scatter",x="median_income",y="median_house_value",alpha=0.1)

ML算法的数据准备


涉及的内容包含:数据清理、处理文本属性和分类属性、自定义转换器、特征缩放、转换流水线。

数据清理


针对缺失的特征数据的三种选择:
——放弃相应的区域(去掉数据的某行)
——放弃整个属性(去掉数据的某列)
——将缺失的值设为某个数(0,平均数或中位数)
可通过DataFrame的dropna()、drop()、fillna()方法来实现

  1. # 查看有空的简单信息
  2. housing.info()


我们可以从上面的数据中看到total_bedrooms它的某些值为空,所以非空的只有16354行。
接下来我们通过dropna函数来进行过滤total_bedrooms非空的行。

  1. # 过滤total_bedrooms行不为空的
  2. housing.dropna(subset="total_bedrooms")


可以看到现在只有16354行了,但housing本身不会进行改变。
接下来我们可以通过drop来过滤掉某列,这里我们就过滤掉total_bedrooms就好了,因为它有非空值。

  1. housing.drop("total_bedrooms", axis=1)

  1. # 获取一个total_bedrooms的中位数
  2. median = housing["total_bedrooms"].median()
  3. # 将total_bedrooms列为空的数添加为中位数
  4. housing["total_bedrooms"].fillna(median,inplace=True)
  5. housing.info()


另一种取中位数的方式。
sklearn提供了一个Simplelmputer,挺简单的

  1. from sklearn.impute import SimpleImputer
  2. # 这里的策略设置为取中位数
  3. imputer = SimpleImputer(strategy="median")
  4. # 缺点:只能用于数值类型,我们这里有一列不是数值类型的ocean_proximity所以我们需要删除这一列
  5. housing_num = housing.drop("ocean_proximity", axis=1)
  6. # fit方法计算housing_num中位数
  7. imputer.fit(housing_num)
  8. # 我们也可以通过statistics_获取每列的中位数
  9. imputer.statistics_


我们还可以通过median().values属性来验证一下它是否正确。

  1. # 填充缺失的结果附值中位数给housing_num
  2. X = imputer.transform(housing_num)
  3. X


这样的方式太难看了,我们可以把它转换成数据图标的形式。

  1. housing_tr = pd.DataFrame(X, columns=housing_num.columns, index=housing_num.index)
  2. housing_tr.head()

处理文本和分类


到目前为止,我们只处理数值类的属性。
有些熟悉是文本类型的(有点像枚举),就需要编码,将其变成数值
OrdinalEncoder:是一个用于将分类变量编码为整数的类。它可以用于将具有有序关系的分类变量编码为整数,例如“低”、“中”和“高”这样的变量。
OneHotEncoder:通过指定一定的规则,来确定它的排序。

  1. # 对ocean_proximity文本列查看值的总数
  2. housing["ocean_proximity"].value_counts()

  1. from sklearn.preprocessing import OrdinalEncoder
  2. # 创建普通编码器的实例
  3. ordinal_encoder = OrdinalEncoder()
  4. # 以这一列为例做成一张表
  5. housing_cat = housing[["ocean_proximity"]]
  6. housing_cat.head()

  1. # 查看类型
  2. type(housing_cat)

  1. # 编码转换
  2. housing_cat_encoded = ordinal_encoder.fit_transform(housing_cat)
  3. housing_cat_encoded[:10]
  4. # 查看数组
  5. ordinal_encoder.categories_


这种编码器它对于排序并没有逻辑可言。
接下来我们使用OneHotEncoder读热编码器。

  1. from sklearn.preprocessing import OneHotEncoder
  2. cat_encoder = OneHotEncoder()
  3. # 填充
  4. housing_cat_1hot = cat_encoder.fit_transform(housing_cat)
  5. housing_cat_1hot.toarray()
  1. cat_encoder.categories_

自定义转换器


sklearn依赖于duck-typing的编译,而不是继承。所以只需要创建一个类,实现fit()、transform()、fit_transform()三个方法就可以自定义转换器;可以通过使用TransformerMixin得到fit_transform(),以及BaseEsitimator作为基类,可获得两种自动调整超参数的方法(get_paramsset_params)。

举例:我们自定义转换器,算出每个房子有多少个房间、每个房子有多少个人。

  1. from sklearn.base import BaseEstimator, TransformerMixin
  2. rooms_ix, bedrooms_ix, population_ix, households_ix = 3, 4, 5, 6
  3. class CombinedAttributesAdder(BaseEstimator, TransformerMixin):
  4. def __init__(self,add_bedrooms_per_room = True):
  5. # 是否添加bedrooms
  6. self.add_bedrooms_per_room = add_bedrooms_per_room
  7. def fit(self, X, y=None):
  8. # 填充
  9. # 这里直接返回
  10. return self
  11. def transform(self, X):
  12. # 转换
  13. # 求每个房子有多少个房间:房间数除以房子。
  14. rooms_per_household = X[:, rooms_ix] / X[:, households_ix]
  15. # 求每个房子有多少个人:人数除以房子。
  16. population_per_household = X[:, population_ix] / X[:, households_ix]
  17. # 判断是否添加卧室,如果添加就再求每个房间数有多少个卧室
  18. if self.add_bedrooms_per_room:
  19. bedroom_per_room = X[:, bedrooms_ix] / X[:, rooms_ix]
  20. # 该方法表示向矩阵后面加三列
  21. return np.c_[X, rooms_per_household, population_per_household, bedroom_per_room]
  22. else:
  23. return np.c_[X, rooms_per_household, population_per_household]
  1. attr_adder = CombinedAttributesAdder(add_bedrooms_per_room=False)
  2. housing_extra_attribs = attr_adder.transform(housing.values)
  3. housing_extra_attribs


那么第一行呢就是,平均6个房间,2个人。

特征缩放


如果输入的数值属性之间具有非常大的比例差异,那么机器学习的性能通常会表现不佳,这时候就需要特征缩放。
同比例缩放所有属性的两种常用方法:
最大-最小缩放:最终范围0至1之间
标准化:减去平均值,除以方差,结果分布具有单位方差差。不绑定到特定范围。
可使用sklearn的MinMaxScaler、StandardScaler等,用来拟合训练集。

转换流水线


许多转换步骤需要按正确的顺序执行,sklearn提供了Pipeline类来支持这样的转换。

  1. from sklearn.pipeline import Pipeline
  2. from sklearn.preprocessing import StandardScaler
  1. # 挨个走
  2. # imputer 首先取中位数
  3. # attribs_adder 然后调用自定义的方法进行处理
  4. # std_scaler 特征缩放
  5. num_pipeline = Pipeline([
  6. ('imputer', SimpleImputer(strategy="median")),
  7. ('attribs_adder', CombinedAttributesAdder()),
  8. ('std_scaler', StandardScaler()),
  9. ])
  10. housing_num_tr = num_pipeline.fit_transform(housing_num)
  11. housing_num_tr


接下来将读热编码器和数值处理进行合并。

  1. num_attribs = list(housing_num)
  2. cat_attribs = ["ocean_proximity"]
  3. # 数值类型的流水线
  4. # 处理分类
  5. full_pipeline = ColumnTransformer([
  6. ("num", num_pipeline, num_attribs),
  7. ("cat", OneHotEncoder(), cat_attribs),
  8. ])
  9. # 最后传入数值
  10. housing_prepared = full_pipeline.fit_transform(housing)
  11. housing_prepared.shape


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

python学习 1-安装

Ptyhon非常简单易用的面向对象的脚本语言,跨平台 入门简单python分2个版本 Python2、Python3。Python 2.7 将于 2020 年结...

python学习 2-基本语法

基础:python脚本语言,不需要编译(像C#、Java、PHP、C++需要编译成机器可识别的语言), 而直接由解释器解释,很多地方类似...

python学习 3-爬虫基本介绍 及简单实例

爬虫爬虫就是一只猪,蜘蛛。。 网络蜘蛛。互联网是一个网由各个网站组成。无数的蜘蛛就在网上到处爬,根据网址从一个网站爬...

python实例 1-日志抓取处理 补错附日志小技巧

有时候数据出了问题,可以从日志中恢复数据(如果你没记日志..没备份..→_→..)一、日志展示介绍个平常自己用的小方法,如...

python实例 2-12306抢票(一) 登陆

开坑年关将近,终于对12306下手了,,平安夜撸代码,攻克了12306的登陆 2018-12-24 22:16:00没错 这篇博客就写从零开始的异...

python安装pip以及使用pip安装requests等模块

pip很简单的介绍pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。如果想...

python数据集合区别

列表(list):可读写,值可以重复,有序排列,初始化语法:['tom',‘jerry’]元组(tuple):只读,值可以重复,...

python实例 2-12306抢票() 下单

第二篇 刷票与下单1.记住登陆上一篇写了登陆:http://www.tnblog.net/cz/article/details/162 为了方便调试 不让每次登陆都...

使用VS Code开发python

Vs Code开发Python可以很好的支持代码调试、智能提示、代码对齐等1:下载VS Codehttps://code.visualstudio.com/Downloadvs ...

python变量与命名

Python使用等号 ( = ) 作为赋值运算符,例如a = 66 就是一条赋值语句,作用就是将66赋值给变量a。Python是弱类型语言,弱类...

python关键字和内置函数

Python中包含了如下所示的关键字:上面这些关键字都不能作为变量名。另外,Python 3还提供了如下表所示的内置函数:也不能...

python基础输入和输出

Python使用print()函数向打印程序输出,采用input()函数接收程序输入。print()函数的语法格式如下:print(value,...,sep=&#...

python基本数据类型

Python包含两大类基本数据类型:数值类型、字符串类型,三大类组合数据类型:集合类型、序列类型和字典类型.数值类型:整型...

python中通过fake_useragent生成随机UserAgent

fake_useragent第三方库,来实现随机请求头的设置;GitHub ---> https://github.com/hellysmile/fake-useragent安...

python 升级pip

一条命令即可: python -m pip install --upgrade pip 安装成功后,一般是在python目录下面的Scripts里边的

python html编码解码

使用方法:html.escape(s)与html.unescape即可 import html s="<div>jsdlfjsl</div>" #html编...
这一世以无限游戏为使命!
排名
2
文章
633
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术