波士顿房产数据
波士顿房价数据集(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)。
参考资料:
添加链接描述