python数据分析之线性回归实践
程序员文章站
2022-05-09 11:18:37
...
1、模型
-
可以将模型理解为一个函数(一种映射规则),由训练数据来确定函数的参数,当参数确定好之后,我们就可以利用该模型对未知的数据进行求值。
-
输入模型的数据,称为训练数据。
-
我们使用样本数据训练模型,数据中的每个属性,我们称为特征(习惯用x表示)。每条数据的目标输出值,我们称为标签(习惯用y表示)。
2、回归分析
- 回归分析是用来评估变量之间关系的统计过程
- 用来解释自变量X与因变量Y的关系,即当自变量X发生改变时,因变量Y会如何改变。
2.1 线性回归
- 线性回归是回归分析的一种,评估的自变量X与因变量Y之间是一种线性关系(画出来的图像是直的,每个自变量的最高此项为1)。
- 线性回归会输出一个连续值
2.2 拟合
- 拟合,是指构建一种算法(数学函数),使得该算法能够符合真实的数据。
- 从机器学习的角度来讲,线性回归就是要构建一个线性函数,使得该函数与目标值之间的相符性最好。
- 从空间的角度来看,就是要让函数的直线(面),尽可能靠近空间中所有的数据点(点到直线的平行于y轴的距离之和最短)。
2.3 损失函数
- 损失函数,关于误差的一个函数,用来衡量模型预测值和真实值之间的差异。
- 机器学习的目标,就是要建立一个损失函数,使得该函数的值最小。
- 损失函数是以模型参数w作为自变量的函数,自变量可能的取值组合通常是无限的,我们的目标就是要在众多可能的组合中,找到一组最合适的自变量组合(值),使得损失函数的值最小。
在线性回归中,使用最小二乘法来定义损失函数:
3、回归模型评估
- 当我们建立好回归模型之后,我们可以采用MSE、RMSE、MAE、R^2等指标来进行评估模型的效果。
- MSE(Mean Squared Error):平均平方误差,为所有样本数据误差(真实值与预测值之差)的平方和,然后取均值。
- RMSE(Root Mean Squared Error):平均平方误差的平方根,即在MSE的基础上,取平方根。
- MAE(Mean Absolute Error):平均绝对值误差,为所有样本数据误差的绝对值之和,然后取均值。
- R^2:决定系数,用来表示模型拟合性的分值,值越高表示模型拟合型越好。
- 在训练集中,R^2的取值范围是[0,1]。
- 在测试集中,R^2的取值范围是是负无穷到1。最理想的情况是所有的样本数据的预测值与真实值相同,此时其值为1。
4、简单线性回归
- 当只有一个自变量时,称为简单线性回归。
以波士顿房价数据集为例,预测RM(平均房间数)和MEDV(房屋的平均价格)的关系:
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error, mean_absolute_error
boston = load_boston() # 加载波士顿房价数据集
# 拼接data信息和target信息
data = np.concatenate([boston.data,boston.target.reshape(-1,1)],axis=1)
feature_names = boston.feature_names.tolist()
feature_names.append("MEDV") # 将"MEDV"(房屋的平均价格)添加至特征名列表,作为拼接数据的列名
df = pd.DataFrame(data,columns=feature_names)
df.sample(5) # 随机抽样10条数据,进行数据概览
x, y = boston.data[:,5].reshape(-1,1), boston.target # 平均房间数作为x,房屋的平均价格作为y
# 划分训练集和测试集,测试集大小 test_size,随机种子 random_state,用来产生相同的随机数序列
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=0)
lr = LinearRegression() # 实例化用于线性回归的类
lr.fit(x_train, y_train) # 使用训练集数据,训练模型
print("模型权重:", lr.coef_)
print("截距:", lr.intercept_)
y_hat = lr.predict(x_test) # 根据权重和截距即可确定函数,就可以使用测试集进行预测
print("实际值:", y_test[:5])
print("预测值:", y_hat[:5])
print("均方误差(MSE):", mean_squared_error(y_test, y_hat))
print("根均方误差(RMSE):", np.sqrt(mean_squared_error(y_test, y_hat)))
print("平均绝对值误差(MAE):",mean_absolute_error(y_test, y_hat))
print("训练集R^2:",lr.score(x_train, y_train))
print("测试集R^2:",lr.score(x_test, y_test))
对于以上例子,结果为:
模型权重: [9.31294923]
截距: -36.180992646339185
实际值: [22.6 50. 23. 8.3 21.2]
预测值: [22.7979148 21.70829974 23.17043277 13.63397276 21.85730693]
均方误差(MSE): 43.472041677202206
根均方误差(RMSE): 6.593333123481795
平均绝对值误差(MAE): 4.212526305455822
训练集R^2: 0.48752067939343646
测试集R^2: 0.46790005431367815
5、多元线性回归
- 当具有多个自变量时,称为多元线性回归。
以波士顿房价数据集为例,预测所有影响因素和MEDV(房屋的平均价格)的关系:
x, y = boston.data, boston.target # 所有影响因素作为x,房屋均价作为y
# 划分训练集和测试集,测试集大小 test_size,随机种子 random_state,用来产生相同的随机数序列
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=0)
lr = LinearRegression() # 实例化用于线性回归的类
lr.fit(x_train, y_train) # 使用训练集数据,训练模型
print("模型权重:", lr.coef_)
print("截距:", lr.intercept_)
y_hat = lr.predict(x_test)
print("实际值:", y_test[:5])
print("预测值:", y_hat[:5])
print("均方误差(MSE):", mean_squared_error(y_test, y_hat))
print("根均方误差(RMSE):", np.sqrt(mean_squared_error(y_test, y_hat)))
print("平均绝对值误差(MAE):", mean_absolute_error(y_test, y_hat))
print("训练集R^2:",lr.score(x_train, y_train))
print("测试集R^2:",lr.score(x_test, y_test))
对于以上例子,结果为:
模型权重: [-1.17735289e-01 4.40174969e-02 -5.76814314e-03 2.39341594e+00
-1.55894211e+01 3.76896770e+00 -7.03517828e-03 -1.43495641e+00
2.40081086e-01 -1.12972810e-02 -9.85546732e-01 8.44443453e-03
-4.99116797e-01]
截距: 36.933255457118925
实际值: [22.6 50. 23. 8.3 21.2]
预测值: [24.95233283 23.61699724 29.20588553 11.96070515 21.33362042]
均方误差(MSE): 29.78224509230234
根均方误差(RMSE): 5.457311159564052
平均绝对值误差(MAE): 3.668330148135715
训练集R^2: 0.7697699488741149
测试集R^2: 0.6354638433202132
从以上简单线性回归和多元线性回归的例子可以看出:
- 求解简单线性回归和多元线性回归的方法是相同的,区别只是数据不一样(多元线性回归具有多个因变量)。
- 对于波士顿房价数据集来说,综合所有因素对只根据单个因素进行预测效果更好。
上一篇: 熬夜这个问题太严重了,直接导致火葬
下一篇: # 向服务器上传图片