Sklearn实现加州房产价格预测
一、导入需要用到的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import os
import tarfile
from six.moves import urllib
二、编写获取加州房产数据的函数
fetch_housing_data(),获取housing.csv数据,当调用fetch_housing_data(),就会在工作空间创建一个datasets/housing目录, 并且下载housing.tgz,解压housing.tgz
DOWNLOAD_ROOTDOWNLOA = "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):
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()
三、编写读取housing.csv的函数
load_housing_data(),加载加州房产数据
def load_housing_data(housing_path=HOUSING_PATH):
csv_path = os.path.join(housing_path, "housing.csv")
return pd.read_csv(csv_path)
housing=load_housing_data()
四、利用Sklearn分割数据,获得训练数据集和测试数据集
(一)利用train_test_split
关于train_test_split常用参数说明(详细可见sklearn文档说明):
test_size : float, int or None, optional (default=0.25)
random_state :用于设置随机数生成器的种子,目的是保证当多次运行此段代码能够得到完全一样的分割结果,常设为42
shuffle:布尔值。默认为True,设为True时代表在分割数据集前先对数据进行洗牌(随机打乱数据集)
stratify:默认为None.当shuffle=True时,才能不为None,如果不是None,则数据集以分层方式拆分,并使用此作为类标签。
from sklearn.model_selection import train_test_split
train_set,test_set=train_test_split(housing,test_size=0.2,random_state=42)
(二)利用StratifiedShuffleSplit
关于StratifiedShuffleSplit说明(详细可见sklearn文档说明):
这个函数主要是为了用于实现交叉验证(见后续),实现分层方式分割。
其创建的每一组划分将保证每组类比例相同与原数据集中各类的比例保持相同,即第一组训练数据类别比例为2:1,则后面每组类别都满足这个比例 参数说明:
n_splits是将训练数据分成train/test对的组数,可根据需要进行设置,默认为10
(分层方式是指保持原数据集各个类的比例进行分割。比如原来数据集有两类A和B,A:B=5:2,那么在分割后训练数据集和测试数据集中A和B的比例也各自均为5:2。这样利用分层采样可以避免产生严重偏差)
为了进行分层分割,首先我们的数据集应该有类别。假设收入中位数是预测房价中位数非常重要的属性,我们根据多种收入分类。
首先看一下原数据的收入中位数分布
然后我们对收入中位数进行处理:
(1)首先将每个收入中位数除以1.5(用于限制收入分类的数量),用ceil对值舍入,向上取整(以产生离散的分类)
(2)将所有大于5的收入中位数归入到类别5,小于5的收入中位数保持对应的数值作为其类别(1,2,3,4).关于where的使用见http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.where.html (需要尤其注意它的other参数,对于不满足cond参数的部分的值将变为other参数的值5.0)
housing["income_cat"] = np.ceil(housing["median_income"] / 1.5)
# print (housing["income_cat"])
# print (type(housing["income_cat"]))
housing["income_cat"].where(housing["income_cat"] < 5, 5.0, inplace=True)
# print (housing["income_cat"])
经过处理后的收入中位数分布:
from sklearn.model_selection import StratifiedShuffleSplit
ss