写点什么

实用机器学习笔记五:探索性数据分析

作者:打工人!
  • 2021 年 12 月 06 日
  • 本文字数:3464 字

    阅读完需:约 11 分钟

实用机器学习笔记五:探索性数据分析

前言:

本文是个人在 B 站自学李沐老师的实用机器学习课程【斯坦福 2021 秋季中文同步】的学习笔记,感觉沐神讲解的非常棒 yyds。

本文所用数据集地址:https://c.d2l.ai/stanford-cs329p/assignments.html#assignment-1

本文数据集来源:所用数据集来自于美国一房屋售卖网站中斯坦福附近的房屋信息,包括房屋面积,类型,指导价,实际价,建设日期,售卖日期,附近小高大学评分等等。网站地址:https://www.zillow.com/stanford-ca/sold/

导入库:

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom IPython import displaydisplay.set_matplotlib_formats('svg')    # 最后两行代码的意思是输出图片为svg的高质量图片
复制代码

读入数据:

import featherdata = feather.read_dataframe('house_sales.ftr')
复制代码

从网站上下载的数据是.ftr 类型的,所以这里需要导入 feather 库,然后读取数据。这里如果你的各种库的版本合适的话也是可以直接使用下面这句代码也是可以的。我当时是不可以直接使用的,可能就是各种库的版本不太合适。

data = pd.read_feather('house_sales.ftr') 
复制代码

查看数据量:

接下来查看一下数据集中有多少数据

data.shape(164944, 1789) 
复制代码

可以看到总共有 164944 条数据,也就是爬了 164944 个房屋信息,每一条房屋信息都有 1789 列数据。

查看具体数据:

data.head() # 显示前几条数据的具体信息
复制代码



从以上两个图中,我们可以看出,有很多数据都是空的,是不能直接拿来训练模型的,因此这个数据集中有很多噪音,处理数据集也是数据科学家以及机器学习专家大部分时间来干的事。

滤掉空数据:

滤掉大量的空数据是一种常用的数据处理方法,也是数据处理的第一步。在这里我们滤除掉一列数据中为空数据的量占比大于数据总量(这里就是 164944)的百分之 30 的这一列数据。代码如下:

null_sum = data.isnull().sum()data.columns[null_sum<len(data)*0.3]"""输出:Index(['Id', 'Address', 'Sold Price', 'Sold On', 'Summary', 'Type',       'Year built', 'Heating', 'Cooling', 'Parking', 'Bedrooms', 'Bathrooms',       'Total interior livable area', 'Total spaces', 'Garage spaces',       'Home type', 'Region', 'Elementary School', 'Elementary School Score',       'Elementary School Distance', 'High School', 'High School Score',       'High School Distance', 'Heating features', 'Parking features',       'Lot size', 'Parcel number', 'Tax assessed value', 'Annual tax amount',       'Listed On', 'Listed Price', 'Zip'],      dtype='object')"""data.drop(columns=data.columns[null_sum>len(data)*0.3], inplace = True)
复制代码

滤除掉这些数据之后,剩下的数据特征就是上面的输出了。包括 Id,Address,Sold Price 等等。

查看数据类型并转换类型:

对于一个新的数据集,查看数据类型是必要的,我们要把它转换成和数据特征相匹配的数据类型。比如房屋价格设置成 int 数据类型就更合适,以便于接下来的数据处理和运算等操作。

# 查看数据类型data.dtypes"""# 输出:Id                             objectAddress                        objectSold Price                     objectSold On                        objectSummary                        objectType                           objectYear built                     objectHeating                        objectCooling                        objectParking                        objectBedrooms                       objectBathrooms                      objectTotal interior livable area    objectTotal spaces                   objectGarage spaces                  objectHome type                      objectRegion                         objectElementary School              objectElementary School Score        objectElementary School Distance     objectHigh School                    objectHigh School Score              objectHigh School Distance           objectHeating features               objectParking features               objectLot size                       objectParcel number                  objectTax assessed value             objectAnnual tax amount              objectListed On                      objectListed Price                   objectZip                            objectdtype: object"""
复制代码

