机器学习实战第二版------第一节:数据预处理
使用 numpy、pandas、pymatplot处理数据
作者使用pycharm运行代码,安装以上三个安装包,接下来处理波士顿数据将数据集分为训练集和测试
手撕源码
下载数据
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
from zlib import crc32
from sklearn.model_selection import train_test_split
def loaddata(path):
'''
下载数据集
:param path:
:return:
'''
csvpath=os.path.join(path,'housing.csv')
return pd.read_csv(csvpath)
if __name__ == "__main__":
housingdata = loaddata('./')
print(housingdata.head(4)) #head 默认查看前五行
print(housingdata.describe()) #查看某种属性下的摘要 数据大小,平均值,中位数 std标准差 分位数等。。。
print(housingdata.info())#info也是pandas的方法 这个数据集查看简介
print(housingdata['ocean_proximity'].value_counts()) #观察到object下是分类的标签 ==查看某列类型的值
housingdata.hist(bins=50, figsize=(15, 12)) # 显示整体数据的图 hist画直方图 bins柱形宽度 figsize图片大小
# housingdata.kde()
'''
'''
# 可以看出两张中位数的右侧的延伸度都长,这会导致机器学习算法难以检测
plt.show()
创建数据集
def split_train_test(data,test_ratio):
shuffle = np.random.permutation(len(data)) #对一个序列打乱
test_set_size = int(len(data)*test_ratio)
print(len(data),shuffle, test_set_size)
train_data= shuffle[test_set_size:]#切片 切片是从test_set_size数字的元素开始
test_data = shuffle[:test_set_size]
print(train_data, test_data)
return data.iloc[train_data],data.iloc[test_data] #取这个列表里的行
#pandas iloc[:,:] 第一个去行数 第二个取列数
# loc函数:通过行索引 "Index" 中的具体值来取行数据(如取"Index"为"A"的行)
#iloc函数:通过行号来取行数据(如取第二行的数据)
def test_set_check(indentifier,test_radio):
'''
:param indentifier:每个标签的标识符 可用数据id
:param test_radio: 切割的比例
:return:
'''
return crc32(np.int64(indentifier)) & 0xffffffff <test_radio *2*32
def split_train_test_by_id(data,test_radio,id_column):
'''
:param data:数据
:param test_radio:比例
:param id_column: 取作为标识符那一列的lable
:return:
'''
ids = data[id_column]
in_test_set = ids.apply(lambda id_ :test_set_check(id_,test_radio)) #lambda 匿名函数 id——入口参数 test——radio函数
return data.loc[~in_test_set],data.loc[in_test_set]
if __name__ == "__main__":
housingdata = loaddata('./')
train_set,test_set = split_train_test(housingdata,0.2)
# print(train_set['longitude'],len(test_set))
#测试集
housing_with_id = housingdata.reset_index() #构造了具有index的dataframe
train_set,test_set =split_train_test_by_id(housing_with_id,0.2,'index')
'''
但存在问题 :每次数据都会有不同 方法:np.random.seed(42) 每次生成相同的序列
但如果跟新数据集之后,数据集就会产生新的不同
'''
用轮子:使用sklearn的库函数
#原理如上,请仔细看
train_set,test_set = train_test_split(housingdata,test_size=0.2,random_state=42)