如何在Python中编程线性回归模型
这篇文章主要讲解了“如何在Python中编程线性回归模型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何在Python中编程线性回归模型”吧!
为江北等地区用户提供了全套网页设计制作服务,及江北网站建设行业解决方案。主营业务为成都网站设计、做网站、江北网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
可解释性是机器学习中最大的挑战之一。如果一个模型的决策更容易让人理解,那么它的解释性就会比另一个模型高。有些模型是如此复杂,并且内部结构如此复杂,以至于几乎无法理解它们是如何达到最终结果的。这些黑匣子似乎打破了原始数据和最终输出之间的关联,因为它们之间发生了多个过程。
但是在机器学习算法领域,某些模型比其他模型更透明。 决策树 绝对是其中之一,而线性回归模型又是其中之一。它们的简单和直接的方法使它们成为解决不同问题的理想工具。让我们看看如何。
您可以使用线性回归模型来分析给定地点的薪水如何取决于经验,学历,职位,所工作的城市等特征。同样,您可以分析房地产价格是否取决于面积,卧室数量或距市中心的距离等因素。
简单线性回归(SLR)
当输出变量(目标)只有一个输入变量(预测变量)时,这是最简单的线性回归形式:
输入 或 预测变量 是变量,可帮助预测输出变量的值。它通常被称为 X。
输出 或 目标变量 是我们要预测的变量。通常称为 y。
β0的值( 也称为截距)显示估算的回归线与y 轴交叉的点 ,而β1 的值 确定 估算的回归线的斜率。的 随机误差 描述因变量和自变量(该模型的扰动,部分之间的线性关系的随机分量 ÿ 该 X 无法解释)。真正的回归模型通常是未知的(因为我们无法捕获影响因变量的所有影响),因此与观察到的数据点相对应的随机误差项的值仍然未知。但是,可以通过为观察到的数据集计算模型的参数来估计回归模型。
回归背后的想法是 从样本中估计参数 β0 和 β1。如果我们能够确定这两个参数的最佳值,则在给定X的值的情况下,我们将具有 最佳拟合线, 可用于预测 y的值 。换句话说,我们尝试拟合一条线以观察输入变量和输出变量之间的关系,然后进一步使用它来预测未见输入的输出。
我们如何估计 β0 和 β1?我们可以使用一种称为 普通最小二乘(OLS)的方法。 这样做的目的是使黑点到红线的距离尽可能接近零,这是通过最小化实际结果与预测结果之间的平方差来实现的。
实际值和预测值之间的差异称为 残差(e) ,取决于模型是高估还是低估了结果,可以是负值或正值。因此,为了计算净误差,直接将所有残差相加会导致项的抵消和净效应的减小。为了避免这种情况,我们采用这些误差项的平方和,称为 残差平方和(RSS)。
普通最小二乘法(OLS)方法最小化的平方的总和残留,其目的在于以适合的回归直线,将最小化来自观测值的距离(以二次值测量)到预测者(回归线)。
多元线性回归(MLR)
是 存在两个或多个预测变量或输入变量时使用的线性回归形式。与之前描述的SLR模型类似,它包含其他预测变量:
注意,该方程只是简单线性回归方程的一种扩展,其中每个输入/预测变量都有其对应的斜率系数 (β )。第一个 β 项 (β0) 是截距常数,是 在没有所有预测变量的情况下(即,当所有 X 项均为0时)的y值 。
随着功能部件数量的增加,我们模型的复杂性也随之增加,并且更加难以可视化甚至理解我们的数据。由于与SLR相比,这些模型中的参数更多,因此需要更多注意。与他们一起工作时。添加更多术语会从本质上改善数据的拟合度,但是新术语可能没有任何实际意义。这很危险,因为它可能会导致模型适合该数据,但实际上并不意味着有用。
一个例子
广告数据集包括产品在200个不同市场中的销售以及三种不同媒体(电视,广播和报纸)的广告预算。我们将使用数据集根据电视,广播和报纸的广告预算(自变量)来预测销售量(自变量)。
在数学上,我们将尝试解决的公式是:
通过最小化误差函数并拟合最佳直线或超平面(取决于输入变量的数量),回归模型可以找到这些常数(β)的值 。让我们编码。
加载数据并描述数据集
在加载数据之前,我们将导入必要的库:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn import metrics from sklearn.metrics import r2_score import statsmodels.api as sm
现在我们加载数据集:
df = pd.read_csv(“Advertising.csv”)
让我们了解数据集并对其进行描述:
df.head()
由于不需要它,我们将删除第一列(“未命名”):
df = df.drop([‘Unnamed: 0’], axis=1) df.info()
现在,我们的数据集包含4列(包括目标变量“ sales”),200个寄存器,并且没有缺失值。让我们可视化自变量和目标变量之间的关系。
sns.pairplot(df)
电视与销售之间的关系似乎很牢固,虽然广播与销售之间似乎存在某种趋势,但报纸与销售之间的关系似乎不存在。我们也可以通过相关图来数值验证:
mask = np.tril(df.corr()) sns.heatmap(df.corr(), fmt=’.1g’, annot=True, cmap= ‘cool’, mask=mask)
正如我们预期的那样,最强的正相关关系发生在销售和电视之间,而销售和报纸之间的关系则接近于0。
选择特征和目标变量
接下来,我们将变量分为两组:因变量(或目标变量“ y”)和独立变量(或特征变量“ X”)
X = df.drop([‘sales’], axis=1) y = df[‘sales’]
分割数据集
为了了解模型的性能,将数据集分为训练集和测试集是一个很好的策略。通过将数据集分为两个单独的集合,我们可以使用一个集合进行训练,而使用另一集合中的看不见的数据来测试模型的性能。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
我们将数据集分为70%训练和30%测试。random_state参数用于初始化内部随机数生成器,它将根据您的情况决定将数据拆分为训练索引和测试索引。我将随机状态设置为0,以便您可以使用同一参数在多个代码运行中比较输出。
print(X_train.shape,y_train.shape,X_test.shape,y_test.shape)
通过打印分割集的形状,我们看到我们创建了:
2个数据集,每个140个寄存器(占总寄存器的70%),一个包含3个独立变量,一个仅包含目标变量的数据集,将用于 训练 和生成线性回归模型。
2个数据集,每个数据集60个寄存器(占总寄存器的30%),一个数据集包含3个独立变量,一个仅包含目标变量,这些数据集将用于 测试 线性回归模型的性能。
建立模型
建立模型非常简单:
mlr = LinearRegression()
训练模型
使模型适合训练数据代表了建模过程中的训练部分。训练后,可以使用预测方法调用该模型来进行预测:
mlr.fit(X_train, y_train)coeff_df = pd.DataFrame(mlr.coef_, X.columns, columns =[‘Coefficient’]) coeff_df
让我们看一下训练后模型的输出,并看一下β0的值 (截距):
mlr.intercept_
我们还可以打印系数(β)的值 :
coeff_df = pd.DataFrame(mlr.coef_, X.columns, columns =[‘Coefficient’]) coeff_df
这样,我们现在可以根据电视,广播和报纸的不同预算值来估算“销售”的价值:
例如,如果我们确定电视的预算值为50,广播的预算值为30,报纸的预算值为10,则“销售”的估算值将为:
example = [50, 30, 10] output = mlr.intercept_ + sum(example*mlr.coef_) output
测试模型
测试数据集是独立于训练数据集的数据集。该测试数据集是您模型的看不见的数据集,有助于您更好地了解其概括能力:
y_pred = mlr.predict(X_test)
评估表现
模型的质量与预测与测试数据集的实际值的匹配程度有关:
print(‘Mean Absolute Error:’, metrics.mean_absolute_error(y_test, y_pred)) print(‘Mean Squared Error:’, metrics.mean_squared_error(y_test, y_pred)) print(‘Root Mean Squared Error:’, np.sqrt(metrics.mean_squared_error(y_test, y_pred))) print(‘R Squared Score is:’, r2_score(y_test, y_pred))
在根据测试集验证我们的模型后,我们得到的R²为0.86,这似乎是相当不错的性能得分。但是,尽管较高的R²表示更适合该模型,但并非总是如此。我们将在下面看到一些解释和改进回归模型的方法。
如何解释和改善您的模型?
好的,我们创建了模型,现在呢?让我们看一下训练数据上的模型统计信息,以获得一些答案:
X2 = sm.add_constant(X_train) model_stats = sm.OLS(y_train.values.reshape(-1,1), X2).fit() model_stats.summary()
下面让我们看看这些数字的含义。
假设检验
运行MLR模型时,您应该回答的基本问题之一是, 至少有一个预测变量对预测输出有用。如果自变量和目标之间的关系仅仅是偶然的,并且由于任何预测因素而对销售没有实际影响,该怎么办?
我们需要执行假设检验来回答这个问题并检查我们的假设。这一切都始于形成一个 零假设(H0),该假设指出所有系数都等于零,并且预测变量和目标变量之间没有关系(这意味着没有自变量的模型既适合数据又适合您的模型):
另一方面,我们需要定义 替代假设(Ha),该假设指出至少一个系数不为零,并且预测变量和目标之间存在关系(这意味着模型比截距更适合数据仅限型号):
如果我们想拒绝零假设并对我们的回归模型有信心,我们需要找到有力的统计证据。为此,我们执行假设检验,为此我们使用 F统计量。
如果F统计量的值等于或非常接近1,则结果支持零假设,我们无法拒绝它。
正如我们在上表中看到的(以黄色标记),F统计量为439.9,因此有力地证明了零假设(所有系数均为零)。接下来,我们还需要 在原假设为真(8.76e-70)(小于1%的极小的数字)的假设下,检查 F统计量(也用黄色标记)的发生概率。这意味着在有效的Null假设的假设下,偶然发生F统计量439.9的可能性要小于1%。
话虽如此,我们可以否定零假设,并相信至少有一个预测变量可用于预测输出。
产生模型
运行包含许多不相关变量的线性回归模型将导致不必要的复杂模型。哪些预测指标很重要?它们对我们的模型都重要吗?为了找出答案,我们需要执行一个称为功能选择的过程 。 特征选择的2种主要方法是:
正向选择: 从与变量相关性最高的预测变量开始,一次添加一个预测变量。然后,将具有更大理论重要性的变量顺序合并到模型中,直到达到停止规则为止。
向后消除: 从模型中的所有变量开始,然后删除统计上意义最小的变量(较大的p值),直到达到停止规则为止。
尽管两种方法都可以使用,但是除非预测变量的数量大于样本大小(或事件的数量),否则通常首选使用向后消除方法。
假设条件
由于线性回归模型是任何事件的长期序列的近似,因此它们需要对它们表示的数据进行一些假设才能保持适当。大多数统计检验都依赖于有关分析中使用的变量的某些假设,如果不满足这些假设,则结果可能不可信(例如,导致I型或II型错误)。
从输出是输入变量的线性组合的意义上讲,线性回归模型是线性的,并且仅适用于对线性可分离数据进行建模。线性回归模型在各种假设下工作,这些假设必须存在才能产生适当的估计,而不仅仅是依赖于准确性得分:
线性:特征与目标之间的关系必须是线性的。检查线性关系的一种方法是目视检查散点图的线性。如果散点图中显示的关系不是线性的,那么我们需要运行非线性回归或转换数据。
均方差:对于任何x值,残差的方差必须相同。多元线性回归假设残差的误差量在线性模型的每个点都相似。这种情况称为同调。散点图是检查数据是否为同方差的好方法,并且还存在一些测试以数值验证该假设(例如,Goldfeld-Quandt,Breusch-Pagan,White)
无多重共线性: 数据不应显示多重共线性,当自变量(解释变量)彼此高度相关时,就会发生多重共线性。如果发生这种情况,将很难找出导致因变量/目标变量差异的特定变量。可以使用方差膨胀因子(VIF)方法或通过相关矩阵来检验此假设。解决此问题的替代方法可能是将数据居中(扣除平均得分),或进行因子分析并旋转因子以确保线性回归分析中因子的独立性。
无自相关:残差的值应彼此独立。残差中存在相关性会大大降低模型的准确性。如果误差项相关,则估计的标准误差往往会低估真实的标准误差。要测试此假设,可以使用Durbin-Watson统计信息。
残差的正态性:残差必须正态分布。可以使用拟合优度检验(例如Kolmogorov-Smirnov或Shapiro-Wilk检验)来检查正态性,如果数据不是正态分布的,则非线性转换(例如对数转换)可以解决此问题。
假设是至关重要的,因为如果假设无效,那么分析过程将被认为是不可靠,不可预测且不受控制的。不符合这些假设会导致得出无效的结论或数据在科学上没有依据。
最后的想法
尽管MLR模型扩展了SLR模型的范围,但它们仍然是线性模型,这意味着模型中包含的术语无法显示彼此之间的任何非线性关系或表示任何种类的非线性趋势。在预测要素的观察范围之外的点时也应小心,因为变量之间的关系可能会随着您移出观察范围而改变(这是您没有数据的原因而无法知道的事实)。
观察到的关系可能是局部线性的,但是在数据的外部范围上可能存在未观察到的非线性关系。
线性模型还可以 通过包含非线性变量(例如多项式)和变换指数函数来对曲率建模。线性回归方程的参数是 线性的 ,这意味着您可以通过指数增加自变量以拟合曲线,但仍保留在“线性世界”中。线性回归模型可以包含对数项和逆项,以遵循不同类型的曲线,但参数仍保持线性。
尽管自变量是平方的,但是模型的参数仍然是线性的
诸如多项式回归之类的 回归 可以对非线性关系进行建模 ,而线性方程式具有一种基本形式,而非线性方程式可以采用许多不同形式。您可能会考虑使用 非线性回归模型的原因 是,尽管线性回归可以对曲线进行建模,但它可能无法对数据中存在的特定曲线进行建模。
您还应该知道,OLS并不是拟合线性回归模型的唯一方法,而其他优化方法(如 Gradient Descent) 更适合于大型数据集。将OLS应用于复杂和非线性算法可能无法扩展,并且Gradient Descent在计算上可能更便宜(更快)以找到解决方案。 梯度下降(Gradient Descent)是一种使函数最小化的算法,并且在给定由一组参数定义的函数的情况下,该算法从一组初始参数值开始,然后逐步向一组参数值最小化该函数。这个 迭代最小化 是使用衍生物来实现,以在功能梯度的负方向的步骤。
使用梯度下降的线性回归
要考虑的另一项关键是, 离群值会对回归线和相关系数产生巨大影响 。为了识别它们,执行 探索性数据分析(EDA),检查数据以检测异常观察非常重要,因为它们会以极大的方式影响我们的分析和统计建模的结果。如果您识别出任何异常,则可以对异常值进行估算(例如,使用均值/中位数/众数),设置上限(替换超出某些限制的那些值)或替换为缺失值并进行预测。
最后,线性回归模型的一些 局限性 是:
省略的变量。必须有一个良好的理论模型来提出解释因变量的变量。在简单的二变量回归的情况下,必须考虑可能解释因变量的其他因素,因为可能会有其他“未观察到的”变量解释输出。
反向因果关系。许多理论模型都预测双向因果关系-即因变量可能导致一个或多个解释变量发生变化。例如,更高的收入可能使人们能够对自己的教育进行更多的投资,从而增加了他们的收入。这使估计回归的方式变得复杂,需要特殊的技术。
测量错误。可能会错误地评估因素。例如,能力很难测量,并且智商测试存在众所周知的问题。结果,使用智商的回归可能无法适当地控制才能,导致教育和收入等变量之间的关系不准确或有偏见。
焦点太有限了。回归系数仅提供有关一个变量中的微小变化(而不是大变化)与另一变量中的变化之间的关系的信息。它会显示出教育的微小变化可能会如何影响收入,但不会使研究人员对较大变化的影响进行概括。如果每个人都同时接受大学教育,那么刚毕业的大学毕业生就不太可能赚更多的钱,因为大学毕业生的总供应量将大大增加。
感谢各位的阅读,以上就是“如何在Python中编程线性回归模型”的内容了,经过本文的学习后,相信大家对如何在Python中编程线性回归模型这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
当前名称:如何在Python中编程线性回归模型
文章出自:http://ybzwz.com/article/gdsieo.html