0304线性回归(多变量)-基于波士顿房产数据集

1、首先对波士顿房产数据集进行分析

CRIM: 城镇人均犯罪率
ZN: 住宅用地所占比例
INDUS: 城镇中非住宅用地所占比例
CHAS: 查尔斯河(Charles River)变量(若土地位于河流边界,则为 1;否则为 0)
NOX: 环保指数
RM: 每栋住宅的房间数
AGE: 1940 年以前建成的自住单位的比例
DIS: 距离 5 个波士顿的就业中心的加权距离。
RAD: 距离高速公路的便利指数
TAX: 每一万美元的不动产税率
PRTATIO: 城镇中的教师学生比例
B: 城镇中的黑人比例
LSTAT: 地区中有多少房东属于低收入人群
MEDV: 自住房屋房价中位数

通过分析,可知CRIM、ZN、INDUS、NOX、AGE、RAD、TAX、PRTATIO、B是相对数,而
RM、DIS、LSTAT、MEDV是绝对数,其中CHAS是虚拟变量。对于多变量问题,需要将这些特征都具有相近的尺度,可通过数据标准化处理,可帮助梯度下降更快的收敛。
常用的数据标准化方法有三种:

  • 规范化方法
    在这里插入图片描述
  • 正规化方法
    在这里插入图片描述
  • 归一化方法
    在这里插入图片描述
    2、实战
"""
日期:20190305
任务四
1. 波士顿房产数据(完整数据)
2. 实现多变量(手写代码)
3. 数据标准化(手写代码)
4. 网格搜索调参
5 from sklearn.linear_model import LinearRegression对比
"""
#导入用到的库
import sklearn.datasets as datasets
from sklearn.linear_model import LinearRegression  #线性回归模型
from sklearn.model_selection import train_test_split #切分训练集和测试集
import pandas as pd
import numpy as np

Boston = datasets.load_boston()  #载入数据集
Boston.data.shape  #查看数据集形状

X = pd.DataFrame(Boston.data)  #将数据放入DataFrame中便于查看
y = pd.DataFrame(Boston.target,columns=['13'])
#X.head()
#Boston.feature_names
PrBoston = pd.concat([X,y],axis =1)#axis =1 为横向操作,即横向合并
#手写代码实现数据标准化
def Z_ScoreNormalization(x,mu,sigma):
    x = (x - mu) / sigma
    return x
X = PrBoston.values
ss_PrBoston = pd.DataFrame(Z_ScoreNormalization(X,np.average(X),np.std(X)))
ss_PrBoston.head()

#调用函数实现数据标准化
# from sklearn.preprocessing import StandardScaler
# scaler = StandardScaler()
# ss_PrBoston = pd.DataFrame(scaler.fit_transform(PrBoston))
# ss_PrBoston.head()

#切分特征和结果为训练集和测试集
X1 = ss_PrBoston.iloc[:,0:13]
y1 = ss_PrBoston.iloc[:,13]
X_train,X_test,y_train,y_test = train_test_split(X1,y1,test_size=0.25,random_state=0)

regr = LinearRegression()
model = regr.fit(X_train, y_train)
#用训练得出的模型进行预测
y_pred = regr.predict(X_test)
#print(y_pred)
print(model)
print('截距:{},系数:{}'.format(regr.intercept_,regr.coef_))

from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import mean_absolute_error #平方绝对误差
from sklearn.metrics import r2_score #R square
#调用函数获得结果
mse_test1 = mean_squared_error(y_test,y_pred)
mae_test1 = mean_absolute_error(y_test,y_pred)
rmse_test1 = mse_test1 ** 0.5
r2_score1 = r2_score(y_test,y_pred)
print('直接调用函数所得结果如下:')
print('均方误差:{},平均绝对误差:{},\n均方根误差:{},可决系数:{}'.format(mse_test1,mae_test1,rmse_test1,r2_score1))

输出结果:
0304线性回归(多变量)-基于波士顿房产数据集_第1张图片
由输出结果可知:和单变量线性回归相比,多元线性回归的可决系数达到了63.5%,拟合优度增加。

通过本次学习,发现了以前未注意的小知识点:

  • 对于DataFrame类型的数据数据,其切片操作需加上.iloc。
  • 对于昨天纠结的问题,先标准化还是先切分数据集?可以先将数据进行合并,但数据必须都是DataFrame格式。
  • 给数据加标签, X.columns = Boston.feature_names。
  • 当数据集被随机切分成训练集和测试集时,数据前面的索引被打乱,可通过代码恢复其索引顺序:
for i in [X_train,X_test]:
    i.index = range(i.shape[0])

3、网格搜索调参

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

参考资料:
https://blog.csdn.net/kryolith/article/details/39770187

你可能感兴趣的:(0304线性回归(多变量)-基于波士顿房产数据集)