完整的机器学习_加州房价预测

本文详述了使用机器学习预测加州房价的过程,包括数据探索、预处理、模型选择(如线性回归、决策树、随机森林)和评估。通过RMSE作为评估指标,随机森林表现出较好的预测性能。
摘要由CSDN通过智能技术生成

机器学习的主要步骤

  1. 将问题框架化并且关注重点。
  2. 获取并探索数据以洞悉数据。
  3. 准备数据以更好地将基础数据模式暴露给机器学习算法。
  4. 探索多种不同的模型并列出最好的那些。
  5. 微调模型并将它们组合成一个很好的解决方案。
  6. 展示你的解决方案。
  7. 启动,监督并维护你的系统。

将问题框架化并关注重点

数据集是基于 1990 年加州普查的数据,数据包含每个街区组的人口、收入中位数、房价中位数等指标。
街区组是美国调查局发布样本数据的最小地理单位(一个街区通常有 600 到 3000 人)。我们将其简称为“街区”。
你的模型要利用这个数据进行学习,然后根据其它指标,预测任何街区的的房价中位数。

评估指标 RMSE

R M S E = 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 RMSE = \sqrt{\frac{1}{m}\sum_{i=1}^{m}(y ^ {(i)} - \hat{y} ^ {(i)}) ^ {2}} RMSE=m1i=1m(y(i)y^(i))2

数据探索

导入数据及第三方库

%matplotlib inline
# 导入第三方库
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

# 解决中文显示问题
mpl.rcParams['font.sans-serif'] = 'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
# 数据导入
housing_data = pd.read_csv('housing.csv')
housing_data.head(3)
longitude latitude housing_median_age total_rooms total_bedrooms population households median_income median_house_value ocean_proximity
0 -122.23 37.88 41.0 880.0 129.0 322.0 126.0 8.3252 452600.0 NEAR BAY
1 -122.22 37.86 21.0 7099.0 1106.0 2401.0 1138.0 8.3014 358500.0 NEAR BAY
2 -122.24 37.85 52.0 1467.0 190.0 496.0 177.0 7.2574 352100.0 NEAR BAY

数据探索

数据整体观察

# 查看数据描述
housing_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20640 entries, 0 to 20639
Data columns (total 10 columns):
longitude             20640 non-null float64
latitude              20640 non-null float64
housing_median_age    20640 non-null float64
total_rooms           20640 non-null float64
total_bedrooms        20433 non-null float64
population            20640 non-null float64
households            20640 non-null float64
median_income         20640 non-null float64
median_house_value    20640 non-null float64
ocean_proximity       20640 non-null object
dtypes: float64(9), object(1)
memory usage: 1.6+ MB
# 查看数据属性
housing_data.describe()
longitude latitude housing_median_age total_rooms total_bedrooms population households median_income median_house_value
count 20640.000000 20640.000000 20640.000000 20640.000000 20433.000000 20640.000000 20640.000000 20640.000000 20640.000000
mean -119.569704 35.631861 28.639486 2635.763081 537.870553 1425.476744 499.539680 3.870671 206855.816909
std 2.003532 2.135952 12.585558 2181.615252 421.385070 1132.462122 382.329753 1.899822 115395.615874
min -124.350000 32.540000 1.000000 2.000000 1.000000 3.000000 1.000000 0.499900 14999.000000
25% -121.800000 33.930000 18.000000 1447.750000 296.000000 787.000000 280.000000 2.563400 119600.000000
50% -118.490000 34.260000 29.000000 2127.000000 435.000000 1166.000000 409.000000 3.534800 179700.000000
75% -118.010000 37.710000 37.000000 3148.000000 647.000000 1725.000000 605.000000 4.743250 264725.000000
max -114.310000 41.950000 52.000000 39320.000000 6445.000000 35682.000000 6082.000000 15.000100 500001.000000
# 绘制各属性的关系图
sns.pairplot(housing_data,kind='scatter', diag_kind='kde' )
<seaborn.axisgrid.PairGrid at 0x1af0af9e608>

在这里插入图片描述

创建测试集

不合适的数据切割方式,会导致模型在训练时,朝着所划分的测试集模型进行训练。

1. 随机分割:train_test_split
对数据进行随机分割,适用于数据集很大的情况

2.分层采样: StratifiedShuffleSplit
为了保证测试集不变,即使新增数据也会包含新数据同样的比例作为测试集(更公平有效),可以算出数据唯一索引的哈希值<=51作为测试集(约占20%)

假设某个属性对预测列影响较大(假设收入中位数’median_income’),分别用两种切割方式对数据进行切割,对比下切分后数据集的占比。

# 原始数据
housing_data['median_income'].plot.hist()
<matplotlib.axes._subplots.AxesSubplot at 0x1af0e828108>

在这里插入图片描述

# 首先创建一个类别属性
housing_data['income_cat'] = np.ceil(housing_data['median_income']/1.5)
housing_data['income_cat'].value_counts(ascending=True).plot.bar()

# 将5以上的数据先归为一类
housing_data['income_cat'] = housing_data['income_cat'].where(housing_data['income_cat']<5 ,5 )

在这里插入图片描述

# 查看原始数据概率分布
housing_data['income_cat'].value_counts(normalize=True)
3.0    0.350581
2.0    0.318847
4.0    0.176308
5.0    0.114438
1.0    0.039826
Name: income_cat, dtype: float64
# 查看随机拆分数据后的概率分布
from sklearn.model_selection import train_test_split
train, test = train_test_split(housing_data, test_size = 0.2 , random_state=2020)
for data in (train, test):
    print('概率分布分别为',data['income_cat'].value_counts(normalize=True))
概率分布分别为 3.0    0.351320
2.0    0.317042
4.0    0.178295
5.0    0.113372
1.0    0.039971
Name: income_cat, dtype: float64
概率分布分别为 3.0    0.347626
2.0    0.326066
4.0    0.168362
5.0    0.118702
1.0    0.039244
Name: income_cat, dtype: float64
# 查看分层抽样概率分布,训练集和测试集几乎相同
from sklearn.model_selection import StratifiedShuffleSplit
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=2020)
for train_index, test_index in split.split(housing_data, housing_data['income_cat']):
    train = housing_data.loc[train_index]
    test = housing_data.loc[test_index]

for data in (train, te
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值