赞
踩
此数据是一份源于美国某经济学杂志上,分析研究波士顿房价( Boston House
Price)的数据集。数据集中的每一行数据都是对波士顿周边或城镇房价的描述:
CRIM: 城镇人均犯罪率
ZN: 住宅用地所占比例
INDUS: 城镇中非住宅用地所占比例
CHAS: CHAS 虚拟变量,用于回归分析
NOX: 环保指数
RM: 每栋住宅的房间数
AGE: 1940 年以前建成的自住单位的比例
DIS: 距离 5 个波士顿的就业中心的加权距离。
RAD: 距离高速公路的便利指数
TAX: 每一万美元的不动产税率
PRTATIO: 城镇中的教师学生比例
B: 城镇中的黑人比例
LSTAT: 地区中有多少房东属于低收入人群
MEDV: 自住房屋房价中位数(也就是均价)
线性回归:,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。
在这里只使用房间数量这个特征
from sklearn import datasets
import pandas as pd
import numpy as np
boston = datasets.load_boston()
# 根据boston.keys()和boston.feature_names的结果从而对房间数量这个特征进行选择
boston_data = boston.data
boston_room = boston_data[:, 5] #得到房间数量特征
boston_target = boston.target #得到数据标签
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(boston_room, boston_target)
(参考:https://www.cnblogs.com/volcao/p/9104183.html)
思路:测试数据集中的点,距离模型的平均距离越小,该模型越精确
注:使用平均距离,而不是所有测试样本的距离和,因为距离和受样本数量的影响
度量模型性能的一种方法是计算模型在测试集上的均方误差(Mean Squared Error)
def mean_squared_error(y_true, y_predict):
assert len(y_true) == len(y_predict), \
"the size of y_true must be equal to the size of y_predict"
return np.sum((y_true - y_predict)**2) / len(y_true)
平均绝对误差
def mean_absolute_error(y_true, y_predict):
return np.sum(np.absolute(y_true - y_predict)) / len(y_true)
均方根误差:
def root_mean_squared_error(y_true, y_predict):
return mean_squared_error(y_true, y_predict) ** 0.5
RMSE和MAE的比较
量纲一样:都是原始数据中y对应的量纲
RMSE > MAE: # 这是一个数学规律,一组正数的平均数的平方,小于每个数的平方和的平均数;
最好的衡量线性回归法的指标:R Squared.
:公式样式与MSE类似,可以理解为一个预测模型,只是该模型与x无关,在机器学习领域称这种模型为基准模型(Baseline Model),适用于所有的线型回归算法;
基准模型问题:因为其没有考虑x的取值,只是很生硬的以为所有的预测样本,其预测结果都是样本均值.
因此对公式可以这样理解:
分子是我们的模型预测产生的错误,分母是使用y等于y的均值这个模型所产生的错误
自己的模型预测产生的错误 / 基础模型预测生产的错误,表示自己的模型没有拟合住的数据,因此R2可以理解为,自己的模型拟合住的数据
公式推理结论:
R^2<= 1
R^2越大越好,当自己的预测模型不犯任何错误时: R^2 = 1
当我们的模型等于基准模型时:R^2 = 0
如果R^2 < 0,说明学习到的模型还不如基准模型。 # 注:很可能数据不存在任何线性关系
公式变形:
具体代码:
1 - mean_squared_error(y_true, y_predict) / np.var(y_true)
# mean_squared_error()函数就是MSE
# np.var(array):求向量的方差
#导入用到的库 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() #载入数据集 print(Boston.DESCR) #得到关于房价的描述信息 x = Boston.data[:,5] #得到RM列的数据 x = x.reshape(-1,1) #变为1列 y = Boston.target y = y.reshape(-1,1) #变为1列 #分割数据集为训练集与测试集 x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25,random_state = 0) #创建线性回归模型 regr = LinearRegression() #用训练集训练模型 regr.fit(x_train,y_train) #用训练得出的模型进行预测 y_pred = regr.predict(x_test) #根据公式计算所得结果 mse_test = np.sum((y_pred-y_test)**2)/len(y_test) mae_test = np.sum(np.absolute(y_pred-y_test))/len(y_test) rmse_test = mse_test ** 0.5 r2_score = 1- (mse_test/ np.var(y_test)) print('根据公式所得结果如下:') print('均方误差:{},平均绝对误差:{},\n均方根误差:{},可决系数:{}'.format(mse_test,mae_test,rmse_test,r2_score)) print() 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)) (https://blog.csdn.net/Guiabbey/article/details/88088290)
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
# MSE
mse_predict = mean_squared_error(y_test, y_predict)
# MAE
mae_predict = mean_absolute_error(y_test, y_predict)
# y_test:测试数据集中的真实值
# y_predict:根据测试集中的x所预测到的数值
调用scikit-learn中的r2_score()函数:
from sklearn.metrics import r2_score
r2_score(y_test, y_predict)
# y_test :测试数据集中的真实值
# y_predict:预测到的数据
import pandas as pd import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression from sklearn import metrics from sklearn.metrics import r2_score from sklearn.metrics import mean_squared_error from sklearn.metrics import mean_absolute_error #平方绝对误差 boston = datasets.load_boston() print(boston.DESCR) #获得关于房价的描述信息 x = boston.data #获得数据集的特征属性列 y = boston.target #获得数据集的label列 df = pd.DataFrame(data = np.c_[x,y],columns=np.append(boston.feature_names,['MEDV'])) #np.c_是按列连接两个矩阵,就是把两矩阵左右相加,要求列数相等 df = df[['RM','MEDV']] #选择房间数属性列和房价属性列 print(df[:5]) #查看前5行的数据格式 x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.4) #划分数据集 scaler = StandardScaler() #作用:去均值和方差归一化。可保存训练集中的均值、方差参数,然后直接用于转换测试集数据。 x_train = scaler.fit_transform(x_train) x_test = scaler.fit_transform(x_test) linreg = LinearRegression() model = linreg.fit(x_train,y_train) print("MSE均方误差:",mean_squared_error(y_train,model.predict(x_train))) print("RMSE均方根误差:",mean_squared_error(y_train,model.predict(x_train)) ** 0.5) print("MAE平均绝对误差:",mean_absolute_error(y_train,model.predict(x_train))) print("r2_score决定系数:",r2_score(y_train,model.predict(x_train))) --------------------- 原文:https://blog.csdn.net/weixin_42515907/article/details/88087373
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。