机器学习实战 书籍第二章例子学习笔记
书中源码,here文中还有很多扩展知识和更新方法,很值得学习
本文地址here
注:
1.增加CustomLabelBinarizer转换器解决参数传递问题(出现args参数数量错误)
2.在评估数据集some_data报错 因为选取数据object那个对象进行稀疏向量表示时会出现长度不是样本的5维,例如选择了5组数据,原本第一组属性是object应该是[1,0,0,0,0]表示一个值,但是因为选取5组数据使用one-hot编码后样本种类不足5导致第一组属性是object表示是[1,0,0] 那么长度就不一致了,预测会报错。** (5, 14) (1000, 15) (10000, 16) **
主要分为获取数据、数据分析可视化、数据预处理、选择和训练模型、分析模型几个部分。
获取数据(数据下载 测试集获取)
import os
import tarfile
from six.moves import urllib
DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml/master/"
HOUSING_PATH = "datasets/housing"
HOUSING_URL = DOWNLOAD_ROOT + HOUSING_PATH + "/housing.tgz"
def fetch_housing_data(housing_url = HOUSING_URL, housing_path = HOUSING_PATH):
print("download from url : ", housing_url)
if not os.path.isdir(housing_path):
os.makedirs(housing_path)
tgz_path = os.path.join(housing_path, "housing.tgz")
urllib.request.urlretrieve(housing_url, tgz_path)
housing_tgz = tarfile.open(tgz_path)
housing_tgz.extractall(path=housing_path)
housing_tgz.close()
fetch_housing_data()
import pandas as pd
def load_housing_data(housing_path = HOUSING_PATH):
csv_path = os.path.join(housing_path, "housing.csv")
return pd.read_csv(csv_path)
data = load_housing_data()
注: six.moves 兼容py2 py3
当然如果确认环境 也可以使用
import urllib.request
urllib.request.urlopen(“http://”)
pandas 查看原始数据常用
- info() 数据简单描述
- describe() 数值属性摘要 count max min mean std(标准差 数据离散程度)这里的空值会被忽略
- value_counts() 查看数据基本分类
data.ocean_proximity.value_counts()
data.describe()
%matplotlib inline
import matplotlib.pyplot as plt
data.longitude.hist(bins = 50, figsize = (4, 3))
plt.show()
创建测试集
测试集创建一次之后避免变化,四种方法:
1.运行一次之后保存测试数据集
2.设定随机种子,例如permutation产生随机数之前运行 np.random.seed(1)使得每次产生的随机数和首次一致(程序重新运行就失效了)
sklearn提供了类似第二种方法函数:
from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(data, test_size=0.2, random_state=42)
3.计算示例的hash 取hash最后一个字节 如果该值小于等于51 即(256的20%)当作测试集
4.数据分层取样 对于数据特征较少,且数据与某属性关联较大
例如书籍上分析预测房价问题,房价和用户收入关联很大。例如用户收入聚集在2~5万,2万10人 3万20人,4万30人,5万30万,大于5万10人。那么收入比例分别是0.1, 0.2, 0.3, 0.3, 0.1,那么纯随机采样可能会出现和样本很大偏差。所以采用分层取样就可以得到和总样本基本一致的分布
#随机数
import numpy as np
def split_train_test(data, test_ratio):
shuffled_indices = np.random.permutation(len(data))
test_set_size = int(len(data) * test_ratio)
test_indices = shuffled_indices[:test_set_size]
train_indices = shuffled_indices[test_set_size:]
return data.iloc[train_indices], data.iloc[test_indices]
train_set, test_set = split_train_test(data, test_ratio=0.2)
print("train len : ", len(train_set), " test len : ", len(test_set))
#hash
import hashlib
def test_set_check(identifier, test_ratio, hash):
return hash(np.int64(identifier)).digest()[-1] < 256 * test_ratio
def split_train_test_by_id(data, test_ratio, id_column, hash=hashlib.md5):
ids = data[id_column]
in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio, hash))
return data.loc[