1. 首页
  2. 技术文章

用Python如何实现简单的线性回归

用Python如何实现简单的线性回归

线性回归是一种已有200多年历史的预测方法。

简单的线性回归是一种很好的第一种机器学习算法,因为它需要您从训练数据集中估算属性,但是对于初学者来说足够简单。

在本教程中,您将发现如何从头开始在Python中实现简单的线性回归算法。

完成本教程后,您将知道:

  • 如何从训练数据中估计统计量。
  • 如何根据数据估算线性回归系数。
  • 如何使用线性回归对新数据进行预测。

简单线性回归

线性回归假设输入变量(X)和单个输出变量(y)之间存在线性或直线关系。

更具体地说,可以根据输入变量(X)的线性组合来计算输出(y)。当只有一个输入变量时,该方法称为简单线性回归。

在简单的线性回归中,我们可以使用训练数据的统计数据来估计模型对新数据进行预测所需的系数。

一个简单的线性回归模型的行可以写成:

y = b0 + b1 * x

其中b0和b1是我们必须从训练数据中估计的系数。

一旦知道了系数,就可以给定x的新输入示例,使用该方程式估算y的输出值。

它要求您根据数据计算统计属性,例如均值,方差和协方差。

所有代数都已经处理完了,我们剩下一些算法来估计简单的线性回归系数。

简而言之,我们可以如下估算系数:

B1 = sum((x(i) – mean(x)) * (y(i) – mean(y))) / sum( (x(i) – mean(x))^2 )

B0 = mean(y) – B1 * mean(x)

其中i表示输入x或输出y的ith值的值。

如果现在还不清楚,请不要担心,这些是将在本教程中实现的功能。

瑞典保险数据集

我们将使用真实的数据集来演示简单的线性回归。

该数据集称为“瑞典的汽车保险”数据集,涉及在给定索赔总数(x)的情况下,以千瑞典克朗(y)预测所有索赔的总付款额。

这意味着对于新的索偿(x),我们将能够预测索偿的总付款(y)。

这是数据集的前5条记录的一个小样本。

108,392.5
19,46.2
13,15.7
124,422.2
40,119.4

使用零规则算法(可预测平均值),预计均方根误差或RMSE约为81(千克朗)。

下面是整个数据集的散点图。

用Python如何实现简单的线性回归

将其保存到本地工作目录中的CSV文件中,名称为“ insurance.csv ”。

请注意,您可能需要将欧洲“,”转换为小数点“。”。您还需要将文件从空格分隔的变量更改为CSV格式。

教程

本教程分为五个部分:

  1. 计算均值和方差。
  2. 计算协方差。
  3. 估计系数。
  4. 作出预测。
  5. 预测保险。

这些步骤将为您提供实施和训练针对您自己的预测问题的简单线性回归模型所需的基础。

1.计算均值和方差

第一步是从训练数据中估计输入和输出变量的均值和方差。

数字列表的平均值可以计算为:

mean(x) = sum(x) / count(x)

下面是一个名为mean()函数,该函数针对数字列表实现此行为。

  # Calculate the mean value of a list of numbers
def mean(values):
return sum(values) / float(len(values))

方差是每个值与平均值的平方和差。

数字列表的方差可以计算为:

  variance = sum( (x – mean(x))^2 )

下面是一个名为variance()的函数,该函数计算数字列表的样本方差(请注意,我们有意计算均值的平方和差,而不是均值的平方差)。它要求将列表的均值作为参数提供,只是为了使我们不必多次计算它。

  # Calculate the variance of a list of numbers
def variance(values, mean):
return sum([(x-mean)**2 for x in values])

我们可以将这两个函数放在一起,并在一个小的人为数据集上对其进行测试。

以下是x和y值的小型数据集。

注意:如果将列标题保存到.CSV文件中以供最终代码示例使用,请从此数据中删除列标题。

x, y
1, 1
2, 3
4, 3
3, 2
5, 5

我们可以在散点图上绘制该数据集,如下所示:

用Python如何实现简单的线性回归

在下面的示例中,我们可以计算x和y值的均值和方差。

