机器学习实战第二版------第一节:数据预处理

使用 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值