从上面的结果看,各种数据都是 object 类型,所以我们要把一些比较重要的数据特征转换成合适的数据类型。代码如下:

data['Id']=data['Id'].astype(int)data['Elementary School Score']=data['Elementary School Score'].astype(float)data['Total spaces']=data['Total spaces'].astype(float)data['Bathrooms']=data['Bathrooms'].astype(float)data['Elementary School Distance']=data['Elementary School Distance'].astype(float)data['Bathrooms']=data['Bathrooms'].astype(float)data['Garage spaces']=data['Garage spaces'].astype(float)data['Zip']=data['Zip'].astype(int) 
复制代码

从前面的截图中我们可以看到,有些数据带有特殊符号,比如"Sold Price"这一列数据中就有美元符号($)和逗号(,),我们就必须把这些特殊符号去掉,变成纯数字。可以使用正则表达式来解决,代码如下:

currency=['Sold Price','Listed Price','Tax assessed value','Annual tax amount']for c in currency:    data[c] = data[c].replace(r'[$,-]','',regex=True).replace(r'^\s*$',np.nan,regex=True).astype(float)
复制代码

还有就是房屋面积单位不一,有些房屋面积用的是英亩(Acres),这里换成平方英尺(sqft)。代码如下:

areas = ['Total interior livable area','Lot size']for c in  areas:    acres = data[c].str.contains('Acres') == True    col = data[c].replace(r'\b sqft\b|\b Acres\b|\b,\b','',regex= True).astype(float)    col[acres] *= 43560    data[c] = col
复制代码

数据统计信息:

接下来,我们查看一下数据的统计信息,代码如下:

data.describe()
复制代码


通过统计信息发现,在 Lot size 这一列中,最大值达到了 10 次方,最小值为 0,显然是不合理的,我们设置一个合理的范围为[10,10000]来过滤不合理的数据,代码如下:

abnormal = (data[areas[1]]<10) | (data[areas[1]]>1e4)data = data[-abnormal]sum(abnormal)"""输出为41000,也就是说滤掉了41000条数据"""
复制代码

可视化:

下面画一下"Sold Price" 的直方图:

ax = sns.histplot(np.log10(data['Sold Price']))  # 这里价格做了log10处理ax.set_xlim([3,8])ax.set_xticks(range(3,9))ax.set_xticklabels(['%.0e' %a for a in 10**ax.get_xticks()])
复制代码


现在统计一下房子类型数量排名前 20 的分别是什么:

data['Type'].value_counts()[0:20]"""输出结果:SingleFamily            74318Condo                   18749MultiFamily              6586VacantLand               6199Townhouse                5846Unknown                  5390MobileManufactured       2588Apartment                1416Cooperative               161Residential Lot            75Single Family              69Single Family Lot          56Acreage                    482 Story                    393 Story                    25Hi-Rise (9+), Luxury       21RESIDENTIAL                19Duplex                     19Condominium                19Mid-Rise (4-8)             17Name: Type, dtype: int64"""
复制代码

把前四名的房子类型的售卖价格的密度曲线画出来:

types = data['Type'].isin(['SingleFamily','Condo','MultiFamily','Townhouse'])sns.displot(pd.DataFrame({'Sold Price':np.log10(data[types]['Sold Price']),'Type':data[types]['Type']}), x='Sold Price', hue='Type',kind='kde')
复制代码


接下来画一下类型前四名的每平方英尺的售价的箱型图:


data['Price per living sqft'] = data['Sold Price']/data['Total interior livable area']
ax = sns.boxplot(x = 'Type', y = 'Price per living sqft', data = data[types], fliersize = 0)ax.set_ylim([0, 2000]);
复制代码



发布于: 3 小时前阅读数: 7
用户头像

打工人!

关注

打工人! 2019.11.10 加入

InfoQ年度最佳内容获得者。 InfoQ签约作者 本人打工人一枚,自动化和控制专业入坑人一枚。目前在研究深度强化学习(DRL)技术。准备入坑互联网小白一枚。喜欢了解科技前沿技术,喜欢拍照。

评论

发布
暂无评论
实用机器学习笔记五:探索性数据分析