HCIA-AI_机器学习_波士顿房价预测

Posted Rain松

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HCIA-AI_机器学习_波士顿房价预测相关的知识,希望对你有一定的参考价值。

机器学习实验-波士顿房价预测

1 波士顿房价预测

1.2 实验代码

1.2.1 引入依赖包

# 忽略不必要的警告
import warnings
warnings.filterwarnings('ignore')

# 引入数据科学基础包
import numpy
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import scipy.stats as st

# 设置属性防止画图中文乱码
# mpl.rcParams.keys()
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 引入机器学习、预处理、模型选择、评估指标
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

# 引入波士顿数据集
from sklearn.datasets import load_boston

# 引入各种线性机器学习算法
from sklearn.linear_model import LinearRegression,RidgeCV,LassoCV,ElasticNet

# 引入支持向量机的回归形式
from sklearn.svm import SVR

# 引入集成算法
from sklearn.ensemble import RandomForestRegressor,GradientBoostingRegressor
from xgboost import XGBRegressor

1.2.2 加载数据集,查看数据属性,可视化

# 加载波士顿房价数据集
boston = load_boston()

# x是特征,y是标签
x = boston.data
y = boston.target

# 查看相关属性
print('特征的列名')
print(boston.feature_names)
print('样本数据量:%d, 特征个数:%d' %x.shape)
print('标签样本数据量:%d' %y.shape[0])
特征的列名
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
样本数据量:506, 特征个数:13
标签样本数据量:506
# 转化为DataFrame形式
x = pd.DataFrame(boston.data, columns=boston.feature_names)
x.head()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.904.98
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.909.14
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.834.03
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.632.94
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.905.33
sns.distplot(tuple(y), kde=False, fit=st.norm)
<matplotlib.axes._subplots.AxesSubplot at 0x7f65b61d4828>

1.2.3 分割数据集,并对数据集进行预处理

# 数据分割
x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=0.2, random_state=28)

# 标准化数据集
# 为什么要这个步骤?
ss = StandardScaler()
x_train = ss.fit_transform(x_train)
x_test = ss.transform(x_test)
x_train[0:100]
array([[-0.35703125, -0.49503678, -0.15692398, ..., -0.01188637,
         0.42050162, -0.29153411],
       [-0.39135992, -0.49503678, -0.02431196, ...,  0.35398749,
         0.37314392, -0.97290358],
       [ 0.5001037 , -0.49503678,  1.03804143, ...,  0.81132983,
         0.4391143 ,  1.18523567],
       ...,
       [-0.34697089, -0.49503678, -0.15692398, ..., -0.01188637,
         0.4391143 , -1.11086682],
       [-0.39762221,  2.80452783, -0.87827504, ...,  0.35398749,
         0.4391143 , -1.28120919],
       [-0.38331362,  0.41234349, -0.74566303, ...,  0.30825326,
         0.19472652, -0.40978832]])

1.2.4 利用各类回归模型,对数据集进行建模

# 模型的名称
names = [
    '线性回归',
    '岭回归',
    'Lasso回归',
    '随机森林',
    '梯度提升树GBDT',
    '支持向量机',
    '弹性网络',
    'XGBoost'
]
# 定义模型
# CV 交叉验证
models = [
    LinearRegression(),
    RidgeCV(alphas=(0.001, 0.1, 1), cv=3),
    LassoCV(alphas=(0.001, 0.1, 1), cv=5),
    RandomForestRegressor(n_estimators=10),
    GradientBoostingRegressor(n_estimators=30),
    SVR(C=5, kernel='rbf', gamma=0.1),
    ElasticNet(alpha=0.001, max_iter=10000),
    XGBRegressor()
]

# 输出所有回归模型的R2评分
# 定义R2评分的函数
def R2(model, x_train, x_test, y_train, y_test):
    model_fitted = model.fit(x_train, y_train)
    y_pred = model_fitted.predict(x_test)
    return r2_score(y_test, y_pred)

# 遍历所有模型进行评分
for name,model in zip(names, models):
    score = R2(model, x_train, x_test, y_train, y_test)
    print(': :.6f, :.4f'.format(name, score.mean(), score.std()))

线性回归: 0.564115, 0.0000
岭回归: 0.563673, 0.0000
Lasso回归: 0.564049, 0.0000
随机森林: 0.716249, 0.0000
梯度提升树GBDT: 0.733582, 0.0000
支持向量机: 0.618320, 0.0000
弹性网络: 0.563992, 0.0000
XGBoost: 0.761123, 0.0000

1.2.5 利用网格搜索对超参数进行调节

# 模型构建

'''
  超参数
  'kernel': 核函数
  'C': SVR的正则化因子
  'gamma': 'rbf','ploy', 'sigmoid'核函数的系数,影响模型性能
'''
params = 
    'kernel': ['rbf', 'linear'],
    'C': [0.1, 0.5, 0.9, 1, 5],
    'gamma': [0.001, 0.01, 0.1, 1]

# 使用网格搜索,以及交叉验证
model = GridSearchCV(SVR(), param_grid=params, cv=3)
model.fit(x_train, y_train)
# 获取最优参数
print('最优参数列表:', model.best_params_)
print('最优模型:', model.best_estimator_)
print('最优R2值:', model.best_score_)

# 可视化
ln_x_test = range(len(x_test))
y_pred = model.predict(x_test)

plt.figure(figsize=(16,8))
plt.plot(ln_x_test, y_test, 'r-', label=u'真实值')
plt.plot(ln_x_test, y_pred, 'b-', label=u'SVR估计值,$R^2$=%.3f' %model.best_score_)
plt.legend(loc='upper right')
plt.grid(True)
plt.title(u'波士顿房价预测-支持向量机')
plt.show()
最优参数列表: 'C': 5, 'gamma': 0.1, 'kernel': 'rbf'
最优模型: SVR(C=5, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma=0.1,
  kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
最优R2值: 0.7963412572047208

1.3 笔记

以上是关于HCIA-AI_机器学习_波士顿房价预测的主要内容,如果未能解决你的问题,请参考以下文章

HCIA-AI_机器学习_波士顿房价预测

机器学习之路: python 线性回归LinearRegression, 随机参数回归SGDRegressor 预测波士顿房价

机器学习实战二:波士顿房价预测 Boston Housing

机器学习实战—— 用线性回归预测波士顿房价

机器学习之路:python k近邻回归 预测波士顿房价

机器学习梯度下降法应用波士顿房价预测