线性回归应用场景
-
房价预测,通过分析房地产市场的历史数据,如房屋大小、位置、建造年份等因素,线性回归可以帮助预测未来房价的走势。
-
销售额预测,企业可以利用线性回归模型来预测产品的销售额,这通常涉及到产品价格、市场营销预算、季节性因素等变量的分析。
-
贷款额度预测,金融机构可以使用线性回归来评估客户的信用风险,并据此决定贷款额度。
线性回归(Linear regression)
线性回归是一种利用直线方程对变量之间关系进行建模的回归分析方法。
- 定义:线性回归分析用于研究两个或多个变量之间的关系,其中一个是自变量,另一个是因变量。在这种方法中,目标是找到一个线性方程,即一个直线,该直线能够尽可能好地预测因变量基于自变量的值。
- 公式:线性回归模型通常表示为 ( y = wx + b ),其中 ( y ) 是因变量,( x ) 是自变量,( w ) 是权重(斜率),而 ( b ) 是偏差(截距)。这个方程描述了自变量和因变量之间的直线关系。
- 最小二乘法:为了找到最佳的 ( w ) 和 ( b ) 值,通常采用最小二乘法。该方法通过最小化实际数据点和回归线之间的平方差来求解这些参数。
- 期末成绩:0.7×考试成绩+0.3×平时成绩
特征值与目标值之间建立了一个关系,这个关系可以理解为线性模型 。
sklearn中, 线性回归的API在linear_model模块中
sklearn.linear_model.LinearRegression()
- LinearRegression.coef_:回归系数
代码
from sklearn.linear_model import LinearRegression
x = [[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]]
y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]
estimator = LinearRegression()
estimator.fit(x,y)
print(estimator.coef_)
estimator.predict([[100, 80]])
通过sklearn.linear_model.LinearRegression
类创建一个线性回归模型实例。这个类有许多参数可以设置,如fit_intercept
(是否计算模型的截距)和normalize
(是否对数据进行标准化处理)等。
- 训练模型:使用训练集数据调用模型的
fit
方法来训练模型。 - 进行预测:训练好模型后,使用
predict
方法对测试集或新数据进行预测。 - 评估模型:常用的评估指标包括均方误差(MSE)、决定系数(R²)等。这些指标可以帮助我们了解模型的预测性能和数据拟合程度。
损失函数
用来衡量机器学习模型性能的函数,损失函数可以计算预测值与真实值之间的误差(用一个实数来表示),误差越小说明模型性能越好。
- 误差的大小是坐标系中两点之间的距离,将真实值与预测值相减得到误差。
但是用来衡量回归损失的时候, 不能简单的将每个点的预测误差相加。
平方损失
回归问题的损失函数
- yi 为第i个训练样本的真实值
- h(xi) 为第i个训练样本特征值组合预测函数又称最小二乘法
import numpy as np
from sklearn.linear_model import LinearRegression
if __name__ == '__main__':
x = np.mat([[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]])
# 目标值
y = np.mat([84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]).transpose()
ones_array = np.ones([len(x), 1])
x = np.hstack([ones_array, x])
w = (x.transpose() * x) ** -1 * x.transpose() * y
print('[%.1f %.1f %.1f]' % (w[0][0], w[1][0], w[2][0]))
# 使用 LinearRegression
estimator = LinearRegression(fit_intercept=True)
estimator.fit(x, y)
print(estimator.coef_[0])
# 输出结果
# [0.0 0.3 0.7]
# [0. 0.3 0.7]
梯度下降法
梯度下降法的基本概念是在一个多维空间内,通过迭代的方式逐步逼近最小值点。在每一步迭代中,都沿着当前点的梯度(即损失函数在该点的导数)方向移动一定的步长,以此来减小损失函数的值。这个过程类似于一个人在山上寻找下山的路,每次都选择当前位置最陡峭的方向向下走一步,最终会到达山底。
在机器学习中,特别是在线性回归模型中,梯度下降法通常用来最小化预测值与实际值之间的差距,这个差距通过损失函数来量化。线性回归模型的预测公式可以表示为 y = θ0 + θ1x1 + θ2x2 +... + θnxn,其中 θj 是模型参数,包括偏置项 θ0 和特征权重 θ1, θ2,..., θn。梯度下降法通过迭代更新这些参数,使得损失函数最小化。
全梯度下降算法(FGD)
每次迭代时, 使用全部样本的梯度值,计算训练集所有样本误差,对其求和再取平均值作为目标函数。权重向量沿其梯度相反的方向移动,从而使当前目标函数减少得最多。与随机梯度下降(SGD)和小批量梯度下降(MBGD)不同,FGD在每次迭代时使用整个数据集来计算梯度。
在实际应用中,FGD通常用于模型训练的优化过程。具体步骤包括初始化模型参数、计算损失函数的梯度、更新参数以及重复迭代直到满足停止条件(如梯度趋近于零、达到预设的迭代次数或损失函数变化小于某个阈值)。由于FGD在每次迭代中使用整个数据集,因此它通常能够更准确地逼近全局最小值,但也因为如此,它的计算成本相对较高,尤其在大数据集上运行时可能会非常缓慢。
随机梯度下降算法(SGD)
随机梯度下降(SGD)是机器学习和深度学习中常用的一种优化算法,它的核心在于通过随机选择数据点来计算梯度,并更新模型参数。这种方法特别适用于大规模数据集,因为它可以在不需要遍历整个数据集的情况下进行模型的迭代更新。
from sklearn.linear_model import SGDRegressor
随机平均梯度下降算法(SAG)
随机平均梯度下降(SAG)是一种改进型的随机梯度下降算法,目的是提高收敛速度并减少方差。
- 每次迭代时, 随机选择一个样本的梯度值和以往样本的梯度值的均值
回归问题评估
平均绝对误差
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test,y_predict)
均方误差
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test,y_predict)
均方根误差
-
RMSE 越小模型预测约准确
-
RMSE 是 MSE 的平方根。某些情况下比MES更有用,由于 MAE 和 RMSE 都是误差的一次方,可以将它们相互比较
案例:波士顿房价预测
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import SGDRegressor
from sklearn.linear_model import LinearRegression
def linear_model1():
data = load_boston()
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)
# 特征工程-标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 机器学习-线性回归(正规方程)
estimator = LinearRegression()
estimator.fit(x_train, y_train)
# 模型评估
y_predict = estimator.predict(x_test)
print("预测值为:\n", y_predict)
print("模型中的系数为:\n", estimator.coef_)
print("模型中的偏置为:\n", estimator.intercept_)
# 均方误差
error = mean_squared_error(y_test, y_predict)
print("误差为:\n", error)
return None
使用SGDRegressor
类进行线性回归训练的过程:
- 创建模型实例:通过
SGDRegressor(max_iter=1000)
创建一个随机平均梯度下降回归模型的实例。这里的max_iter=1000
表示模型在训练时最多进行1000次迭代。 - 拟合数据:
estimator.fit(x_train, y_train)
这一行代码的作用是用训练数据集x_train
(特征)和y_train
(标签)来训练模型。在这个过程中,模型会尝试学习数据之间的关系,以便能够对新的数据进行预测。 - 优化过程:
SGDRegressor
使用随机梯度下降算法来优化平方损失函数,这是线性回归常用的损失函数。通过最小化损失函数,模型可以学习到最佳的权重系数和偏置项,从而得到一个能够较好地预测未知数据的线性模型。 - 模型评估:在模型训练完成后,通常会使用测试数据集
x_test
来评估模型的性能。通过调用estimator.predict(x_test)
可以获取模型对测试数据的预测值,进而可以通过比较预测值和真实值来计算模型的准确性和其他性能指标。
def linear_model2():
data = load_boston()
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)
# 特征工程-标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
estimator = SGDRegressor(max_iter=1000)
estimator.fit(x_train, y_train)
# 获取系数等值
y_predict = estimator.predict(x_test)
print("预测值为:\n", y_predict)
print("模型中的系数为:\n", estimator.coef_)
print("模型中的偏置为:\n", estimator.intercept_)
# 均方误差
error = mean_squared_error(y_test, y_predict)
print("误差为:\n", error)
return None
SGDRegressor学习率
SGDRegressor(max_iter=1000,learning_rate="constant",eta0=0.1)
eta0
参数定义了学习率的起始值。在"constant"
模式下,这个值在整个训练过程中不会改变。- 学习率的选择会影响模型的训练速度和最终性能。一个较大的学习率可能会导致快速收敛,但也可能会错过最优解;而一个较小的学习率可能需要更多的迭代次数来达到同样的精度。
- 在其他模式下,如
"invscaling"
,学习率会根据迭代次数进行调整,通常是随着迭代次数的增加而减小,这有助于模型在接近最优解时减少波动,提高收敛精度。
模型的保存和加载
sklearn模型的保存和加载API import joblib
- 保存:joblib.dump(estimator, 'test.pkl')
- 加载:estimator = joblib.load('test.pkl')
from sklearn import svm
from sklearn import datasets
from joblib import dump, load
# 加载数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target
# 训练模型
clf = svm.SVC()
clf.fit(X, y)
# 保存模型
dump(clf, 'model.joblib')
# 加载模型
clf_from_joblib = load('model.joblib')
# 使用加载的模型进行预测
print(clf_from_joblib.predict(X[0:1]))