网站备案信息管理,呼图壁网站建设,wordpress 仿站vip,wordpress 文章排序插件目录
初识线性回归
损失和优化
欠拟合与过拟合
正则化线性模型
模型的保存与加载 初识线性回归
线性回归(Linearregression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。特点是#xff1a;有一个自变量的情况称为单…目录
初识线性回归
损失和优化
欠拟合与过拟合
正则化线性模型
模型的保存与加载 初识线性回归
线性回归(Linearregression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。特点是有一个自变量的情况称为单变量回归多于一个自变量情况的叫做多元回归。以下是其通用公式的介绍 线性回归如果用矩阵进行举例的话可以看如下方式 比如我们想计算期末成绩我们可以通过 0.7*考试成绩 0.3*平时成绩 进行通过特征值与目标值建立一个关系这种关系可以理解为线性模型。
线性回归的特征线性回归当中主要有两种模型一种是线性关系另一种是非线性关系。在这里我们只能画一个平面更好去理解所以都用单个特征或两个特征举例子。 单变量线性关系 多变量线性关系 非线性关系 通过下面这段代码使用了sklearn库中的 LinearRegression 类来进行线性回归模型的训练和预测。
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.3, 87.6, 79.4, 93.5]# 模型训练
estimator LinearRegression() # 实例化一个估计器
estimator.fit(x, y) # 使用fit方法进行训练# 打印对应的系数
print(线性回归的系数是: \n, estimator.coef_)
# 打印的预测结果是
print(输出的预测结果是: \n, estimator.predict([[100, 80]]))
在这段代码中首先我们定义了输入特征 x 和对应的目标值 y。然后我们实例化了一个 LinearRegression 对象作为线性回归模型的估计器。接下来通过调用 fit 方法我们使用输入特征 x 和目标值 y 对模型进行训练。在训练完成后我们可以使用 coef_ 属性打印出模型的系数即特征的权重。最后我们使用 predict 方法对新的输入数据 [[100, 80]] 进行预测并打印出预测结果。 损失和优化
在线性回归中我们使用损失函数和优化算法来训练模型并找到最佳的参数。
损失函数损失函数用于度量模型预测值与实际目标值之间的差异。在线性回归中最常用的损失函数是均方误差Mean Squared ErrorMSE。均方误差计算了预测值与实际值之间的平方差并求取平均值。公式如下 1yi为第i个训练样本的真实值 2h(xi)为第i个训练样本特征值组合预测函数 如何去减少这个损失使我们预测的更加准确些既然存在了这个损失我们一直说机器学习有自动学习的功能在线性回归这里更是能够体现。这里可以通过一些优化方法去优化其实是数学当中的求导功能回归的总损失
优化算法优化算法用于调整模型的参数使得损失函数最小化。在线性回归中最常用的两种优化算法是正规方程、梯度下降法。接下来对这两种优化算法作一个简单的介绍
正规方程一种通过解析方法来求解最优参数的方法。具体来说正规方程是通过对损失函数进行求导并令导数为0得到最优参数的解析表达式。以下是其使用公式 理解x为特征值矩阵y为目标值矩阵。直接求到最好的结果 缺点当特征过多过复杂时求解速度太慢并且得不到结果 接下来以正规方程求解进行举例 关于正规方程的推导可以参考以下的推导公式 接下来对所得结果进行求导 接下来通过下面这段代码实现了一个简单的线性回归模型来预测手写数字数据集中的目标值。下面是对每个步骤的解释
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_errordef liner_model():# 获取数据digits load_digits()# 数据基本处理x_train, x_test, y_train, y_test train_test_split(digits.data, digits.target, test_size0.2) # 分割数据# 特征过程——标准化transfer StandardScaler()transfer.fit_transform(x_train)x_test transfer.fit_transform(x_test)# 线性回归——正规方程estimator LinearRegression()estimator.fit(x_train, y_train)print(这个模型的偏置是: \n, estimator.intercept_)print(这个模型的系数是: \n, estimator.coef_)# 模型评估y_pre estimator.predict(x_test)print(预测值是: \n, y_pre)ret mean_squared_error(y_test, y_pre)print(均方误差: \n, ret)liner_model()
通过线性回归模型对手写数字数据集进行了拟合和预测并计算了均方误差作为模型评估指标。 梯度下降法用于求解线性回归等机器学习模型的参数。其基本思想是通过迭代的方式根据损失函数关于参数的梯度方向进行更新直到达到最小化损失函数的参数值。 假设这样一个场景 一个人被困在山上需要从山上下来(i.e.找到山的最低点也就是山谷)。但此时山上的浓雾很大导致可视度很低。 因此下山的路径就无法确定他必须利用自己周围的信息去找到下山的路径。这个时候他就可以利用梯度下降算法来帮助自己下山。 具体来说就是以他当前的所处的位置为基准寻找这个位置最陡峭的地方然后朝着山的高度下降的地方走同理如果我们的目标是上山也就是爬到山顶那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离都反复采用同一个方法最后就能成功的抵达山谷。 梯度下降的基本过程就和下山的场景很类似。 首先我们有一个可微分的函数。这个函数就代表着一座山。 我们的目标就是找到这个函数的最小值也就是山底。 根据之前的场景假设最快的下山的方式就是找到当前位置最陡峭的方向然后沿着此方向向下走对应到函数中就是找到给定点的梯度然后朝着梯度相反的方向就能让函数值下降的最快因为梯度的方向就是函数值变化最快的方向。所以我们重复利用这个方法反复求取梯度最后就能到达局部的最小值这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向也就是场景中测量方向的手段。 梯度的概念 梯度是微积分中一个很重要的概念。 在单变量的函数中梯度其实就是函数的微分代表着函数在某个给定点的切线的斜率。 在多变量函数中梯度是一个向量向量有方向梯度的方向就指出了函数在给定点的上升最快的方向。 这也就说明了为什么我们需要千方百计的求取梯度我们需要到达山底就需要在每一步观测到此时最陡峭的地方梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向那梯度的反方向就是函数在给定点下降最快的方向这正是我们所需要的。所以我们只要沿着梯度的反方向一直走就能走到局部的最低点 接下来我们对单变量函数的梯度下降进行举例 如图经过四次的运算也就是走了四步基本就抵达了函数的最低点也就是山底 接下来我们对多变量函数的梯度下降进行举例 我们发现已经基本靠近函数的最小值点 梯度下降公式 a在梯度下降算法中被称作为学习率或者步长意味着我们可以通过a来控制每一步走的距离以保证不要步子跨的太大扯着蛋哈哈其实就是不要走太快错过了最低点。同时也要保证不要走的太慢导致太阳下山了还没有走到山下。所以a的选择在梯度下降法中往往是很重要的a不能太大也不能太小太小的话可能导致迟迟走不到最低点太大的话会导致错过最低点 梯度前加一个负号就意味着朝着梯度相反的方向前进我们在前文提到梯度的方向实际就是函数在此点上升最快的方向而我们需要朝着下降最快的方向走自然就是负的梯度的方向所以此处需要加上负号。我们通过两个图更好理解梯度下降的过程 接下来通过下面这段代码实现了一个使用随机梯度下降SGD算法进行线性回归的模型并对手写数字数据集进行预测和评估
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_errordef liner_model():# 获取数据digits load_digits()# 数据基本处理x_train, x_test, y_train, y_test train_test_split(digits.data, digits.target, test_size0.2) # 分割数据# 特征过程——标准化transfer StandardScaler()transfer.fit_transform(x_train)x_test transfer.fit_transform(x_test)# 线性回归——梯度下降estimator SGDRegressor()estimator.fit(x_train, y_train)print(这个模型的偏置是: \n, estimator.intercept_)print(这个模型的系数是: \n, estimator.coef_)# 模型评估y_pre estimator.predict(x_test)print(预测值是: \n, y_pre)ret mean_squared_error(y_test, y_pre)print(均方误差: \n, ret)liner_model()
这段代码通过随机梯度下降算法对手写数字数据集进行了线性回归的拟合和预测并计算了均方误差作为模型评估指标 梯度下降和正规方程的对比
梯度下降正规方程需要选择学习率不需要需要迭代求解一次运算得出特征数量较大可以使用需要计算方程时间复杂度高O(n3)
欠拟合与过拟合
欠拟合一个假设在训练数据上不能获得更好的拟合并且在测试数据集上也不能很好地拟合数据此时认为这个假设出现了欠拟合的现象。(模型过于简单)
过拟合一个假设在训练数据上能够获得比其他假设更好的拟合但是在测试数据集上却不能很好地拟合数据此时认为这个假设出现了过拟合的现象。 (模型过于复杂) 欠拟合与过拟合的原因及解决办法 在解决回归过拟合中我们选择正则化。但是对于其他机器学习算法如分类算法来说也会出现这样的问题除了一些算法本身作用之外决策树、神经网络我们更多的也是去自己做特征选择包括之前说的删除、合并一些特征 在学习的时候数据提供的特征有些影响模型复杂度或者这个特征的数据点异常较多所以算法在学习的时候尽量减少这个特征的影响甚至删除某个特征的影响这就是正则化。
正则化线性模型
正则化线性模型是一种通过在损失函数中添加正则化项L1、L2 或它们的组合来减少过拟合的线性模型。正则化项在优化过程中对模型的系数进行惩罚并使得模型更加倾向于选择较小的系数。这样做可以避免模型过度拟合训练数据从而提高模型在测试集上的泛化能力。
常见的正则化线性模型有 Lasso RegressionL1 正则化 在损失函数中添加 L1 正则化项。当系数趋近于零时Lasso Regression 可以自动地将某些系数设为零从而实现特征筛选的作用。 Ridge RegressionL2 正则化 在损失函数中添加 L2 正则化项。Ridge Regression 可以将所有系数缩小到接近于零的水平但不会将任何系数设为零。 Elastic Net RegressionL1 和 L2 的混合正则化 在损失函数中同时添加 L1 和 L2 正则化项。Elastic Net Regression 综合了 L1 和 L2 正则化的优点既可以进行特征筛选又可以缩小所有系数。 Lasso Regression(Lasso 回归)Lasso回归是线性回归的另一种正则化版本正则项为权值向量的1范数 Ridge Regression(岭回归)岭回归是线性回归的正则化版本即在原来的线性回归的costfunction中添加正则项regularizationterm) 以达到在拟合数据的同时使模型权重尽可能小的目的岭回归代价函数 接下来通过下面这段代码实现了一个使用岭回归Ridge Regression进行线性回归任务的模型并对手写数字数据集进行预测和评估
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import RidgeCV, Ridge
from sklearn.metrics import mean_squared_errordef liner_model():# 获取数据digits load_digits()# 数据基本处理x_train, x_test, y_train, y_test train_test_split(digits.data, digits.target, test_size0.2) # 分割数据# 特征过程——标准化transfer StandardScaler()transfer.fit_transform(x_train)x_test transfer.fit_transform(x_test)# 线性回归——岭回归# estimator Ridge(alpha1.0)estimator RidgeCV(alphas(0.001, 0.01, 0.1, 1, 10, 100))estimator.fit(x_train, y_train)print(这个模型的偏置是: \n, estimator.intercept_)print(这个模型的系数是: \n, estimator.coef_)# 模型评估y_pre estimator.predict(x_test)print(预测值是: \n, y_pre)ret mean_squared_error(y_test, y_pre)print(均方误差: \n, ret)liner_model()
这段代码通过岭回归模型对手写数字数据集进行了线性回归的拟合和预测并计算了均方误差作为模型评估指标。其中岭回归通过正则化项控制模型的复杂度防止过拟合。 Elastic Net Regression(弹性网络) 模型的保存与加载
在机器学习中模型的保存是指将训练好的机器学习模型以某种格式保存到磁盘上以便于后续的部署和使用。模型的加载则是指将保存在磁盘上的模型读取到内存中以便于对新数据进行预测或者进一步的修改和训练。
模型的保存和加载可以提高开发效率并减少重复训练模型的时间。训练机器学习模型往往需要耗费大量的时间和计算资源而如果每次需要使用该模型都重新训练一遍就会非常低效。因此将训练好的模型保存到磁盘上在需要使用时直接加载到内存中可以极大地提高开发效率。此外保存和加载模型还可以提高模型的可移植性使得训练好的模型可以轻松地在不同的环境中部署和使用。
模型的保存我们在进行模型训练完之后如果想将模型进行保存导入joblib然后调用dump传入相应模型以及保存路径即可保存 打开我们保存好的模型可见是一堆乱码 模型的加载如果要加载模型这里我们可以不需要再进行模型的训练直接引入我们加载好的模型进行使用即可 最终也能得到相应的结果