上一篇讲了基本的端到端项目开发的起步,本篇将要更加详细的讲解开发机器学习项目的其他重点。
1.获取数据(续)
上篇了解了pandas的两种数据结构Series和DataFrame,以及使用urllib下载数据文件和初步查看数据,现在讲解如何更加详细的查看和分析数据。
1.1 快速查看数据结构
注:上篇通过fetch_housing_data()和load_housing_data()两个函数读取从远程服务器上下载的housing.csv,并将其缓存到Dataframe类型的housing中。
虽然相比其他的机器学习项目,本次的housing数据并不是很多。但是我们如果要是直接查看输出也是很困难的。但是我们可以使用DataFrame的head()和tail()查看前几行数据或者后几行数据。
housing = load_housing_data()housing.head(5)housing.tail(5)# 输出 longitude latitude ... median_house_value ocean_proximity0 -122.23 37.88 ... 452600.0 NEAR BAY1 -122.22 37.86 ... 358500.0 NEAR BAY2 -122.24 37.85 ... 352100.0 NEAR BAY3 -122.25 37.85 ... 341300.0 NEAR BAY4 -122.25 37.85 ... 342200.0 NEAR BAY[5 rows x 10 columns] longitude latitude ... median_house_value ocean_proximity20635 -121.09 39.48 ... 78100.0 INLAND20636 -121.21 39.49 ... 77100.0 INLAND20637 -121.22 39.43 ... 92300.0 INLAND20638 -121.32 39.43 ... 84700.0 INLAND20639 -121.24 39.37 ... 89400.0 INLAND[5 rows x 10 columns]# FrameOrSeries.head(n) 的作用就是返回当前调用的Frame或Series的前n行# FrameOrSeries.tail(n) 的作用则是返回当前调用的Frame或Series的后n行
注意:如果读者的开发环境是jupyter notebook,则只需要housing.head(5)/housing.tail(5),点击运行便可以直接获得输出。如国使用的PyCharm,则需要使用print(housing.head(5))函数进行输出。
同时我们还知道了其所有的columns也就是housing有哪些数据,但是如果我们想要更加查看housing的更多信息,就可以用info()来获取数据集的简单描述。
housing.info()# 输出信息:# 1. class类型<class 'pandas.core.frame.DataFrame'># 2. 获得总行数RangeIndex: 20640 entries, 0 to 20639# 3. 获取每个属性的类型和是否非空Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 longitude 20640 non-null float64 #经度 1 latitude 20640 non-null float64 #维度 2 housing_median_age 20640 non-null float64 #房龄中位数 3 total_rooms 20640 non-null float64 #总房间 4 total_bedrooms 20433 non-null float64 #总卧室 5 population 20640 non-null float64 #区域人口 6 households 20640 non-null float64 #区域家庭 7 median_income 20640 non-null float64 #收入中位数 8 median_house_value 20640 non-null float64 #房价中位数 9 ocean_proximity 20640 non-null object #与海的空间关系dtypes: float64(9), object(1)# 4.获取总内存memory usage: 1.6+ MBNone
这里我们需要注意一点,total_bedrooms的非空值比其他属性要少207个区域,因此在此后的处理需要考虑到该问题。
我们使用info()知道了housing下有10个属性,但是其中一个是object,如果再python下,则可能是任何对象,但是我们是从csv下加载的,所以只可能是文本属性。那我们就可以使用value_counts() 方法,可以了解该属下将区域分成了几部分。
housing["ocean_proximity"].value_counts()# 输出<1H OCEAN 9136 # 到海洋小于1小时INLAND 6551 # 陆地NEAR OCEAN 2658 # 海洋附近NEAR BAY 2290 # 海湾附近ISLAND 5 # 岛屿Name: ocean_proximity, dtype: int64
如果我们还想要继续做一些简单的统计,比如获得总行(count)、平均值(mean)、标准差(std:用于测量数值的离散程度)等等,我们还可以通过describe() 方法。
housing.describe()# 输出8种统计 longitude latitude ... median_income median_house_valuecount 20640.000000 20640.000000 ... 20640.000000 20640.000000 # 统计总数、不统计空值mean -119.569704 35.631861 ... 3.870671 206855.816909 # 平均值std 2.003532 2.135952 ... 1.899822 115395.615874 # 标准差min -124.350000 32.540000 ... 0.499900 14999.000000 # 最小值25% -121.800000 33.930000 ... 2.563400 119600.000000 # 第25分位/第一四分位50% -118.490000 34.260000 ... 3.534800 179700.000000 # 第50分位75% -118.010000 37.710000 ... 4.743250 264725.000000 # 第75分位/第三四分位max -114.310000 41.950000 ... 15.000100 500001.000000 # 最大值[8 rows x 9 columns]
我们还能够借助matplotlib画housing直方图,所用的函数就是hist(),hist()可以画出housing每个float64类型属性的直方图(x轴是属性值的范围,y轴是实例的数量)。
housing.hist(bins=50, figsize=(20, 15))plt.show()每个数值属性的直方图