TowardsDataScience 博客中文翻译 2016~2018(一百八十四)
线性回归-详细视图
Figure 1 : Linear Regression Graph ( Source: sphweb.bumc.bu.edu/otlt/MPH-Mo…)
线性回归用于寻找目标和一个或多个预测值之间的线性关系。有两种类型的线性回归-简单和多重。
简单线性回归
简单线性回归有助于发现两个连续变量之间的关系。一个是预测变量或自变量,另一个是响应变量或因变量。它寻找统计关系,而不是确定性关系。如果一个变量可以被另一个精确地表达,那么两个变量之间的关系就是确定的。例如,使用摄氏温度可以准确预测华氏温度。统计关系在确定两个变量之间的关系时不准确。比如身高和体重的关系。
核心思想是获得最适合数据的线。最佳拟合线是总预测误差(所有数据点)尽可能小的线。误差是点到回归线的距离。
(完整代码—https://github . com/SSaishruthi/Linear _ Regression _ Detailed _ Implementation)
实时例子
我们有一个数据集,其中包含有关“学习小时数”和“获得分数”之间关系的信息。已经观察了许多学生,记录了他们的学习时间和成绩。这将是我们的训练数据。目标是设计一个模型,如果给定学习的小时数,可以预测分数。使用训练数据,获得将给出最小误差的回归线。这个线性方程然后被用于任何新的数据。也就是说,如果我们给出学生学习的小时数作为输入,我们的模型应该以最小的误差预测他们的分数。
Y(pred) = b0 + b1*x
b0 和 b1 值的选择必须使误差最小。如果将误差平方和作为评估模型的指标,则目标是获得一条最能减少误差的直线。
Figure 2: Error Calculation
如果我们不平方误差,那么正负点就会互相抵消。
对于具有一个预测器模型,
Figure 3: Intercept Calculation
Figure 4: Co-efficient Formula
探索‘B1’
- 如果 b1 > 0,那么 x(预测值)和 y(目标值)具有正的关系。也就是 x 的增加会增加 y。
- 如果 b1 < 0, then x(predictor) and y(target) have a negative relationship. That is increase in x will decrease y.
探索‘B0’
- 如果模型不包括 x=0,那么预测将变得没有意义,只有 b0。例如,我们有一个关于身高(x)和体重(y)的数据集。取 x=0(即身高为 0),将使方程只有 b0 值,这是完全没有意义的,因为在实时身高和体重永远不会为零。这是由于考虑了超出其范围的模型值。
- 如果模型包括值 0,那么“b0”将是 x=0 时所有预测值的平均值。但是,将所有预测变量设置为零通常是不可能的。
- b0 值保证剩余具有平均值零。如果没有' b0 '项,那么回归将被强制越过原点。回归系数和预测都会有偏差。
系数从正规方程
除了上述方程外,模型的系数也可以通过标准方程计算。
Figure 5: Co-efficient calculation using Normal Equation
θ包含所有预测值的系数,包括常数项“b0”。正规方程通过对输入矩阵求逆来执行计算。计算的复杂性将随着特征数量的增加而增加。当特征的数量变大时,它变得非常慢。
下面是该等式的 python 实现。
Figure 6: Python implementation of Normal Equation
使用梯度下降优化
正规方程的复杂性使得它很难使用,这就是梯度下降法发挥作用的地方。成本函数相对于参数的偏导数可以给出最佳系数值。
(梯度下降的完整详情在https://medium . com/@ saishruthi . TN/math-behind-gradient-descent-4d 66 EB 96d 68d)
梯度下降的 Python 代码
Figure 7: Python Implementation of gradient descent
残差分析
随机性和不可预测性是回归模型的两个主要组成部分。
预测=确定性+统计
确定性部分被模型中的预测变量覆盖。随机部分揭示了预期值和观察值不可预测的事实。总会有一些信息被遗漏。这个信息可以从剩余信息中获得。
我们通过一个例子来解释一下残数的概念。考虑一下,当给定一个地方的温度时,我们有一个预测果汁销售的数据集。回归方程预测的值与实际值总会有一些差异。销售额不会与真正的产值完全相符。这种差异被称为剩余。
残差图有助于使用残差值分析模型。它绘制在预测值和残差之间。他们的价值观是标准化的。该点与 0 的距离指定了该值的预测有多差。如果该值为正值,则预测值较低。如果该值为负,则预测值为高。0 值表示完全预测。检测残差模式可以改进模型。
残差图的非随机模式表明该模型,
- 缺少对模型目标有重要贡献的变量
- 缺少捕捉非线性(使用多项式项)
- 模型中的术语之间没有交互
残留物的特征
- 残差不显示任何模式
- 相邻残差不应相同,因为它们表明系统遗漏了一些信息。
剩余实现和情节
Figure 8: Residual Plot
(其他一些参考资料— 1 ) & ( 参考资料— 2)
模型评估指标
R 平方值
该值的范围从 0 到 1。值“1”表示预测器完全考虑了 y 中的所有变化。值“0”表示预测器“x”没有考虑“y”中的任何变化。
1.回归平方和(SSR)
这给出了估计回归线离水平“无关系”线(实际产量的平均值)有多远的信息。
Figure 9: Regression Error Formula
2.误差平方和
目标值围绕回归线变化的程度(预测值)。
Figure 10: Sum of Square Formula
3.平方和总计(SSTO)
这表明数据点围绕平均值移动了多少。
Figure 11: Total Error Formula
Python 实现
Figure 12: Python Implementation of R-Square
R 平方的取值范围是否总是在 0 到 1 之间?
如果回归线强行穿过一个点,R2 的值可能最终为负。这将导致回归线强行穿过原点(无截距),产生的误差高于水平线产生的误差。如果数据远离原点,就会出现这种情况。
(模式详情—https://medium . com/@ saishruthi . TN/is-r-sqaure-value-always-between-0-to-1-36 a8d 17807 D1)
【相关系数(r)
这与“r 平方”的值有关,可以从符号本身观察到。它的范围从-1 到 1。
r = (+/-) sqrt(r)
如果 b1 的值为负,则‘r’为负,而如果 b1 的值为正,则‘r’为正。它是无单位的。
零假设和 P 值
零假设是研究者利用以前的研究或知识提出的最初主张。
低 P 值:拒绝指示预测值与响应相关的零假设
高 P 值:预测值的变化与目标值的变化无关
获得的回归线
Figure 13: Final Regression line over test data
完整代码:https://github . com/SSaishruthi/Linear _ Regression _ Detailed _ Implementation
这是一个由材料(如吴恩达教授的课程,Siraj Raval 的视频等)编辑而成的教育帖子。)在我的旅途中帮助了我。其他参考资料在内容附近说明。
— —未完待续
从头开始线性回归
数据科学正处于巅峰,使用机器学习模型你可以做很多事情,从预测股票价格到生成著名的蒙娜丽莎的假画(哦,这应该是一个秘密)。线性回归是最容易实现的机器学习算法之一,我们将在本文中探讨这种算法。
什么是线性回归?
线性回归是一种用于定义因变量( Y )和自变量( X )之间关系的方法。简单地写为:
其中 y 为因变量, m 为比例因子或系数, b 为偏差系数, X 为自变量。偏差系数为该模型提供了额外的自由度。目标是在 X 和 Y 之间画一条最佳拟合线,估计 X 和 Y 之间的关系。
但是我们如何找到这些系数,我们可以用不同的方法找到它们。一种是普通最小二乘法方法和梯度下降方法。我们将实现普通的最小均方方法。
普通最小均方误差
之前我们讨论了估算 X 和 Y 到一条直线的关系。例如,我们获得样本输入和输出,并在 2d 图上绘制这些分散点,类似于下图:
图中看到的线是我们要完成的实际关系,我们希望最小化模型的误差。这条线是穿过大多数散点的最佳拟合线,也减少了误差,误差是从点到线本身的距离,如下图所示。
而线性模型的总误差是各点误差之和。即,
r*I =*I 点与 i 点T34 点点之间的距离。
n = 总点数。
我们将每个距离平方,因为有些点会在线上,有些点会在线下。我们可以通过最小化 r 来最小化线性模型的误差,因此我们有
其中 x 是输入变量 X 的平均值,而 y 是输出变量 Y. 的平均值
现在让我们用 python 实现这个方法(有趣的部分)。
要继续下去,你需要 python 和你那令人敬畏的自我。使用 pip 我们将安装以下依赖项
- numpy
- 熊猫
- matplotlib
我们将使用包含不同人的头部大小和大脑重量的数据集。该数据集可在本次回购中获得。
我们从导入数据集和依赖项开始
#import libraries
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pddataset = pd.read_csv('dataset.csv')
print(dataset.shape)
dataset.head()(237, 4)
让我们找出头部大小和大脑重量之间的关系。
# initializing our inputs and outputs
X = dataset['Head Size(cm^3)'].values
Y = dataset['Brain Weight(grams)'].values# mean of our inputs and outputs
x_mean = np.mean(X)
y_mean = np.mean(Y)#total number of values
n = len(X)# using the formula to calculate the b1 and b0
numerator = 0
denominator = 0
for i in range(n):
numerator += (X[i] - x_mean) * (Y[i] - y_mean)
denominator += (X[i] - x_mean) ** 2
b1 = numerator / denominator
b0 = y_mean - (b1 * x_mean)#printing the coefficient
print(b1, b0)# output : 0.26342933948939945 325.57342104944223
现在我们有了偏差系数(b)和比例因子(m)。用数学术语来说:
***Brain weights = 325.57342104944223 + 0.26342933948939945 * Head size***
现在我们有了一个线性模型。
让我们用图表来描绘它。
#plotting values
x_max = np.max(X) + 100
x_min = np.min(X) - 100#calculating line values of x and y
x = np.linspace(x_min, x_max, 1000)
y = b0 + b1 * x#plotting line
plt.plot(x, y, color='#00ff00', label='Linear Regression')#plot the data point
plt.scatter(X, Y, color='#ff0000', label='Data Point')# x-axis label
plt.xlabel('Head Size (cm^3)')#y-axis label
plt.ylabel('Brain Weight (grams)')plt.legend()
plt.show()
我们需要能够衡量我们的模型有多好(准确性)。有许多方法可以实现这一点,但我们将实现均方根误差和决定系数 ( R 分数)。
均方根误差是所有误差之和除以数值个数的平方根,或者从数学上讲,
这里的是第 与第 预测的输出值。现在我们会找到 RMSE。
*rmse = 0
for i in range(n):
y_pred= b0 + b1* X[i]
rmse += (Y[i] - y_pred) ** 2
rmse = np.sqrt(rmse/n)print(rmse)#output : 72.1206213783709*
让我们找到我们的 R 分数,以便能够从数学上衡量我们的线性模型的准确性:
SST 是平方和的总和, SSR 是残差平方和的总和。
R 的分数通常在 0 到 1 之间。如果模型完全错误,它也会变成负数。现在我们将找到 R 的分数。
*sumofsquares = 0
sumofresiduals = 0for i in range(n) :
y_pred = b0 + b1 * X[i]
sumofsquares += (Y[i] - y_mean) ** 2
sumofresiduals += (Y[i] - y_pred) **2
score = 1 - (sumofresiduals/sumofsquares)print(score)#output : 0.6393117199570003*
0.63 当然不差,但我们可以通过以下方式提高分数:
- 获取更多数据集
- 改进功能
- 适合多种型号等
结论
线性回归是所有机器学习算法的基础,也是最容易获得的,我们已经实现了普通最小均方方法来根据头部大小预测大脑重量,并且还使用均方根误差和决定系数 ( R 分数)来测量准确度。代码可以在这个回购上找到。
用 6 行 Python 实现线性回归
在这篇简短的帖子中,我想分享一种方法,使用这种方法,您可以用 6 行 Python 代码执行线性和多元线性回归。
Check out the video version of this post if you prefer that !
在统计学中,线性回归是一种对因变量和一个或多个自变量之间的关系进行建模的线性方法。如果您想了解更多关于线性回归及其实现方式的信息,请查看这两种从头开始执行线性回归的方法:
在本教程中,你可以学习梯度下降算法的工作原理,并从头开始用 python 实现它。首先…
towardsdatascience.com](/linear-regression-using-gradient-descent-97a6c8700931) [## 使用最小二乘法的线性回归
线性回归是最简单的机器学习形式。在这篇文章中,我们将看到线性回归是如何…
towardsdatascience.com](/linear-regression-using-least-squares-a4c3456e8570)
今天,为了快速执行线性回归,我们将使用库 scikit-learn。如果您还没有它,您可以使用 pip 安装它:
pip install scikit-learn
现在让我们从几个导入开始:
我们需要 numpy 来执行计算,pandas 来导入本例中 csv 格式的数据集,matplotlib 来可视化我们的数据和回归线。我们将使用 LinearRegression 类来执行线性回归。
现在让我们执行回归:
我们在 Y_pred 中有我们的预测。现在让我们可视化数据集和回归线:
Data set in blue, Regression line in red
就是这样!您可以使用您选择的任何数据集,甚至可以使用 sklearn.linear_model 中的 Linear Regression 类执行多元线性回归(多个独立变量)。这个类也使用普通的最小二乘法来执行这个回归。因此,与其他技术相比,精确度不高。但是如果你想做一些快速预测,并对给你的数据集有所了解,那么这是一个非常方便的工具。
有问题吗?需要帮助吗?联系我!
电子邮件:adarsh1021@gmail.com
领英:https://www.linkedin.com/in/adarsh-menon-739573146/
推特:https://twitter.com/adarsh_menon_
insta gram:https://www.instagram.com/adarsh_menon_/
Python 中的线性回归
在线性回归中,在给定用于定型模型的定型数据的情况下,您试图构建一个允许您预测新数据值的模型。这将变得清晰,因为我们通过这个职位的工作。
Courtesy of Department of Statistics, ITS Surabaya
以上,我们可以看到简单的线性回归方程。y 变量被认为是我们的反应或因变量。这是我们打算预测的,比如销售是一个热门选择。
B0 是 y 轴截距,即 X=0,直线与 y 轴相交。B1X 本质上是我们的 B1(我们的 X 对我们的 y 的影响量),以及我们的 X,它是我们的特征/独立变量。与我们的 y 变量不同,多个 X 可以与相应的 beta(每个的系数)一起使用。这允许我们创建一个具有许多特征(X)变量的模型来预测 y 中的值。随机误差分量是不可约误差。
第一步:可视化
使用可视化,你应该能够判断哪些变量与 y 有线性关系。
在这种情况下,我们使用“销售”作为我们的回答/y。用您预期的功能列表替换测试版的变量列表
Seaborn Pairplot
要使用的附加参数:
size=:允许您操纵渲染的 pairplot 的大小
kind= 'reg ':将尝试添加最佳拟合线和 95%置信区间。目标是最小化误差平方和。
第二步:SK 学习—设置变量
Scikit-Learn 期望 X 是一个特征矩阵(Pandas Dataframe),y 是一个响应向量(Pandas Series)。让我们从如下分离变量开始。
处理您的功能(X):
在本例中,我们使用 TV、Radio 和 Social 列作为预测变量。
处理您的回答(y):
如果您想知道为什么大写的 X 表示特性,小写的 y 表示响应,这主要是由于惯例。
第三步:SK Learn —拆分我们的数据
将 X & y 分成训练集和测试集:
通过将 X 和 y 变量传递给 train_test_split 方法,我们能够通过将 4 个变量分配给结果来捕获数据中的分割。
第四步:SK Learn —训练我们的模型
首先,我们需要导入 sklearn.linear_model 来访问 LinearRegression。然后它需要被实例化,模型适合我们的训练数据。这是下面看到的。
Instantiate and fitting model to training data
第五步:解释系数
这些系数将允许我们用β值来模拟我们的方程。linreg 变量(分配给 LinearRegression 对象)能够使用下面的代码提取截距和系数。
Extracting data from model
截距就是你的 B0 值;并且每个系数将是通过的 X 的相应β(按照它们各自的顺序)。
第六步:根据你的模型进行预测
基于您的模型进行预测就像使用下面的代码一样简单:向 predict 方法传递您的测试数据。给定新的测试 X 数据,这将返回 y 的预测值。
Returns results of y predictions given X data in X_test
第七步:模型评估
有三个主要指标用于评估线性模型。这些是:平均绝对误差(MAE),均方误差(MSE),或均方根误差(RMSE)。
梅:最容易理解。代表平均误差
MSE:类似于 MAE,但噪声被夸大,较大的误差被“惩罚”。它比 MAE 更难解释,因为它不是基本单位,然而,它通常更受欢迎。
RMSE:最流行的度量,类似于 MSE,然而,结果是平方根,因为它是基本单位,所以更容易解释。建议将 RMSE 作为解释您的模型的主要指标。
下面,您可以看到如何计算每个指标。它们都需要两个列表作为参数,一个是您的预测值,另一个是真实值
第八步:特征选择
获得误差度量后,请注意哪些 X 对 y 的影响最小。移除其中一些特征可能会提高模型的准确性。
因此,我们开始了一个反复试验的过程,这个过程从头开始,直到一个令人满意的模型产生。以下步骤可能对这一特定部分有用。
- 替换特征列
- 训练 _ 测试 _ 分割您的数据
- 使用 linreg.fit 再次将模型拟合到 linreg
- 使用(y_pred = linreg.predict(X_test))进行预测
- 计算 RMSE
- 重复直到 RMSE 满意
Python 中的线性回归;预测湾区的房价
动机
为了预测湾区的房价,我选择了来自湾区房屋销售数据库和 Zillow 的房价数据集。该数据集基于 2013 年 1 月至 2015 年 12 月期间售出的房屋。它有很多学习的特点,数据集可以从这里下载。
数据预处理
import pandas as pd
sf = pd.read_csv('final_data.csv')
sf.head()
有几个功能是我们不需要的,比如“info”、“z_address”、“zipcode”(我们有“neighborhood”作为位置变量)、“zipid”和“zestimate”(这是 Zillow 估算的价格,我们不希望我们的模型受此影响),所以,我们将放弃它们。
sf.drop(sf.columns[[0, 2, 3, 15, 17, 18]], axis=1, inplace=True)sf.info()
“zindexvalue”的数据类型应该是数字,所以让我们更改一下。
sf['zindexvalue'] = sf['zindexvalue'].str.replace(',', '')
sf['zindexvalue'] = sf['zindexvalue'].convert_objects(convert_numeric=True)sf.lastsolddate.min(), sf.lastsolddate.max()
('01/02/2013 ',' 12/31/2015')
日期集中的房屋出售时间在 2013 年 1 月至 2015 年 12 月之间。
我现在使用 describe()方法来显示数字变量的汇总统计信息。
sf.describe()
计数、平均值、最小值和最大值行是不言自明的。std 显示标准偏差,25%、50%和 75%的行显示相应的百分位数。
为了了解我们正在处理的数据类型,我们为每个数字变量绘制了一个直方图。
%matplotlib inline
import matplotlib.pyplot as plt
sf.hist(bins=50, figsize=(20,15))
plt.savefig("attribute_histogram_plots")
plt.show()
Figure 1. A histogram for each numerical variable
一些直方图有点向右倾斜,但这并不异常。
让我们创建一个带有纬度和经度的散点图来可视化数据:
sf.plot(kind="scatter", x="longitude", y="latitude", alpha=0.2)
plt.savefig('map1.png')
Figure 2. A scatter plot of the data
现在让我们从最贵到最便宜的区域进行颜色编码:
sf.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4, figsize=(10,7),
c="lastsoldprice", cmap=plt.get_cmap("jet"), colorbar=True,
sharex=False)
Figure 3. The Bay Area housing prices
这张图片告诉我们,最贵的房子是在北部地区。
我们要预测的变量是“最后成交价格”。所以我们来看看每个自变量和这个因变量的相关程度。
corr_matrix = sf.corr()
corr_matrix["lastsoldprice"].sort_values(ascending=False)
当完工面积和浴室数量增加时,最终售价往往会上升。你可以看到建造年份和上一次销售价格之间有一个小的负相关。最后,接近零的系数表示没有线性相关性。
我们现在将使用 Pandas 的scatter_matrix函数来可视化变量之间的相关性。我们将只关注几个有希望的变量,它们似乎与最后的销售价格最相关。
from pandas.tools.plotting import scatter_matrixattributes = ["lastsoldprice", "finishedsqft", "bathrooms", "zindexvalue"]
scatter_matrix(sf[attributes], figsize=(12, 8))
plt.savefig('matrix.png')
Figure 4. a scatter matrix
预测最后销售价格的最有希望的变量是完成的平方英尺,所以让我们放大它们的相关散点图。
sf.plot(kind="scatter", x="finishedsqft", y="lastsoldprice", alpha=0.5)
plt.savefig('scatter.png')
Figure 5. Finished sqft vs. Last Sold Price
相关性确实很强;你可以清楚地看到上升的趋势,而且这些点不是太分散。
因为每个房子有不同的平方英尺,每个社区有不同的房价,我们真正需要的是每平方英尺的价格。于是,我们添加了一个新的变量“price_per_sqft”。然后,我们检查这个新的独立变量与最后销售价格的相关性。
sf['price_per_sqft'] = sf['lastsoldprice']/sf['finishedsqft']
corr_matrix = sf.corr()
corr_matrix["lastsoldprice"].sort_values(ascending=False)
不幸的是,新的 price_per_sqft 变量只显示了与最后销售价格非常小的正相关性。但是我们仍然需要这个变量来对邻居进行分组。
数据里有 71 个小区,我们准备分组。
len(sf['neighborhood'].value_counts())
71
以下步骤将邻域聚类成三组:1 .价格低;2.高价低频;3.高价高频。
freq = sf.groupby('neighborhood').count()['address']
mean = sf.groupby('neighborhood').mean()['price_per_sqft']
cluster = pd.concat([freq, mean], axis=1)
cluster['neighborhood'] = cluster.indexcluster.columns = ['freq', 'price_per_sqft','neighborhood']cluster.describe()
这些是低价格社区:
cluster1 = cluster[cluster.price_per_sqft < 756]
cluster1.index
索引(【‘湾景’,‘中央里士满’,‘中央日落’,‘克罗克亚马逊’, ‘戴利市’,‘钻石高地’,‘精益求精’,‘森林山’, ‘森林山延伸’,‘金门高地’,‘英格莱赛德’,‘英格莱赛德高地’,‘英格莱赛德露台’,‘内公园边’, ‘内里士满’,‘内日落’,‘湖岸’,‘小好莱坞’, ‘默塞德高地’,‘米申台’,‘戴维森山庄园’, ‘海景’,‘外宣’,‘外
这些是高价格和低频率的社区:
cluster_temp = cluster[cluster.price_per_sqft >= 756]
cluster2 = cluster_temp[cluster_temp.freq <123]
cluster2.index
索引(['布埃纳维斯塔公园','中央滨水区—多克帕奇','科罗纳高地','海特—阿什伯里','湖边','孤山','中城露台', '北海滩','北部滨水区','帕纳萨斯—阿什伯里','普雷斯迪奥高地','海崖','圣弗朗西斯伍德','电报山','双峰'],dtype='object ',name='neighborhood')
这些是高价格和高频率的社区:
cluster3 = cluster_temp[cluster_temp.freq >=123]
cluster3.index
索引(['Bernal Heights ',' Cow Hollow ',' Downtown ',' Eureka Valley-Dolores Heights-Castro ',' Glen Park ',' Hayes Valley ',' Lake ',' Lower Pacific Heights ',' Marina ',' Miraloma Park ',' Mission ',' Nob Hill ',' Noe Valley ',' North Panhandle ',' Pacific Heights ',' Potrero Hill ',' Russian Hill ',' South Beach ',' South ' Market ',' Van Ness-civice centre ',' Yerba
我们根据集群添加一个组列:
def get_group(x):
if x in cluster1.index:
return 'low_price'
elif x in cluster2.index:
return 'high_price_low_freq'
else:
return 'high_price_high_freq'
sf['group'] = sf.neighborhood.apply(get_group)
在执行上述预处理后,我们不再需要以下列:“address,lastsolddate,latitude,longitude,neighborhood,price_per_sqft”,因此,我们从分析中删除它们。
sf.drop(sf.columns[[0, 4, 6, 7, 8, 13]], axis=1, inplace=True)
sf = sf[['bathrooms', 'bedrooms', 'finishedsqft', 'totalrooms', 'usecode', 'yearbuilt','zindexvalue', 'group', 'lastsoldprice']]
sf.head()
我们的数据看起来很完美!
但是在构建模型之前,我们需要为这两个分类变量创建虚拟变量:“usecode”和“group”。
X = sf[['bathrooms', 'bedrooms', 'finishedsqft', 'totalrooms', 'usecode', 'yearbuilt',
'zindexvalue', 'group']]
Y = sf['lastsoldprice']
n = pd.get_dummies(sf.group)
X = pd.concat([X, n], axis=1)m = pd.get_dummies(sf.usecode)
X = pd.concat([X, m], axis=1)drops = ['group', 'usecode']
X.drop(drops, inplace=True, axis=1)X.head()
这是我们的数据在创建虚拟变量后的样子:
训练并建立线性回归模型
from sklearn.cross_validation import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=0)from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)
搞定了。我们现在有一个工作的线性回归模型。
计算 R 的平方:
*y_pred = regressor.predict(X_test)
print('Linear Regression R squared": %.4f' % regressor.score(X_test, y_test))*
线性回归 R 的平方:0.5619
因此,在我们的模型中,Y 的 56.19%的可变性可以用 x 来解释。这并不令人兴奋。
计算均方根误差(RMSE)
*import numpy as np
from sklearn.metrics import mean_squared_error
lin_mse = mean_squared_error(y_pred, y_test)
lin_rmse = np.sqrt(lin_mse)
print('Linear Regression RMSE: %.4f' % lin_rmse)*
线性回归 RMSE: 616071.5748
我们的模型能够预测测试集中每栋房子的价格,误差在 616071 美元以内。
计算平均绝对误差(MAE):
*from sklearn.metrics import mean_absolute_errorlin_mae = mean_absolute_error(y_pred, y_test)
print('Linear Regression MAE: %.4f' % lin_mae)*
线性回归 MAE: 363742.1631
随机森林
让我们尝试一个更复杂的模型,看看结果是否可以改进 RandomForestRegressor:
*from sklearn.ensemble import RandomForestRegressorforest_reg = RandomForestRegressor(random_state=42)
forest_reg.fit(X_train, y_train)*
RandomForestRegressor(bootstrap = True,criterion='mse ',max_depth=None,max_features='auto ',max_leaf_nodes=None, min _ infinity _ split = 1e-07,min_samples_leaf=1, min_samples_split=2,min_weight_fraction_leaf=0.0, n_estimators=10,n_jobs=1,oob_score=False,random_state=42, 详细
*print('Random Forest R squared": %.4f' % forest_reg.score(X_test, y_test))*
随机森林 R 的平方】:0.6491
*y_pred = forest_reg.predict(X_test)
forest_mse = mean_squared_error(y_pred, y_test)
forest_rmse = np.sqrt(forest_mse)
print('Random Forest RMSE: %.4f' % forest_rmse)*
随机森林 RMSE: 551406.0926
好多了!让我们再试一次。
梯度推进
*from sklearn import ensemble
from sklearn.ensemble import GradientBoostingRegressor
model = ensemble.GradientBoostingRegressor()
model.fit(X_train, y_train)*
GradientBoostingRegressor(alpha = 0.9,criterion='friedman_mse ',init=None,learning_rate=0.1,loss='ls ',max_depth=3,max_features=None,max_leaf_nodes=None,min _ infinity _ split = 1e-07, min_samples_leaf=1,min_samples_split=2,min_weight_fraction_leaf=0.0,n _ estimators = 100,预排序='auto ',random_state
*print('Gradient Boosting R squared": %.4f' % model.score(X_test, y_test))*
梯度增强 R 的平方】:0.6616
*y_pred = model.predict(X_test)
model_mse = mean_squared_error(y_pred, y_test)
model_rmse = np.sqrt(model_mse)
print('Gradient Boosting RMSE: %.4f' % model_rmse)*
渐变助推 RMSE: 541503.7962
这是我们迄今为止最好的结果,所以,我认为这是我们的最终模型。
特征重要性
我们在模型中使用了 19 个特征(变量)。让我们找出哪些特性是重要的,反之亦然。
*feature_labels = np.array(['bathrooms', 'bedrooms', 'finishedsqft', 'totalrooms', 'yearbuilt', 'zindexvalue',
'high_price_high_freq', 'high_price_low_freq', 'low_price', 'Apartment', 'Condominium', 'Cooperative',
'Duplex', 'Miscellaneous', 'Mobile', 'MultiFamily2To4', 'MultiFamily5Plus', 'SingleFamily',
'Townhouse'])
importance = model.feature_importances_
feature_indexes_by_importance = importance.argsort()
for index in feature_indexes_by_importance:
print('{}-{:.2f}%'.format(feature_labels[index], (importance[index] *100.0)))*
最重要的特征是完工面积、zindex 值、浴室数量、总房间数、建造年份等等。最不重要的特征是公寓,这意味着不管这个单元是否是公寓,对出售价格都无关紧要。总的来说,这 19 个特性大部分都用上了。
轮到你了!
希望这篇文章能让你对机器学习回归项目有一个好的了解。正如你所看到的,大部分工作都在数据争论和准备步骤中,这些程序消耗了花在机器学习上的大部分时间。
现在是时候走出去,开始探索和清理您的数据了。尝试两三个算法,然后告诉我进展如何。
创建这篇文章的源代码可以在这里找到。我将很高兴收到关于上述任何反馈或问题。
现实生活中的线性回归
用数学解决现实世界的问题
Photo by Roman Mager on Unsplash
我们在学校里学到了很多有趣和有用的概念,但有时我们不太清楚如何在现实生活中运用它们。
一个可能被广泛低估的概念/工具是线性回归。
假设你正计划和你的两个好朋友去拉斯维加斯旅行。你从旧金山出发,知道要开大约 9 个小时的车。你的朋友负责聚会的运作,而你负责所有相关的后勤工作。你必须计划好每一个细节:时间表,什么时候停下来,在哪里,确保你准时到达那里...
那么,你做的第一件事是什么?你悄悄地从地球上消失,不再回你朋友的电话,因为他们会在你当派对警察的时候玩得很开心?!不,你给自己一张白纸,开始计划吧!
你清单上的第一项是什么?预算!这是一次 9 小时——大约 1200 英里——的有趣旅程,所以路上总共 18 小时。后续问题:我应该拨多少钱买汽油?
这是一个非常重要的问题。你不会想在高速公路中间停下来,可能只是因为没油而走了几英里!
你应该花多少钱买汽油?
你带着以科学为导向的心态来处理这个问题,认为必须有一种方法根据你旅行的距离来估计所需的钱数。
首先,你看一些数据。
在过去的一年里,你一直在努力跟踪你的汽车的效率——因为谁没有呢!—所以在你电脑的某个地方有这个电子表格
The beauty of dummy data 😄
在这一点上,这些只是数字。从这个电子表格中获取任何有价值的信息都不太容易。
然而,像这样绘制,很明显,在没有加满油箱的情况下,你能开多远是有某种“联系”的。不是说你以前不知道,但是现在有了数据,事情就变得很清楚了。
你真正想弄清楚的是
"如果我开 1200 英里,我要付多少油钱?"
为了回答这个问题,你将使用到目前为止你已经收集的数据,并用它来预测你将花费多少。这个想法是,你可以根据过去的数据——你辛辛苦苦记录的数据点——对未来——你的拉斯维加斯之旅——进行估计性的猜测。
你最终得到一个数学模型,描述了行驶里程和加满油所花的钱之间的关系。
一旦这个模型被定义,你可以向它提供新的信息——你从旧金山开车到拉斯维加斯有多少英里——这个模型将预测你需要多少钱。
Example of plot of your dataset (data from the past) and your predictions (data from the future)
该模型将使用过去的数据来了解行驶总里程数和支付的总油费之间的关系。
当呈现给它一个新的数据点时,你从旧金山开车到拉斯维加斯有多少英里,模型将利用它从所有过去的数据中获得的知识,并提供它的最佳猜测——一个预测,即你来自未来的的数据点。
回头看看你的数据,你会发现,通常,你在汽油上花的越多,在汽油耗尽之前你能开的时间就越长——假设汽油价格保持不变。
如果你让最好地描述——或者“解释”——上图中的关系,它看起来会是这样的
很明显,行驶里程和汽油总费用之间有一个线性关系。因为这种关系是线性的,如果你花更少/更多的钱——例如,油箱加满一半——你就能开更少/更多的里程。
因为这种关系是线性的,而且你知道从旧金山到拉斯维加斯的车程有多长,所以使用线性模型将帮助你预测你将为汽油花费多少预算。
线性回归模型
最能描述总行驶里程和总支付汽油费用之间关系的模型类型是 线性回归模型 。回归部分在这里,因为你试图预测的是一个数值。
这里有几个概念需要解释:
- 因变量
- 独立变量
- 拦截
- 系数
你要为汽油预算的金额取决于你要开多少英里,在这种情况下,从旧金山到拉斯维加斯。因此,为天然气支付的总费用是模型中的因变量和。
另一方面,拉斯维加斯哪儿也不去,所以从三藩市到拉斯维加斯你需要开多少英里与你在加油站支付的费用无关——行驶的英里数是模型中的独立变量。让我们暂时假设油价保持不变。
由于我们只处理一个独立变量,该模型可以指定为:
这是一个简单版本的线性组合,其中只有一个变量。如果你想在计算中更加严谨,你也可以在这个模型中加入每桶石油的价格作为独立变量,因为它会影响天然气的价格。
模型的所有必要部分都准备好了,剩下的唯一问题是:B0、B1 和 B2 呢?
B0,*读作“Beta 0”,是模型的截距,意思是当每个因变量都等于零时,你的自变量取的值。你可以把它想象成一条穿过轴的原点的直线。***
Different intercept values for the linear model: y = Beta0+ 2x
“β1”和“β2”是所谓的系数。模型中的每个独立变量都有一个系数。它们决定了描述模型的回归线的斜率。
****如果我们以上面的例子为例,一个由 y= Beta0 + Beta1x,指定的模型,并使用不同的 Beta 1 值,我们会得到这样的结果
Different coefficient values for the linear model: y = 1 + Beta1x
这些系数解释了因变量的变化率,即当每个自变量变化一个单位时,你要支付的汽油价格。
因此,在上面蓝线的情况下,自变量 x 每改变一个单位,因变量 y 就改变 1 倍。 因此,对于绿线,该效应是因变量 x 单位变化的 4 倍
普通最小二乘法
至此,我们已经讨论了线性模型,甚至对截距和系数插入不同的值进行了实验。
然而,为了计算出你去拉斯维加斯旅行要付多少油钱,我们需要一种机制来估算这些价值。
有不同的技术来估计模型的参数。其中最流行的是普通最小二乘法(OLS) 。
普通最小二乘法的前提是最小化模型的残差的平方和。即数据集中预测值和实际值之间的差异,即距离。
通过这种方式,模型计算出最佳参数,因此回归线中的每个点都尽可能地接近数据集。
在预算练习的最后,有了模型参数,你就可以输入你期望驾驶的总里程,并估计你需要为汽油分配多少。
很好,现在你知道你应该为汽油预算 114.5 美元!
你会注意到我们的模型中没有参数β0。在我们的用例中,有一个截距——或者当因变量等于零时有一个常数值——没有多大意义。对于这个特定的模型,我们强迫它通过原点,因为如果你不开车,你就不会花任何油钱。
下一次,当你发现自己需要根据一系列可以用直线描述的因素来估算一个数量时——你知道你可以使用线性回归模型。
感谢阅读!
野外线性回归
在一次数据科学家职位的面试中,我接到了一个家庭作业,我想和你分享一下。
面试官给我发了一个 CSV 文件,里面有实测量 x 和 y 的样本,其中 y 是一个响应变量,可以写成 x 的显函数。众所周知,在标准偏差的意义上,用于测量 x 的技术比用于测量 y 的技术好两倍。
任务:将 y 建模为 x 的函数。
这是我需要的所有进口货:
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from scipy.stats import probplotimport matplotlib.pyplot as plt
%matplotlib inlinedata = pd.read_csv('data.csv', names=['x', 'y'])
data.head()
让我们将数据可视化,看看是否容易用肉眼捕捉到模式:
data.plot.scatter('x', 'y', title='data')
这看起来很像线性回归的情况。首先,我将手动移除异常值:
data = data[data['x'] < 600]
data.plot.scatter('x', 'y', title='data without outliers')
我将使用LinearRegression来拟合最佳线条:
lr = LinearRegression().fit(data[['x']], data['y'])
data.plot.scatter('x', 'y', title='linear regression')
lr_predicted_y = lr.predict(data[['x']])
plt.plot(data['x'], lr_predicted_y)
fitting a line through the data
视觉上看起来很有说服力,但我会验证线性回归假设,以确保我使用的是正确的模型。
如果你对线性回归假设不熟悉,你可以在文章用假设深入回归分析,绘制&解中阅读。
首先,我们将绘制残差图:
residuals = lr_predicted_y - data['y']
plt.scatter(x=lr_predicted_y, y=residuals)
plt.title('residuals')
- 残差中似乎没有自相关。
- 异方差在这里看起来也不是问题,因为方差看起来几乎是恒定的(除了图的左边部分,但是没有太多的数据,所以我会忽略它)。
- 多重共线性在这里不相关,因为只有一个因变量。
- 残差应呈正态分布:我将使用 QQ-plot 验证:
probplot(residuals, plot=plt)
这看起来相当正常…
我的结论是,假设线性关系,x 和 y 之间的关系最好建模为
print 'y = %f + %f*x' % (lr.intercept_, lr.coef_)>>> y = 70.023655 + 2.973585*x
给定 x (两者都有测量误差),或者换句话说,线的系数,我们得到了计算 y 所需参数的一致估计值。
到目前为止,我所做的只是简单的线性回归。关于这个任务有趣的事情是 x 有测量误差(这在真实世界用例中是典型的)。
如果我们想要在给定精确的 x 值(没有测量误差)的情况下估计计算 y 所需的参数,我们需要使用不同的方法。使用简单的线性回归而不考虑随机噪声的 x 导致线斜率略小于真实的线斜率(描述没有测量误差的 x 的线)。你可以阅读这个维基页面来了解原因。
我将使用戴明回归,这是一种当两个变量 x 和 y 的误差被假设为独立且正态分布,并且它们的方差比(表示为 δ )已知时可以使用的方法。这种方法非常适合我们的环境
在标准偏差的意义上,用于测量 x 的技术比用于测量 y 的技术好两倍。
所以在我们的设置中, δ 是 2 的平方。
使用在维基页面中找到的公式,我们得到
cov = data.cov()
mean_x = data['x'].mean()
mean_y = data['y'].mean()
s_xx = cov['x']['x']
s_yy = cov['y']['y']
s_xy = cov['x']['y']
delta = 2 ** 2slope = (s_yy - delta * s_xx + np.sqrt((s_yy - delta * s_xx) ** 2 + 4 * delta * s_xy ** 2)) / (2 * s_xy)
intercept = mean_y - slope * mean_x
使用戴明回归,将 x 和 y 之间的关系建模为
print 'y = %f + %f*x' % (intercept, slope)>>> y = 19.575797 + 3.391855*x
让我们绘制两个模型:
data.plot.scatter('x', 'y', title='linear regression with & without accounting for $x$ error measurements')
plt.plot(data['x'], lr_predicted_y, label='ignoring errors in $x$')
X = [data['x'].min(), data['x'].max()]
plt.plot(X, map(lambda x: intercept + slope * x, X), label='accounting for errors in $x$')
plt.legend(loc='best')
我们拟合了两个模型:一个是简单的线性回归模型,另一个是考虑到 x 中的测量误差的线性回归模型。
如果我们的目的是给定一个具有测量误差的新的 x 来计算 y (由与训练模型时使用的测量误差相同的分布产生),则更简单的方法可能就足够了。
如果我们想在一个没有测量误差的世界里,将 y 的真实关系描述为 x 的函数,我们应该使用第二个模型。
这是一个很好的面试问题,因为我学到了一种新的模式,这是非常整洁的:)
尽管这并不是如标题所示的线性回归的真实例子(好吧,我撒谎了),这篇文章确实展示了许多人没有注意到的一个重要概念:在许多情况下,因变量是以不准确的方式测量的,这可能需要加以考虑(取决于应用)。
小心退步!
这个帖子最初是我在 www.anotherdatum.com*[](anotherdatum.com/linear-regr…*
如何建立简单的线性回归模型?
这篇文章是关于一步一步地为 ML 初学者实现简单的线性回归模型,并有详细的解释。
如果你是机器学习的新手,请查看 这篇 的帖子,了解机器学习及其基础知识。
简单线性回归模型背后的逻辑是什么?
顾名思义,线性回归遵循从一个给定自变量的值确定一个因变量的值的线性数学模型。还记得学校里的线性方程吗?
y=mx+c
其中 y 是因变量,m 是斜率,x 是自变量,c 是给定直线的截距。
我们也有多元回归模型,其中多个自变量用于计算一个因变量。
我已经用 Jupyter 笔记本实现了。您可以选择使用任何 Python IDE 所以让我们开始吧..
步骤 1:导入库
Step 1
Python 中已经开发了用于实现机器学习模型的库。
第一个名为 matplotlib 的库用于在最后一步绘制图形。“plt”用作变量名,用于在前面的代码中使用该库。
sklearn 是 python 中的官方机器学习库,用于各种模型实现。
numpy 用于将数据转换成数组,供 sklearn 库实际使用。
熊猫是用来访问的。数据集的 csv 文件。
步骤 2:加载数据集
我们的数据集是. csv 文件类型。Pandas 变量 pd 用于通过 read_csv()函数访问数据集。
第三步:分解为自变量和因变量
我们通过 iloc(索引位置)值定义 x 为数据集中的自变量。[]用于定义数组元素。":"[]内表示考虑数据集中的所有行,并使用" "分隔。我们指定要用作自变量或因变量的列数,从数据集中的零开始计数。
步骤 4:将数据分为训练数据和测试数据
现在,整个数据集被分为训练集和测试集,这样预测就不会过拟合或欠拟合,从而获得正确值。train_test_split()是 scikit learn 的内置函数,用于拆分 x 和 y 变量数据。“test_size”参数用于将整个数据集(30%)的 1/3 划分为测试数据,其余部分作为训练数据。将 random_state 设置为 null 将不允许从数据集中获取随机值。
第五步:选择模型
我们重塑我们的自变量,因为 sklearn 期望一个 2D 数组作为输入。
这里的线性回归是我们的模型,模型的变量名为“lin_reg”。我们也可以用许多其他模型来尝试相同的数据集。该部分因型号而异,否则所有其他步骤都与此处描述的相似。
第六步:符合我们的模型
现在,我们通过用自变量和因变量训练模型,使我们的模型适合线性回归模型。
第七步:预测输出
最后,我们的模型使用自变量的测试值来预测因变量“lin_reg_pred”。
我们可以看到异常值的系数、截距值,以及预测值(lin_reg_pred)和因变量的实际测试值(y_test)的均方误差和方差。内置方法使用预定义的公式计算每个值。
第八步:绘制图表
我们最终希望以图形格式可视化实际数据值和预测数据值。matplotlib 变量“plt”用于使用“scatter()”绘制点,使用“plot()”函数绘制异常值。
输出可能因不同的系统功能而异。我得到的输出如下:
Output
Output Graph
就是这个!我们的第一个线性回归模型实现了!下面是我们在这里实现的整个模型的完整代码的链接。
机器学习——我所有的机器学习项目
github.co](github.com/ditsme/Mach…)
在 LinkedIn 上关注我:www.linkedin.com/comm/mynetw…
线性回归:建模和假设
Source: HD Wallpapers
回归分析是一种功能强大的统计过程,用于查找数据集中的关系,重点关注自变量(预测值)和因变量(结果)之间的关系。它可用于构建推理或预测模型。在回归分析的几种方法中,线性回归奠定了基础,并被广泛用于几个现实世界的应用中。
在这篇文章中,我们将着眼于建立一个线性回归模型进行推理。我们将使用的数据集是从 Kaggle 获得的保险费用数据。这个数据集由 1,338 个观察值和 7 列组成:年龄、性别、bmi、儿童、吸烟者、地区和费用。
我们要问的关键问题是:
- 医疗收费和数据集中的其他变量有关系吗?
- 我们建立的模型有多有效?
- 我们能做些什么来改进模型?
Source : Google Images
我们从导入所需的主要库和数据开始:
library(magrittr)
library(car)
library(broom)
library(ggplot2)fileName <- './input/medicalCost/insurance.csv'insurance <- read.csv(fileName)
summary(insurance)
从摘要中可以得出一些简单的观察结果:
- 参与者的年龄从 18 岁到 64 岁不等。
- 大约 49.48%的参与者是女性。
- 参与者的 bmi 从 15.96 到 53.13 不等。
- 只有 20.48%的参与者是吸烟者。
让我们从建立一个线性模型开始。在简单的线性回归中,只有一个预测因子和一个结果,我们将采用多元线性回归,有多个预测因子和一个结果。
多元线性回归遵循以下公式:
这个线性方程中的系数表示预测值和响应之间的加性关系的大小。更简单地说,在保持其他一切不变的情况下,x1 的单位变化将导致结果中β1 的变化,依此类推。
医疗收费和预测因素有关系吗?
我们的第一步是发现结果和预测之间是否有任何关系。
无效假设是任何预测值和反应之间没有关系,这可以通过计算 F 统计量来检验。F 统计量的 p 值可用于确定是否可以拒绝零假设。
我们将从使用所有预测值拟合多元线性回归模型开始:
lm.fit <- lm(formula = charges~., data = insurance)
*#Here '.' means we are using all the predictors in the dataset.
*
summary(lm.fit)
具有非常低的 p 值(< 2.2e-16)的高 F 统计值意味着可以拒绝零假设。这意味着预测因素和结果之间存在潜在的联系。
RSE(剩余标准误差)是对不可约误差(即使我们知道真实回归线也无法减少的误差)的标准偏差的估计;因此,不可约)。简单来说,就是实际结果与真实回归线的平均偏差。RSE (6062)的大值意味着我们的模型与真实回归线的高偏差。
R-squared (R)衡量模型可以解释的结果中可变性的比例,并且几乎总是在 0 和 1 之间;该值越高,模型就越能更好地解释结果的可变性。然而,由于 R 平方的膨胀,预测因子数量的增加通常会导致 R 值的增加。调整 R 的平方调整 R 的值以避免这种影响。较高的调整后 R 值(0.7494)表明数据中超过 74%的方差可以用模型来解释。
性病。误差给出了预测器的估计系数与预测器的实际系数之差的平均值。它可以用来计算估计系数的置信区间,我们将在后面看到。
预测器的 t 值告诉我们它的估计系数距离 0 有多少个标准差。预测值的 Pr ( > |t|) 是估计的回归系数的 p 值,这与说明看到回归系数的 t 值的概率相同。预测值的非常低的 p 值(< 0.05)可用于推断预测值和结果之间存在关系。
我们的下一步应该是回归分析的验证。这可能意味着验证模型的潜在假设,用不同的预测值检查模型的结构,寻找模型中没有足够好地表示的观察值,等等。我们将研究其中的一些方法和假设。
哪些变量与医疗费用有很大关系?
既然我们已经确定了预测因素和结果之间的关系,我们的下一步将是找出是否所有或只有一些预测因素与结果相关。
如果我们查看上面估计系数的 p 值,我们会发现并非所有系数都具有统计显著性(< 0.05)。这意味着只有预测因子的子集与结果相关。
我们可以查看各个 p 值来选择变量。当预测值的数量(7)与观察值的数量(1338)相比非常小时,这可能不是问题。然而,由于多重测试问题,当预测值的数量大于观察值的数量时,这种方法将不起作用。选择预测值的更好方法是特征/变量选择方法,如前向选择、后向选择或混合选择。
在使用这些方法进行特征选择之前,让我们尝试使用仅具有显著 p 值的特征进行线性回归。
lm.fit.sel <- lm(charges~age+bmi+children+smoker+region,
data = insurance)
我们将这与混合选择(T4)进行比较,混合选择是向前和向后选择的结合。这可以在 R 中使用 stepAIC() 函数来完成,该函数使用 Akaike 信息标准 (AIC)从多个模型中选择最佳模型。
**#selecting direction = "both" for mixed selection**
step.lm.fit <- MASS::stepAIC(lm.fit, direction = "both",
trace = FALSE)
让我们比较一下这两种模型:
step.lm.fit$call
lm.fit.sel$call
逐步选择给出的模型与我们通过选择具有显著 p 值的预测因子得到的模型相同(在这种情况下有效)。
有什么多重共线性特征吗?
多重回归中的多重共线性是一种现象,其中两个或多个预测因子彼此高度相关,因此一个预测因子可用于预测另一个预测因子的值。多重共线性的问题是,它会使估计预测者对结果的个别影响变得更加困难。
多重共线性可以使用方差膨胀因子(VIF)来检测。任何预测值的 VIF 是其在完整模型中的估计系数的方差与仅适合其自身结果时的估计系数的方差之比(如在简单线性回归中)。VIF 为 1 表示不存在多重共线性。通常,大于 5 或 10 的 VIF 值被视为多重共线性的指标。在这种情况下,消除多重共线性的最简单方法是丢弃 VIF 值较高的预测值。
**vif**(**step**.lm.fit) %>%
**knitr**::kable()
在我们的例子中,没有一个预测值有很高的 VIF 值。因此,在我们的例子中,我们不需要担心多重共线性。
Source: Google Images
关系是线性的吗?
通过应用线性回归,我们假设预测值和结果之间存在线性关系。如果潜在的关系远远不是线性的,那么我们所做的大多数推论都是可疑的。
可以使用拟合值对残差的残差图来确定模型的非线性。任何观测值的残差是实际结果与模型拟合结果之间的差异。残差图中模式的存在意味着模型的线性假设有问题。
**#**type = "rstandard" draws a plot **for** standardized residualsresidualPlot(step.lm.fit, type = "rstandard")
蓝线表示拟合值和标准残差之间的平滑模式。在我们的例子中,曲线表示数据中的轻微非线性。
通过查看分量残差图 (CR 图),可以进一步探究非线性。
**ceresPlots**(**step**.lm.fit)
粉色线(残差线)是预测值和残差之间关系的模型。蓝色虚线(组件线)代表最佳拟合线。预测因子的两条线之间的显著差异意味着预测因子和结果没有线性关系。
这种不一致可以在 bmi 的 CR 图中看到。解决这一问题的方法之一是引入模型预测值的非线性变换。让我们试着给这个模型添加一个 bmi 的非线性转换。
**#update**() **can** **be** **used** **to** **update** **an** **existing** **model** **with** **new requirements****step**.lm.fit.new <**-** **update**(**step**.lm.fit, .~.+**I**(**bmi**^1.25)) **ceresPlots**(**step**.lm.fit.new)
bmi 的 CR 图在残差线和成分线之间不再有差异。
我们可以使用 ANOVA 来检查新模型是否明显优于以前的模型。低 p 值(<0.05) for the new model will mean we can conclude that it is better than the previous model:
anova(step.lm.fit, step.lm.fit.new, test = "F")
Since the model with non-linear transformation of bmi 有足够低的 p 值(< 0.05),我们可以得出结论,它比之前的模型更好,虽然 p 值很小。
我们来看看这个新模型的剩余剧情。
residualPlot(step.lm.fit.new, type = "rstandard")
查看新模型的残差图,标准残差的整体模式没有太大变化。
Source: Google Images
解决非线性问题的另一种方法是在一些预测器之间引入一个交互。与 bmi 较低且不吸烟的人相比,吸烟且 bmi 较高的人可能要支付更高的费用。让我们更新模型,在 bmi 和吸烟者之间引入一种相互作用,看看这是否会产生影响:
lm.fit1 <- update(step.lm.fit.new, ~ .+bmi*smoker)residualPlot(lm.fit1, type = "rstandard", **id**=TRUE)
anova(step.lm.fit.new, lm.fit1, test = "F")
不仅关系变得更加线性,残差图中出现的模式更少,而且新模型明显优于以前的模型(没有相互作用),这可以从 p 值(< 2.2e-16)中看出。
*#checking the value of adjusted r-squared of new model* summary(lm.fit1)$adj.r.squared
模型的 R 值也提高到了 0.84 以上。
误差项的非恒定方差
误差的恒定方差(同方差)是线性回归模型的另一个假设。例如,在误差的非恒定方差(异方差)的情况下,误差项可能随着响应变量的值而变化。识别异方差的一些图形方法是残差图中存在漏斗形状,或者残差图中存在曲线。在上面的情节中,我们没有看到任何清晰的模式。
统计方法是 Breusch-Pagan 测试的扩展,可在 cars 包中作为 ncvTest() 获得。它假设误差方差不变的零假设,而另一个假设是误差方差随着反应水平或预测因子的线性组合而变化。
**#** non-constant error variance test
ncvTest(lm.fit1)
非常低的 p 值(~0.000023)意味着可以拒绝零假设。换句话说,误差具有非恒定方差的可能性很高。
解决这个问题的方法之一是转换结果变量。
**yTransformer** <**-** 0.8
**trans**.lm.fit <**-** **update**(**lm**.fit1, **charges**^**yTransformer**~.)# **non-constant** **error** **variance** **test**
**ncvTest**(**trans**.lm.fit)
residualPlot(trans.lm.fit, type = "rstandard", id=T)
p 值约为 0.94 意味着我们不能拒绝误差项方差不变的零假设。然而,从残差图中可以看出,模型的非线性略有增加。这可以通过观察单个预测因子和结果之间的关系来进一步确定。
误差项的相关性
线性回归模型的一个重要假设是连续误差项是不相关的。估计回归系数的标准误差是根据这一假设计算的。如果连续误差项相关,估计回归系数的标准误差可能会大得多。
我们可以使用德宾-沃森测试来检查误差项的自相关性。无效假设是连续误差没有自相关。
set.seed(1)**#** Test **for** Autocorrelated Errors
durbinWatsonTest(trans.lm.fit, max.lag = 5, reps=1000)
5 个滞后中没有一个的 p 值小于 0.05。因此,我们不能拒绝连续误差不相关的零假设,得出连续误差相互独立的结论。
解释
让我们看看最终模型的实际电荷与拟合值,并将其与初始模型的结果进行比较。绘制 fitted_vs_actual 的函数,在下一个块之前使用,在这里是:
*#fitted values of initial model*fitted_init <- predict(lm.fit, insurance,
interval = "confidence") %>%
tidy()
g1 <- fitted_vs_actual(fitted_init, "Initial Model")*#fitted values of final model*fitted_final <- predict(trans.lm.fit, insurance,
interval = "confidence")^(1/yTransformer) %>%
tidy()
g2 <- fitted_vs_actual(fitted_final, "Final Model")*#creating the two plots side-by-side*
gridExtra::grid.arrange(g1,g2, ncol = 2)
最初的模型能够逼近低于 17,000 美元的实际费用,但是随着实际费用超过 20,000 美元,实际费用和拟合值之间的差距不断增大。根据初始模型,接近 50,000 美元的实际费用被拟合为接近或低于 40,000 美元,并且该差距继续向上增加。
相比之下,新模型中的拟合值更接近实际费用,尽管仍有许多变化未被该模型解释。它仍然是最初模型的一个重大改进。
我们可以查看预测值的估计系数及其置信区间,以解释它们如何定义模型。
confint(trans.lm.fit) %>%
tidy() %>%
tibble::add_column(coefficients = trans.lm.fit$coefficients,
.after = 2) %>%
knitr::kable()
在上表中,X2.5 和 X97.5 标记了回归系数 95%置信区间的下限和上限。这些是使用估计系数的标准误差计算的。例如,对于年龄,估计系数约为 33.69,95%置信区间介于约 31.56 至约 35.83 之间。这意味着,根据模型,保持其他一切固定,年龄增加 1 岁将导致 charges^(0.8).值增加 33.69(因为我们转换了结果)。但是,这是一个估计值,因此有变动的余地。置信区间说明了这种变化,表示在大约 95%的情况下,charges^(0.8 值的变化将在 31.56 和 35.83 之间,保持其他一切固定。
让我们将这些影响形象化,以更好地理解预测因素与模型结果之间的关系。获得模型对转换结果影响的函数是这里的。
plot_effect('age', 'age') %>%
ggplot(aes(x = age, y = fit)) +
theme_bw() +
geom_line() +
geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.5)
对于其他预测因子的平均值,保险费随着年龄的增加而增加。在体重指数和吸烟者之间的互动中可以看到更有趣的效果:
plot_effect('bmi*smoker', 'bmi') %>%
ggplot(aes(x = x.bmi, y = fit)) +
facet_wrap(~x.smoker) +
theme_bw() +
geom_line() +
geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.5)
不吸烟者,不管他们的 bmi 如何,对于其他预测指标的平均值来说,他们的保险费用大多较低。低 bmi 吸烟者的保险费较低,尽管仍高于任何 bmi 值的非吸烟者。此外,随着他们 bmi 的增加,吸烟者的保险费用也迅速增加。
结论
我们建立的模型可用于推断不同的预测因素如何影响结果。它远非完美。它们仍然存在非线性和误差的非恒定方差。此外,应该分析异常值和杠杆点,以找到更好的模型。当用于预测新的、看不见的数据的结果时,它可能不会(并且很可能不会)给出类似的结果。为了将其用于预测,应该采取更具体的措施来确保模型的准确性,如交叉验证。它仍然有助于提供预测和结果之间的重要关系的良好估计。这些估计可以用来以更有用和更直观的方式总结数据。
来源
- 统计学习导论及其应用。
- 维基百科(一个基于 wiki 技术的多语言的百科全书协作计划ˌ也是一部用不同语言写成的网络百科全书ˌ 其目标及宗旨是为全人类提供自由的百科全书)ˌ开放性的百科全书
- Quick-R
- 如何统计
- 堆叠交换
- 堆栈溢出
线性回归:钱球—第 1 部分
大众体育故事的统计案例研究
“The macro view of an old baseball on a wood surface” by Joey Kyber on Unsplash
概观
因 2011 年的电影 Moneyball 而走红的最引人注目的体育分析故事之一,2002 年的奥克兰运动家队创造了历史,在 2002 年 8 月 13 日至 9 月期间连续赢了 20 场比赛。
奥克兰运动家队(通常被称为运动家队)在那个赛季的成功很大程度上归功于他们的总经理比利·比恩和前助理总经理保罗·德波斯塔。
DePodesta 毕业于哈佛大学经济学,于 1999 年加入美国棒球协会,并很快开始整合棒球统计数据分析,以评估和购买球员。( Sabermetrics )
这种方法在 2002 年历史性的赛季后受到关注,当时比利·比恩购买了被严重低估的球员,以取代赛季开始前离开的关键球员。由于奥克兰运动家队严重的预算限制,比利求助于 DePodesta 正在研究的方法,以购买被低估的球员来满足加州球队的工资。
Brad Pitt as Billy Beane and Jonah Hill as Paul DePodesta’s counterpart in the movie Moneyball. Source
本文试图重现 Paul DePodesta 的部分分析,以展示最简单的监督学习技术(也称为线性回归)的威力。
放弃
这一分析与麻省理工学院 edXAnalytics Edge课程中的案例研究非常相似。然而,我为本文选择的编程语言是 Python,而不是前面提到的课程中使用的 R。
线性回归
线性回归是机器学习中的一种监督学习算法,它起源于统计学原理。它主要用于模拟一个解释变量(通常为 y ,)与一个或多个自变量(用 X. 表示)之间的关系,当只有一个自变量用于预测 *y,*时,称为简单线性回归或线性回归,而当有多个自变量时,称为多元线性回归。
Linear Regression equation. Source
称为回归系数的β项指的是 x 变量和因变量 y. 之间的关系,让我们用一个例子来说明这一点。
方程式:
房价= 50000+1.35×(房屋面积平方)+ ε
上面的等式是一个回归函数的例子,该函数用于在给定房屋面积(平方英尺)的情况下确定房屋价格。
1.35 是β的值,表示房子、每增加 1 平方英尺,房子的价格就会增加 1.35 美元。如果β的值为-1.35,那么房屋面积每增加 1 平方英尺,就会有 1.35 美元的单位 d **房价下降。****
*误差项ε用于表示残差或 *Y 的实际值和预测值之间的差异。它告诉我们我们的预测值与实际值有多远。
残差公式:
ε=y—ŷt23】
其中 y 表示实际值,而 ŷ 表示我们的模型预测的 y 值。
Plot of Simple Linear Regression with one independent variable. Source
我不会详细讨论β值是如何计算的,模型是如何优化的。相反,让我们直接进入模型构建框架。
资料组
我使用的数据集是从 baseball-reference.com 收集的来自 Kaggle 的 Moneyball 数据集。
探索数据
使用 pandas 库将数据读入 python。
*df = pd.read_csv("baseball.csv")
df.head()*
我们需要在这里定义一些术语:
- RA 代表允许运行。
- RS 代表得分得分。
- OBP 代表基数百分比。
- SLG 代表段塞百分比。
- 巴是击球手。
- OOBP 是对手的 OBP。
- OSLG 是对手的 SLG。
- w 代表该赛季的获胜次数。
增加一个新变量 RD,作为 RS 和 RA 之间的差值。
此外,我们将只保留年< 2002 in order to replicate the data prior to the 2002 season.
We will use plots in order to find insights regarding the distributions of the numerical variables.
Histograms of numerical features
Observe that all four features(variables) are approximately 正态分布的记录。得分得分和允许得分的图表似乎都稍微向左倾斜。运行评分图的尾部似乎比允许运行图的尾部厚。
Statistical analysis clip from Moneyball.(2011) Source
根据 DePodesta 在片段中的角色,为了进入 2002 年的季后赛,运动家队需要至少 99 场胜利。让我们试着想象这种洞察力。
*# Plotting scatterplotplt.figure(figsize=(10,8))
plt.scatter(x=moneyball0.W,y = moneyball0.RS,c="red")
plt.scatter(x=moneyball1.W,y = moneyball1.RS,c="blue")
plt.xlabel("Wins")
plt.ylabel("Runs Scored")
plt.axvline(x = 99)*
从上面的图中我们看到,DePodesta 估计的 99 胜是有道理的,因为似乎只有 3 个观察值(红色)没有以≥ 99 胜进入季后赛。
DePodesta 还计算出,为了进入季后赛,湖人队至少需要 814 分,并且只允许 645 分。这意味着得分得分和允许得分之间的差距大约需要 169(RD)。让我们来看看研发和成功之间的关系。
*x = np.array(moneyball.RD)
y = np.array(moneyball.W)# Deriving slope,intercept valuesslope, intercept = np.polyfit(x, y, 1)
abline_values = [slope * i + intercept for i in x]#Plotting the figureplt.figure(figsize=(10,8))
plt.scatter(x, y)
plt.plot(x, abline_values, 'b')
plt.title("Slope = %s" % (slope))
plt.xlabel("Run Difference")
plt.ylabel("Wins")
plt.show()*
我们可以清楚地看到,两个变量之间的关系是线性的。
*print(np.corrcoef(x,y))output:[[ 1\. 0.93851498]
[ 0.93851498 1\. ]]*
此外,研发和获胜次数之间有很强的相关性0.9385。
因此,我们的探索性数据分析证实了 DePodesta 的估计到目前为止是正确的。在研究的下一部分,我们将建立回归模型来进一步验证 DePodesta 的分析。
请继续关注第二部分。
来源
- *【www.edx.org/course/anal… *
- www.imdb.com/title/tt121…
- en.wikipedia.org/wiki/Linear…
- www.numpy.org/
- matplotlib.org/
线性回归:钱球—第二部分
大众体育故事的统计案例研究
“The macro view of an old baseball on a wood surface” by Joey Kyber on Unsplash
这篇文章是线性回归的续集:金钱球-第一部分。如果你还没有检查,我强烈建议你这样做。
概述
在前一篇文章结束时,我们已经建立了 RD(运行差异)和 W(成功)之间的线性关系。
我们还发现,RD 和 w 之间有非常强的正相关,为 0.9385。在本文中,我们将继续研究数值变量之间的关系,并建立一些模型来预测奥克兰运动家队在 2002 年的表现。
公式
让我们再看一下数据。
df = pd.read_csv("baseball.csv")
df.head()
现在,让我们来看看计算一些对大多数人来说似乎晦涩难懂的数字项的公式。
按基数百分比:
Formula for calculating On-base Percentage. Source
点击量
b:以球(保送)为基础
HBP:投球命中
阿瑟:击球
科幻:牺牲苍蝇
击发百分比:
Formula for calculating Slugging percentage. Source
1B,2B,3B:单打,双打,三连冠
HR:全垒打
阿瑟:击球
击球率:
Formula for calculating Batting average. Source
点击量
阿瑟:击球
探索性数据分析
我们可以看到,前面讨论的所有三个统计数据都以某种方式影响了球队得分的次数。我不会详细解释每个变量。你需要知道的是 OBP,SLG 和 AVG 是特定球队得分的有力指标。
让我们通过绘制这些变量与 RS(得分运行)之间的关系来验证这些假设:
Relationship between OBP, SLG,BA and RS respectively
在每个变量和得分之间有明显的线性关系。
**# Correlation between On-base percentage and runs scored.**print(np.corrcoef(moneyball.OBP,moneyball.RS))output:[[ 1\. 0.90490915]
[ 0.90490915 1\. ]]**# Correlation between Slugging percentage and runs scored.**print(np.corrcoef(moneyball.SLG,moneyball.RS))output:[[ 1\. 0.92638433]
[ 0.92638433 1\. ]]**# Correlation between batting average and runs scored.**print(np.corrcoef(moneyball.BA,moneyball.RS))output:[[ 1\. 0.83162475]
[ 0.83162475 1\. ]]
根据经验,0.7 以上的相关性被认为是强正相关。我们所有的变量都满足这条规则。
类似地,我们可以假设 OOBP(对手的 OBP)和 OSLG(对手的 SLG)与 RA(允许跑垒)有类似的关系。
在我们看到这些变量和 RA 之间的关系之前,我注意到在 OOBP 和 OSLG 列中有几个缺失值。为了画出正确的关系,我们必须去掉这几行观察数据。在以后的文章中,我会解释我们可以“估算”缺失数据的各种方法。
moneyballnew = moneyball.dropna()
我们将缩减的数据集存储到一个新的变量中。
现在让我们看看这些变量与 RA 之间的关系:
Model 大楼
我们现在将建立回归模型,以预测得分、允许得分和获胜。
python 中的 scikit-learn 库在使用很少几行代码构建各种各样的机器学习模型方面非常强大。我们将利用这个库来建立我们的模型。
我们的第一个模型用于预测“得分”。我们的自变量是上垒率、击球率、击球率。
**# Extracting our variables from the dataframe.**
x = moneyball[['OBP','SLG','BA']].values
y = moneyball[['RS']].values**# Calling our model object.**
RS_model = LinearRegression()**# Fitting the model.**
RS_model.fit(x,y) **# Printing model intercept and coefficients.**
print(RS_model.intercept_)
print(RS_model.coef_)Output:[-788.45704708]
[[ 2917.42140821 1637.92766577 -368.96606009]]
因此,我们的模型具有以下形式:
RS =-788.46+2917.42×(OBP)+1637.93×(SLG)-368.97×(巴)
在这一点上,我们注意到一些奇怪的事情。我们的模型有一个负系数的变量,也就是击球率。这是反直觉的,因为一个击球率高的球队应该有更多的得分。这种情况代表了一种被称为 多重共线性 的现象,其导致多重线性回归模型中的差异。
为了避免多重共线性,我们必须添加一个 交互变量 或者删除导致差异的变量。为了简单起见,让我们把 BA 从模型中去掉。
**# Extracting our variables from the dataframe.**
x = moneyball[['OBP','SLG']].values
y = moneyball[['RS']].values**# Calling our model object.**
RS_model = LinearRegression()**# Fitting the model.**
RS_model.fit(x,y)**# Printing model intercept and coefficients.**
print(model.intercept_)
print(model.coef_)Output:[-804.62706106]
[[ 2737.76802227 1584.90860546]]
我们的改良模型是:
RS =-804.63+2737.77×(OBP)+1584.91×(SLG)
类似地,我们使用对手的上垒百分比和对手的击球百分比作为独立变量来建立“允许跑垒”的模型:
**# Extracting our variables from the dataframe.**
x = moneyballnew[['OOBP','OSLG']].values
y = moneyballnew[['RA']].values**# Calling our model object.**
RA_model = LinearRegression()**# Fitting the model.**
RA_model.fit(x,y)**# Printing model intercept and coefficients.**
print(RA_model.intercept_)
print(RA_model.coef_)Output:
[-837.37788861]
[[ 2913.59948582 1514.28595842]]
允许运行的型号:
RA =-837.38+2913.60×(OOBP)+1514.29×(OSLG)
最后,我们从运行差异中预测成功的模型:
**# Extracting our variables from the dataframe.**
x = moneyball[['RD']].values
y = moneyball[['W']].values**# Calling our model object.**
W_model = LinearRegression()**# Fitting the model.**
W_model.fit(x,y)**# Printing model intercept and coefficients.**
print(W_model.intercept_)
print(W_model.coef_)Output:[ 80.88137472]
[[ 0.10576562]]
成功的模式:
W = 80.88 + 0.11 ×(RD)
模型预测
以下是奥克兰运动家队 2001 年季后赛前的统计数据。
OBP: 0.339
比重:0.430
OOBP: 0.307
OSLG: 0.373
让我们将这些值代入上述模型以生成预测。
**# Prediction for runs scored.**
RS_model.predict([[0.339,0.430]])Output:
array([[ 804.98699884]])**# Predictions for runs allowed.**
RA_model.predict([[0.307,0.373]])Output:
array([[ 621.92581602]])
因此,我们的模型预测了以下情况:
805 卢比
RA 约 622
这意味着 RD = 183。
最后,我们将研发纳入我们的 wins 模型:
**# Prediction for wins.**
W_model.predict([[183]])Output:
array([[ 100.23648363]])
将我们的模型结果与实际结果和 De Podesta 的估计进行比较,我们得到:
很不寻常,不是吗?与现实相比,我们模型的预测实际上相当准确。
结论
最后,我们总结了线性回归应用于 Sabermetrics 的案例研究。需要注意的重要一点是,在这个案例研究中,我对我们的回归模型做了很多假设。在以后的帖子中,我将深入讨论回归假设以及如何避免违反它们。
我希望你们都喜欢这篇关于线性回归的分为两部分的博文。如果你喜欢我的内容,我将非常感谢鼓掌和关注。完整的代码可在这里获得。
我期待着问题,评论,关注。下次见,伙计们。✌🏽
参考
波士顿住房数据的线性回归
Credits: www.wbur.org/radioboston…
在我之前的博客中,我介绍了线性回归和梯度下降的基础知识。为了获得动手操作的线性回归,我们将采用原始数据集并应用我们所学的概念。
我们将获取包含波士顿不同房屋信息的住房数据集。这些数据最初是 UCI 机器学习知识库的一部分,现在已经被删除。我们也可以从 scikit-learn 库中访问这些数据。该数据集中有 506 个样本和 13 个特征变量。目标是使用给定的特征来预测房屋的价格值。
所以让我们开始吧。
首先,我们将导入所需的库。
接下来,我们将从scikit-learn库中加载住房数据并理解它。
我们打印出boston_dataset的值来理解它包含的内容。print(boston_dataset.keys())慨然
dict_keys(['data', 'target', 'feature_names', 'DESCR'])
- 数据:包含各种房屋的信息
- 目标:房价
- 特征名称:特征的名称
- 描述:描述数据集
使用boston_dataset.DESCR了解更多功能,所有功能的描述如下:
**CRIM**: Per capita crime rate by town
**ZN**: Proportion of residential land zoned for lots over 25,000 sq. ft
**INDUS**: Proportion of non-retail business acres per town
**CHAS**: Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
**NOX**: Nitric oxide concentration (parts per 10 million)
**RM**: Average number of rooms per dwelling
**AGE**: Proportion of owner-occupied units built prior to 1940
**DIS**: Weighted distances to five Boston employment centers
**RAD**: Index of accessibility to radial highways
**TAX**: Full-value property tax rate per $10,000
**PTRATIO**: Pupil-teacher ratio by town
**B**: 1000(Bk — 0.63)², where Bk is the proportion of [people of African American descent] by town
**LSTAT**: Percentage of lower status of the population
**MEDV**: Median value of owner-occupied homes in $1000s
变量MEDV表示的房屋价格是我们的目标变量,剩下的是 特征变量 ,我们将基于这些变量来预测房屋的价值。
我们现在将使用pd.DataFrame将数据加载到 pandas 数据帧中。然后我们使用head()打印前 5 行数据
我们可以看到数据中缺少目标值MEDV。我们创建一个新的目标值列,并将其添加到 dataframe 中。
数据预处理
加载数据后,最好查看数据中是否有任何缺失值。我们使用isnull()计算每个特征的缺失值的数量
但是,该数据集中没有缺失值,如下所示。
探索性数据分析
探索性数据分析是训练模型前非常重要的一步。在本节中,我们将使用一些可视化工具来理解目标变量与其他特征之间的关系。
让我们先画出目标变量MEDV的分布。我们将使用seaborn库中的distplot函数。
我们看到MEDV的值呈正态分布,很少有异常值。
接下来,我们创建一个相关矩阵来度量变量之间的线性关系。可以通过使用 pandas 数据帧库中的corr函数来形成相关矩阵。我们将使用 seaborn 库中的heatmap函数来绘制相关矩阵。
相关系数范围从-1 到 1。如果该值接近 1,则意味着这两个变量之间有很强的正相关性。当它接近-1 时,变量具有很强的负相关性。
观察:
- 为了拟合线性回归模型,我们选择那些与我们的目标变量
MEDV高度相关的特征。通过查看相关矩阵,我们可以看到RM与MEDV(0.7)有很强的正相关性,而 asLSTAT与MEDV(-0.74)有很强的负相关性。 - 为线性回归模型选择特征的重要一点是检查多重共线性。特征
RAD、TAX具有 0.91 的相关性。这些特征对彼此之间有很强的相关性。我们不应该同时选择这两个特征来训练模型。查看这个以获得解释。具有-0.75 相关性的特征DIS和AGE也是如此。
基于以上观察我们将RM和LSTAT作为我们的特征。使用散点图,让我们看看这些特性如何随MEDV变化。
观察:
- 价格随着 RM 值的线性增加而增加。很少有异常值,数据似乎上限为 50。
- 随着物价的上涨,价格有下降的趋势。尽管它看起来并不完全是一条直线。
准备用于训练模型的数据
我们使用 numpy 库提供的np.c_来连接LSTAT和RM列。
将数据分成训练集和测试集
接下来,我们将数据分成训练集和测试集。我们用 80%的样本训练模型,用剩下的 20%进行测试。我们这样做是为了评估模型在未知数据上的表现。为了分割数据,我们使用 scikit-learn 库提供的train_test_split函数。最后,我们打印出训练集和测试集的大小,以验证拆分是否正确发生。
*(404, 2)
(102, 2)
(404,)
(102,)*
训练和测试模型
我们使用 scikit-learn 的LinearRegression在训练集和测试集上训练我们的模型。
模型评估
我们将使用 RMSE 和 R2 分数来评估我们的模型。
***The model performance for training set**
--------------------------------------
RMSE is 5.6371293350711955
R2 score is 0.6300745149331701 **The model performance for testing set**
--------------------------------------
RMSE is 5.137400784702911
R2 score is 0.6628996975186952*
这是一个好的开始。在接下来的博客中,我们将探讨提高模型性能的方法。
完整的 Jupyter 笔记本可以在这里找到。
结论
在这个故事中,我们对波士顿住房数据集应用了线性回归的概念。我建议也尝试其他数据集。
这里有几个可以查找数据的地方
感谢阅读!!
在本系列的下一部分,我们将讨论多项式回归。请继续关注这个空间。
线性回归(第 1 部分):类型,例子,梯度下降的例子
5 分钟机器学习实现示例(第 3 部分)。用 python 实现线性回归中的机器学习模型。
Linear Regression
先决条件: 机器学习类型及算法列表
线性回归 是统计学和机器学习中最常见、约 200 年历史且最容易理解的一种。如前一篇文章所解释的,它属于预测建模。预测建模是这里的一种建模,对于给定的输入(X) 可能的输出(Y) 是基于先前的数据或值预测的。
类型
- 简单线性回归:以一个自变量 为特征。考虑一下 房子的价格 只基于一个领域,即地块的大小,那么这将是一个简单的线性回归。
- 多元线性回归:以多个自变量 为特征。如果房子的价格不仅仅取决于地块面积的大小,还取决于经济,那么它就被认为是多元线性回归,这在大多数现实世界中是可行的。
方程式:
Y = a X+ b
这里的主要目的是找到最佳拟合线,该线最小化误差(点与线之间距离的平方和)。取点和线 之间的 距离,并对它们中的每一个进行 平方 以去除 负值 ,然后对这些值求和,从而给出需要最小化的误差。
如何将误差降至最低??
考虑下面的例子,其中绘制了三个点。
在我们需要最小化线和三个点之间的距离的地方画一条随机线
这里的误差是从点到红色线的距离。
错误的 ie。点和线之间的距离被总结并表示如下。
现在让我们把线向任何方向移动,画出误差。
在这里,由于线已经远离点,误差增加,误差被累加,如下所示。
这里,线向相反的方向移动,因为之前误差增加了,结果如下。
与以前的实例相比,这里的错误被最小化。
误差仍然可以被最小化,如下所示。
但是由于它导致负值,我们实现梯度下降(最小二乘法),其中误差值被平方,这仅导致可以精确测量误差的正值(这样做是因为距离不能以负值测量)。
数学上
- 红线误差:3 + 4 + 6 = 10 平方— — 4 + 9 + 25 = 38
- 黄线误差:4 + 5 + 7= 13 平方— 9 + 16 + 36 = 61
- 蓝线误差:1 + 2 + 4 = 7 平方— — 1 + 4 +16 = 21
- 最小误差:1–3+1 =-1这是没有意义的,但平方后得到 1 + 9 + 1 = 11
所以这里 61 > 38 > 21 > 11 是有意义的,而不是处理难以想象和处理的负距离。
因此,与其他实例相比,梯度下降(最小二乘法)是找到最小误差的最佳方法。
在下一篇文章中,我举了一个现实世界的例子,并实现了即将到来的线性回归(机器学习),敬请关注!!!!
更多参考文献:
接下来我有 线性回归(第二部分) 接下来一定要关注我的 中 ,LinkedIn,Twitter,insta gram获取更多更新。如果你喜欢这篇文章,请鼓掌并分享它。
在这里加入我们的 WhatsApp 社区。
简化线性回归-普通最小二乘法与梯度下降法
什么是线性回归? 线性回归是一种寻找自变量和因变量之间关系的统计方法。让我们用一个简单的数据集来解释线性回归模型。
Table 1 : Sample Salary Data
Figure 1: Scatter Plot Diagram
为什么我们称它们为自变量和因变量?
Table 2: Sample dataset with independent & dependent variables hints
如果以我们的示例数据集为例,“工作经验年数”列是自变量,“年薪 1000 美元”列的值是因变量。我们的自变量是独立的,因为我们不能用数学方法确定经验的年限。但是,我们可以根据多年的经验来确定/预测工资列的值(因变量)。如果你看数据,依赖列值(薪水在 1000 美元)是根据多年的经验增加/减少的。
**总平方和(SST):**SST 是一个样本的平均值与该样本中各个值之间所有平方差的总和。它在数学上用公式表示。
Table: SST Calculation
SST 输出的平方和为 5226.19 。为了对线截距进行最佳拟合,我们需要应用线性回归模型来尽可能减小 SSE 值。为了确定斜率截距,我们使用以下等式
y = mxb,
- “m”是斜率
- x’→独立变量
- b '是截距
我们将使用普通的最小二乘法来寻找最佳线截距(b)斜率(m)
普通最小二乘法(OLS)方法
为了使用 OLS 方法,我们应用下面的公式来找到方程
我们需要计算斜率‘m’和线截距‘b’。下面是计算这些值的简单表格。
Table 4: OLS method calculations
m = 1037.8/216.19 m = 4.80 b = 45.44-4.80 * 7.56 = 9.15 因此,y = mx+b→4.80 x+9.15 y = 4.80 x+9.15
让我们将 OLS 方法的结果与 MS-Excel 进行比较。是的,我们可以在 Microsoft Excel 中测试我们的线性回归最佳直线拟合。
Figure 2: Linear Regression using MS-Excel
精彩!我们的 OLS 方法与 MS-Excel 输出的“y”非常相似。
- 我们的 OLS 方法输出→y = 4.80 x+9.15
- MS-Excel 线性调节器。输出→y = 4.79 x+9.18
让我们通过使用我们的输出方程再次计算 SSE。
Table 5: SSE calculations again after OLS method implementation
现在,误差平方和从 5226.19 显著降低到 245.38。
普通的最小二乘法看起来简单,计算容易。但是,这种 OLS 方法既适用于单自变量和单因变量的单变量数据集,也适用于多变量数据集。多变量数据集包含单个自变量集和多个因变量集,需要我们使用一种叫做“梯度下降”的机器学习算法。
梯度下降算法
梯度下降算法的主要目标是最小化成本函数。这是最大限度减少误差(实际值和预测值的差异)的最佳优化算法之一。
我们来表示假设 h,它是函数或者是一个学习算法。
目标类似于上面的操作,我们在斜率“m”中找出截距线“y”的最佳拟合。同样使用梯度下降算法,我们将通过应用θ0 和θ1 的各种参数来计算出最小成本函数,并查看斜率截距,直到它达到收敛。
在一个真实世界的例子中,找到一个最佳方向走下坡路是相似的。
Figure 3: Gradient Descent 3D diagram. Source: Coursera — Andrew Ng
我们向趴下的方向迈一步。从每一步开始,你都要再次观察方向,以便更快地下山和更快地下山。在该算法中使用类似的方法来最小化成本函数。
我们可以使用成本函数来衡量假设函数的准确性,公式如下
梯度下降为线性回归
为什么我们在方程中使用偏导数?偏导数表示作为变量变化的函数的变化率。在我们的例子中,我们改变θ0 和θ1 的值,并确定变化率。为了将变化率值应用于θ0 和θ1,下面是用于θ0 和θ1 的等式,以将其应用于每个时期。
要找到最佳最小值,请重复上述步骤,对θ0 和θ1 应用不同的值。换句话说,重复步骤直到收敛。
Figure 4: Gradient Descent for linear regression. Source: sebastianraschka.com/ — Python Machine Learning, 2nd Edition
- 其中,α(a)是学习速率/下坡需要多大的步长。
梯度下降算法的类型
有三种梯度下降算法:
1.批次梯度下降 2。随机梯度下降 3。小批量梯度下降
批量梯度下降
- 在批量梯度下降中,为了计算成本函数的梯度,我们需要对每个步骤的所有训练样本求和
- 如果我们有 3 百万个样本(m 个训练样本),那么梯度下降算法应该对每个时期的 3 百万个样本求和。要移动一步,我们要用 300 万次来计算每一步!
- 批量梯度下降不太适合大型数据集
- 下面是批量梯度下降算法的 python 代码实现。
随机梯度下降(SGD)
- 在随机梯度下降中,我们在每次迭代中使用一个示例或一个训练样本,而不是使用整个数据集来对每个步骤求和
- SGD 广泛用于大型数据集训练,计算速度更快,并且可以并行训练
- 在计算之前,需要随机打乱训练样本
- 下面是 SGD 的 Python 代码实现
小批量梯度下降
- 它类似于 SGD,它在每次迭代中使用 n 个样本,而不是 1 个。
概要:
在总结中,对以下主题进行了详细解释。
- 线性回归的自变量和因变量
- 普通最小二乘法(OLS)和误差平方和(SSE)详细信息
- 线性回归模型的梯度下降及梯度下降算法的类型。
参考:
- https://www . coursera . org/learn/machine-learning/lecture/rktp 3/cost-function
- https://github . com/rasbt/python-machine-learning-book-2nd-edition
线性回归烂透了。
线性回归。这是有史以来第一种被深入研究的回归分析,是任何监督学习课程的基础,是…你明白了吧。很糟糕。
在现实世界中,线性回归(GLS)表现不佳有多种原因:
- 对异常值和质量差的数据很敏感—在现实世界中,数据经常受到异常值和质量差的数据的污染。如果异常值相对于非异常值数据点的数量多于几个,那么线性回归模型将偏离真正的基本关系。
- 它要求所有变量都是多元正态的(单变量高斯到更高维的推广)—使用非线性变换将非正态变量变换为正态变量(例如,通常对数变换可以解决这个问题)可能会引入多重共线性效应。
- 它假设变量之间没有(或很少)多重共线性(即变量相互独立)——这使得模型极其不稳定。虽然测试和删除很简单,但这可能会很痛苦。
- 它假设了 homoscedassity(希腊语: homo “相同” skedasis “分散”)——也就是说,误差项的标准差是恒定的。如果线性回归是蓝色的(最佳线性无偏估计量),它们还必须是不相关的,并且具有零均值
- 它要求我们的因变量和预测变量之间的关系是线性的——嗯,这是它的名字(我仍然认为值得一提,尽管这篇文章是关于线性估计量的)。
作为一个典型的经验法则,使用参数方法,如线性回归,当你的数据是高质量的,这样的方法会更有效。非参数方法(不假设数据的某种潜在分布)在交换中使用数据的效率较低,无法消除某种类型的假设。
但是这些非参数线性方法是什么呢?这里有几个我最喜欢的。
泰尔森估计器
Theil-Sen 估计量可以有效地计算,并且对异常值不敏感。即使数据是正态分布的并且数据是高质量的(即不存在异常值),它仍然比最小二乘回归有竞争力。低效率的问题(它以 O(n)运行),但是使用诸如随机采样或者甚至一些确定性方法的方法,这可以减少到 O(n log n)。此外…这几乎不是一个深度卷积神经网络,你不会用这些简单的方法进行大量的计算。
从概念上讲,这非常简单:计算因变量和自变量之间所有组合的所有斜率值的中值,由此斜率可以通过使用(yj-易)/(XJ-*Xi)*来确定。
最小修剪正方形
最小修整平方是一种稳健的回归方法(一种旨在规避某些回归模型的一些缺点的回归形式),与 Theil-Sen 和即将推出的 MM 估计器一样,它对异常值的影响不敏感。
LTS 不是像标准最小二乘法那样最小化所有 n 个点的残差平方和,而是最小化一个 k
Theil Sen, it’s a fairly inefficient method.
MM 估计值
1973 年,Peter J. Huber 引入了一种称为 M-估计(M 代表“最大似然型”)的回归方法,该方法对响应中的异常值稳健,但对解释变量不稳健,由于显而易见的原因,该方法并不理想。然而,它非常有效。
然后是 S-估计(S 代表“比例”)技术,其思想是找到一个平面,使残差比例的稳健估计最小化。它对异常值和杠杆点有很强的抵抗力,但是对于实际应用来说效率太低。
最后,像一个无畏的骑士骑着种马投入战斗一样,MM 估计出现了,它结合了 S 估计的稳健性和 M 估计的效率。它的工作原理是找到一个稳健的 S 估计,使残差标度的 M 估计最小化,它保持不变,同时找到参数的接近 M 估计。
少数几篇论文将 MM 估计量与最小修整平方和 OLS 进行了比较,MM 估计量是其中的首选。
贝叶斯稳健回归
Normal vs Student-T distributions
将正态分布替换为具有大约 5 个自由度的重尾 t 分布(但要进行测试和比较)在各种实际情况下都能很好地工作。贝叶斯稳健回归依赖于这样的分布。t 分布的尾部有更多的“肉”,这意味着我们在那里采样的概率比在正态分布的相同位置采样的概率更高。异常值对我们的估计影响较小,因为似然函数假设异常值更有可能出现。
其原因是因为高相关性将使设计矩阵(您的数据)与其自身一起转置(计算估计量所需的步骤)奇异,因此无法求逆,因为行列式为零,所以不存在估计量。即使它几乎是奇异的,也很可能是计算不稳定的。
注意,如果你考虑异方差,那么线性回归往往是最好的结果…我猜它实际上并不总是很糟糕。
线性回归:更简单的方法
线性回归是神奇的机器学习世界中最棒的入门途径!也是最简单易学的算法。
我将更多地关注代码,而不是理论,因为代码更有趣:)但只是为了激发你大脑中静止的线性回归神经元。
线性回归:这是一种寻找具有“最佳拟合线”的模式的方法(因此,“线性”懂了吗?)在你的数据里。
看起来像这样(对于任何 x 或 y 轴)
Fig: Linear Regression Example
在本例中,我们将使用“load_boston”数据集,即 scikit learn 提供的波士顿房价数据集。
完整代码:)
Fig: Linear Regression with sklearn (Boston Housing dataset)
代码洞察:
上述代码分为 5 个步骤..
- 加载和预先打印数据集。
Fig: Importing the Dataset
从 sklearn.datasets 导入 load_boston
load = load_boston()
上面的第一行从数据集集合中导入 load_boston 数据集,该集合存在于 sklearn 库中。
第二行只是将 load_boston 放入 load 变量中以备后用。很简单…
导入 pprint
【pprint . pprint(波士顿)
导入 preetprint 库,它用来使我们的输出看起来简洁易懂,然后我们就可以简单地打印它了。
注意:-当我们预测时,没有必要使用最后两行 preety 打印。因为您不需要再次打印数据文件,所以此属性打印仅用于您理解数据集文件的目的。
2.创建数据帧。
Fig: Creating two (DataFrame) array of data
在这里,我们将使用熊猫库创建两个数据帧*。Dataframe* 只是一个用来制作数据集或数组的花哨词。 df_x 包含具有列= boston 的房屋的数据或特征。features_names 也是出现在数据集中的一个数组,以便更清楚地理解, df_y 分别包含目标价格。
3.选择模型(即线性回归)
Fig: Selecting LinearRegression() model
虽然很简单,但我们从 sklearn 库中导入了 LinearRegression() 模型,并将该模型赋予变量 model ,以便在代码中进一步使用。
4.分裂测试和用随机性训练数据集。
Fig: Train and Test Splitting
这里,我们使用来自 sklearn 库的 train_test_split 。上面代码中的这个函数需要四个参数 data DataFrame、 target DataFrame、test_size、random_state(只是为了混洗数据)。
注意:在上面的行中,由于 test_size =0.2,train_size 自动给定为 0.8,因此,test_size + train_size = 0.2+0.8 = 1
5.列车和预测。
Fig: Train and predict the dataset
在上面的代码中, fit (aka TRAINING ) 函数采用两个参数 x_train,y_train 并用给定的数据集训练模型。
接下来,我们将使用选择的模型(即 LinearRegression())从 x_test 数据集预测y _ test,并将预测值数组放入结果变量中。然后我们只是打印第五个预测值(即结果[5])和完整的 y_test 数据集。你应该从别的地方得到 5 ,只要记住在列表中从 0 开始计数,而不是从 1 开始计数。
结果
Fig: Results
可以看到,第一个***【25.43573299】是对数组中第五个元素的预测,即 70 — — 24.2, 相当接近。如果你想知道第一行随机数是什么,嗯…它是相对于随机选择的 y_test 数据集值的序列号*(在第 4 步中)。
只是一个线性回归的 gif 来理解一下。
完整代码: Github
在中关注我,获取类似帖子。
如果你有任何意见或问题,请写在评论里。
鼓掌吧!分享一下!跟我来。
乐意帮忙。荣誉……..
你会喜欢的以前的故事:
4.感知器是什么鬼?