波士顿房产数据集——线性回归(多变量)

波士顿房产数据

波士顿房价数据集(Boston House Price Dataset)

使用sklearn.datasets.load_boston即可加载相关数据。该数据集是一个回归问题。每个类的观察值数量是均等的,共有 506 个观察,13 个输入变量和1个输出变量。

每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率,一氧化氮浓度,住宅平均房间数,到中心区域的加权距离以及自住房平均房价等等。

在这里插入图片描述

from sklearn.datasets import load_boston
boston = load_boston()
print(boston.data.shape)

输出结果
在这里插入图片描述

from sklearn.datasets import load_boston
import pandas as pd

import matplotlib.pyplot as plt

from sklearn import datasets
from pandas.plotting import scatter_matrix

boston = load_boston()

print('--- %s ---' % 'boston type')
print(type(boston))
print('--- %s ---' % 'boston keys')
print(boston.keys())
print('--- %s ---' % 'boston data')
print(type(boston.data))

print('--- %s ---' % 'boston target')
print(type(boston.target))
print('--- %s ---' % 'boston data shape')
print(boston.data.shape)

print('--- %s ---' % 'boston feature names')
print(boston.feature_names);


X = boston.data
y = boston.target
df = pd.DataFrame(X, columns= boston.feature_names)

print('--- %s ---' % 'df.head')
print(df.head())

输出结果:
在这里插入图片描述

多变量线性回归代码实现

import numpy as np
from sklearn import datasets

dataset = datasets.load_boston()
print(dataset.get('feature_names'))
# 使用第6-8列feature,即AGE(1940年以前建成的自住单位的比例),
# DIS(距离五个波士顿就业中心的加权距离),RAD(距离高速公路的便利指数)
X = dataset.data[:, 5:8]
# 为X增加一列全为1,来求偏置项
X = np.column_stack((X, np.ones(len(X))))
y = dataset.target

# 划分训练集和测试集
X_train = X[:-20]
X_test = X[-20:]
y_train = y[:-20]
y_test = y[-20:]

X_train = np.mat(X_train)
y_train = np.mat(y_train).T

xTx = X_train.T * X_train
w = 0
if np.linalg.det(xTx) == 0.0:
    print('xTx不可逆')
else:
    w = np.ravel(xTx.I * (X_train.T * y_train))
coef_ = w[:-1]
intercept_ = w[-1]

# 去掉添加的那一列1
X_train = X_train[:, 0:3]
X_test = X_test[:, 0:3]

y_test_pred = coef_[0] * X_test[:, 0] + coef_[1] * X_test[:, 1] + coef_[2] * X_test[:, 2] + intercept_

# 矩阵转回数组
X_train = np.ravel(X_train).reshape(-1, 3)
y_train = np.ravel(y_train)

print('Coefficients: ', coef_)
print('Intercept:', intercept_)
print('the model is: y = ', coef_, '* X + ', intercept_)
# 均方误差
print("Mean squared error: %.2f" % np.average((y_test - y_test_pred) ** 2))

实验结果:
在这里插入图片描述
与 from sklearn.linear_model import LinearRegression的对比:

from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
import warnings

# 不想看到warning,添加以下代码忽略它们
warnings.filterwarnings(action="ignore", module="sklearn")

dataset = datasets.load_boston()
print(dataset.get('feature_names'))
# 使用第6-8列feature,即AGE(1940年以前建成的自住单位的比例),
# DIS(距离五个波士顿就业中心的加权距离),RAD(距离高速公路的便利指数)
X = dataset.data[:, 5:8]
y = dataset.target

# 划分训练集和测试集
X_train = X[:-20]
X_test = X[-20:]
y_train = y[:-20]
y_test = y[-20:]

regr = linear_model.LinearRegression()
regr.fit(X_train, y_train)
y_test_pred = regr.predict(X_test)

print('Coefficients: ', regr.coef_)
print('Intercept:', regr.intercept_)
print('the model is: y = ', regr.coef_, '* X + ', regr.intercept_)
# 均方误差
print("Mean squared error: %.2f" % mean_squared_error(y_test, y_test_pred))
# r2 score,0,1之间,越接近1说明模型越好,越接近0说明模型越差
print('Variance score: %.2f' % r2_score(y_test, y_test_pred))

输出结果:

在这里插入图片描述
网格搜索调参

网格搜索是一种调参手段;穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫grid search)。

参考资料:
添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyh342284181

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值