Estimate Mean and Variance
Calculate the mean value of a list of numbers
def mean(values):
return sum(values) / float(len(values))

Calculate the variance of a list of numbers
def variance(values, mean):
return sum([(x-mean)**2 for x in values])

calculate mean and variance
dataset = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]]
x = [row[0] for row in dataset]
y = [row[1] for row in dataset]
mean_x, mean_y = mean(x), mean(y)
var_x, var_y = variance(x, mean_x), variance(y, mean_y)
print(‘x stats: mean=%.3f variance=%.3f’ % (mean_x, var_x))
print(‘y stats: mean=%.3f variance=%.3f’ % (mean_y, var_y))

运行此示例将打印出两列的均值和方差。

这是我们的第一步,接下来我们需要将这些值用于计算协方差。

2.计算协方差

两组数字的协方差描述了这些数字如何一起变化。

协方差是相关性的概括。相关描述了两组数字之间的关系,而协方差可以描述了两组或更多组数字之间的关系。

另外,可以对协方差进行归一化以产生相关值。

尽管如此,我们可以如下计算两个变量之间的协方差:

下面是一个名为covariance()的函数,该函数实现了此统计信息。它建立在上一步的基础上,并将x和y值的列表以及这些值的平均值作为参数。

我们可以在与上一节相同的小型人为数据集上测试协方差的计算。

综上所述,我们得到以下示例。

运行此示例将打印x和y变量的协方差。

现在,我们已经准备好了所有部分来计算模型的系数。

3.估计系数

我们必须在简单的线性回归中估算两个系数的值。

第一个是B1,可以估计为:

我们已经在上面学到了一些东西,可以将此算法简化为:

我们已经具有计算covariance()variance()的函数。

接下来,我们需要估计B0的值,也称为截距,因为它控制与y轴相交的直线的起点。

同样,我们知道如何估计B1,并且我们有一个函数来估计mean()

我们可以将所有这些放到一个名为coefficients()的函数中,该函数将数据集作为参数并返回系数。

我们可以将其与前两个步骤中的所有函数放在一起,并测试系数的计算。

运行此示例将计算并打印系数。

现在我们知道了如何估计系数,下一步就是使用它们。

4.做出预测

简单线性回归模型是一条线,该线由从训练数据估计的系数定义。

一旦系数被估计,我们就可以用它们来进行预测。

使用简单的线性回归模型进行预测的方程式如下:

下面是一个名为simple_linear_regression()的函数,该函数实现了预测方程以对测试数据集进行预测。它还将上述步骤中训练数据的系数估计联系在一起。

从训练数据准备的系数用于对测试数据进行预测,然后将其返回。

让我们将我们学到的所有知识汇总起来,并对简单的人为数据集做出预测。

作为此示例的一部分,我们还将添加一个用于管理对预测的评估的函数称为validate_algorithm()和另一个用于对预测的均方根误差进行估计的函数rmse_metric()

下面列出了完整的示例。

运行此示例将显示以下输出,该输出首先列出预测和这些预测的RMSE。

最后,我们可以将预测绘制成一条线并将其与原始数据集进行比较。

用Python如何实现简单的线性回归

用于简单线性回归的小型人为数据集的预测

5.预测保险

现在,我们知道如何实现简单的线性回归模型。

让我们将其应用于瑞典保险数据集。

本部分假定您已将数据集下载到文件insurance.csv,并且在当前工作目录中可用。

在前面的步骤中,我们将为简单的线性回归添加一些便利功能。

特别是加载CSV文件的函数称为load_csv(),将加载的数据集转换为数字的函数称为str_column_to_float(),该函数使用训练和测试集评估算法的函数称为train_test_split(),计算RMSE的函数称为rmse_metric ()和一个用于评估算法的函数,称为valuate_algorithm()

下面列出了完整的示例。

60%的数据的训练数据集用于准备模型,其余40%则进行预测。

运行算法将在训练数据集上打印出训练模型的RMSE。

得分约为33(千克朗),比零规则算法(在同一问题上达到约81(千克朗))要好得多。

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code