线性回归--测评函数(单变量)

波士顿房产数据

此数据是一份源于美国某经济学杂志上,分析研究波士顿房价( 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 #得到数据标签

数据切分(train_test_split)

from sklearn.model_selection import train_test_split
 X_train, X_test, y_train, y_test = train_test_split(boston_room, boston_target)

MSE、MAE、RMSE、r2_score

(参考:https://www.cnblogs.com/volcao/p/9104183.html)
思路:测试数据集中的点,距离模型的平均距离越小,该模型越精确
注:使用平均距离,而不是所有测试样本的距离和,因为距离和受样本数量的影响

MSE

度量模型性能的一种方法是计算模型在测试集上的均方误差(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)

MAE

平均绝对误差
在这里插入图片描述

def mean_absolute_error(y_true, y_predict):
    return np.sum(np.absolute(y_true - y_predict)) / len(y_true)

RMSE

均方根误差:
在这里插入图片描述

def root_mean_squared_error(y_true, y_predict):
    return mean_squared_error(y_true, y_predict) ** 0.5

RMSE和MAE的比较
量纲一样:都是原始数据中y对应的量纲
RMSE > MAE:   # 这是一个数学规律,一组正数的平均数的平方,小于每个数的平方和的平均数;

r2_score

最好的衡量线性回归法的指标:R Squared.

  • 准确度:[0, 1],即使分类的问题不同,也可以比较模型应用在不同问题上所体现的优劣;
  • RMSE和MAE有局限性:同一个算法模型,解决不同的问题,不能体现此模型针对不同问题所表现的优劣。因为不同实际应用中,数据的量纲不同,无法直接比较预测值,因此无法判断模型更适合预测哪个问题。
  • 方案:将预测结果转换为准确度,结果都在[0, 1]之间,针对不同问题的预测准确度,可以比较并来判断此模型更适合预测哪个问题;
    1)计算方法
    在这里插入图片描述
    2)对公式的理解

在这里插入图片描述 :公式样式与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)

scikit-learn中的MSE和MAE、r2_score

MSE,MAE

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所预测到的数值

r2_score

调用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 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值