简单的线性回归详细说明

Tavish Aggarwal.

在这篇文章中,我们将开始学习线性回归算法。我们正在以线性回归启动,因为它很容易理解,但非常强大的算法解决机器学习问题。 

我们将在与帖子一起处理时进行实践。我将使用Sklearn的波士顿房屋价格数据集来解释线性回归。

在我们开始之前让我们只是导入数据并创建数据帧。

import pandas as pd
from sklearn.datasets import load_boston

boston = load_boston()
data = pd.DataFrame(boston.data,columns=boston.feature_names)
data['price'] = pd.Series(boston.target)
print(data.head())

笔记: 在此帖子中,我们将仅使用一列:

  • RM:每住房的平均房间数量

有不同类型的回归,我们可以根据我们预测的数据和结果进行:

  1. 简单的线性回归:单个独立和目标变量的回归
  2. 多线性回归:具有多个自变量的回归

在这篇文章中,我们将涵盖简单的线性回归。首先,让我们通过定义线性回归来开始。

线性回归

线性回归是在从属变量或目标变量和一个或多个独立变量之间找到最佳直线配合的方法。在其他术语中,找到了讲述目标变量(Y)与所有独立变量(x)之间关系的最佳拟合线。

在这里,我们将在波士顿数据集中找到价格和RM之间的最佳拟合线(平均房间数量)列。该分布如下所示:

 线性回归

我们解决线性回归时的目标是找到该线也知道作为最佳方式适合独立变量的回归线。在这种情况下,由于我们只有一个变量,因此我们最好的合适线将是:

价格= M(RM)+ B,其中M和B是我们需要适应的变量。

要找到M和B的值,我们尝试使用不同的值并计算每个组合的成本函数。我们有两种不同的方法,我们使用线性回归并最小化以获得最佳拟合线。这些都是:

  1. 普通的最小二乘(OLS)估计
  2. 均值误差(MSE)

在我们前进之前,让我们专注于其中一个数据点并了解将有助于我们详细了解概念的术语:

请参阅下面显示的图表:

 数据点度量标准

笔记:

  1. 在这里,固体红线是在数据集上安装的最佳配合线。
  2. 虚线的绿线是目标变量的平均值
  3. YI是来自数据集的观察结果之一,YP是观察的预测值,并且Y平均值是观察的平均点。

我们计算有几个指标,以找到最佳拟合线。

ess. :解释了广场的总和

也称为由于回归引起的平方和(SSR)是预测值与目标变量的平均值的偏差的平方和。

笔记:  不要与平方残留的总和混淆。我们会偶尔了解它。

它被认为是:

 ess.

rss. :剩余平方和

也称为平方残差(SSR)或平方误差(SSE)的总和是残差的平方之和I.E偏离实际值。它被认为是:

 rss.

TSS:正方形总和

也称为SST被定义为从属变量和其平均值的差异的平方和。

 TSS.

请注意   TSS. = ESS + RSS

RSE:残留的方形错误

残余方误差或剩余标准误差是平均误差的正平方根。它被认为是:

RSE=√RSS/df  

请注意,DF =自由度。并表示为:

df = n - 2 (其中n是数据点数)

r平方

r平方解释了模型的强度。 R平方定义了模型解释了特征的变化程度。 (在这种情况下,最好的FT线)。

r²或也称为Pearson相关的平方是:

 1 - (RSS / TSS)

现在,我们知道使用R平方和目标计算模型的强度,目标是将R平方接近1.0或100%。 (因为我们的目的是我们的模型应该尽可能多的差异)

我们有明确的照片(如果解释的概念不清楚,请在评论部分中告诉我。让我们定义我们可以使用的成本函数来找到最适合的线。线性回归的成本函数表示为:

北京快3app下降成本函数

这是剩余差异的平方之和。

普通最小二乘

它是用于最小化预测值与实际值之间距离的平方的估计技术。要使用OLS方法,我们应用以下公式以找到等式:

 OLS公式

如果您对OLS公式背后的推导感兴趣,请参阅 这里 .

现在我们已经看到了等式,让我们使用RM创建一个线性回归模型作为独立变量和价格作为从属变量。

def ols(x,y):
    x_mean = x.mean()
    y_mean = y.mean()
    slope = np.multiply((x - x_mean), (y - y_mean)).sum() / np.square((x - x_mean)).sum()
    beta_0 = y_mean - (slope * x_mean)
    
    def lin_model(new_x, slope = slope, intercept=beta_0):
        return (new_x, slope, intercept)

    return lin_model

ols. 函数计算OLS方程和LIN_MODEL功能为新数据集提供最佳拟合线。

line_model = ols(X_train, y_train)
new_x, slope, intercept = line_model(X_test)

笔记:  我们使用培训数据集培训和测试数据集以测试准确性。

现在我们有斜率和截止值,是时候绘制最佳拟合线并想象结果。

plt.scatter(data['RM'], data['price'])
plt.plot(data['RM'], data['RM'] * slope + intercept, '-r')
plt.xlabel("Average number of rooms per dwelling")
plt.ylabel("Price")
plt.title("Average number of rooms vs house Price")

输出:

 ols.

以上代码仅用于直观的理解。在解决基于行业的问题中,我们使用Sklearn linearregression. 功能找到最佳拟合线,它使用OLS估计。

y = data['price'].values.reshape(-1, 1)
X = data['RM'].values.reshape(-1, 1)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.33, random_state = 5)

from sklearn.linear_model import LinearRegression
lm = LinearRegression()
lm.fit(X_train, y_train)

在上面显示的代码中,我们创建了一个适合散点图的线性模型。让我们看看在培训过程中学到的最佳拟合线。

import matplotlib.pyplot as plt

plt.scatter(data['RM'], data['price'])
plt.plot(data['RM'], data['RM'] * lm.coef_[0] + lm.intercept_, '-r')
plt.xlabel("Average number of rooms per dwelling")
plt.ylabel("Price")
plt.title("Average number of rooms vs house Price")

输出:

 线性回归

我们可以看到使用OLS函数手动绘制的曲线,而Sklearn LineArregression函数是相同的。预期的是Sklearn线性回归函数使用OLS估计器来找到最佳拟合线。

平均误差或平方残差的总和

剩余是从数据点到回归线的距离的度量。定义线性回归线的目标应为最小剩余距离。

并且残差的总和是预测点与实际点之间的差异的平方。我们需要尽量减少也称为均值平方误差(MSE)的平方残差之和以获得最佳拟合线。

我们有两种不同的方法来这样做:

  1. 微分
  2. 北京快3app下降

在这里,我们将讨论北京快3app下降,因为它是大多数工业广泛使用的方法。

北京快3app下降

北京快3app下降是机器学习中广泛使用的算法,并且它不具体到线性回归。北京快3app下降广泛用于最小化成本函数。 

北京快3app下降成本函数

笔记:  我们使用了相同的成本函数来计算使用OLS估计器的最佳配合线。

我们将线性回归与Theta 0和Theta 1的北京快3app下降区分开来,并且我们计算功能的变化率:

 北京快3app下降

我们重复步骤直到收敛。

北京快3app下降融合

这里α,alpha是学习率,或者我们希望朝向最低速度的速度。

笔记: 我们应该小心选择α。好像我们选择太大的α太大我们可以过冲最小,如果α太小算法可能需要花费大量的时间来找到最少的功能。

有三种类型的北京快3app下降算法,具体取决于数据集:

  1. 批量北京快3app下降
  2. 随机北京快3app下降
  3. 迷你批量北京快3app下降

让我们从定义和理解简单的线性回归的北京快3app血换算法开始。

批量北京快3app下降

在批量北京快3app下降中,我们尝试使用整个数据集查找成本函数的最小值。让我们来看看代码来查找批处理渐变下降:

def batch_gradient(X, y, m_current=0, c_current=0, iters=500, learning_rate=0.001):
    N = float(len(y))
    gd_df = pd.DataFrame( columns = ['m_current', 'c_current','cost'])
    for i in range(iters):
        y_current = (m_current * X) + c_current
        
        # Cost function J(theta0, theta1)
        cost = sum([data**2 for data in (y_current - y)]) / 2*N
        
        # Diffrential with respect to theta 0 Gradient Descent
        c_gradient = (1/N) * sum(y_current - y)
        
        # Diffrential with respect to theta 1 Gradient Descent
        m_gradient = (1/N) * sum(X * (y_current - y))
        
        # Repeat until convergance
        m_current = m_current - (learning_rate * m_gradient)        
        c_current = c_current - (learning_rate * c_gradient)
        
        gd_df.loc[i] = [m_current[0],c_current[0],cost[0]]
    return(gd_df)

在上面显示的算法中:

  1. 我们首先定义我们需要启动的最佳拟合线
  2. 我们说明我们需要最小化的成本函数
  3. 我们将成本函数与C(斜坡)和C(截距)区分开来
  4. 基于定义的学习速率计算新的斜率和截距
  5. 最后,除非我们发现最低限度,否则我们重复该过程
cost_gradient = batch_gradient(X,y)

确保北京快3app下降正常工作,我们在每次迭代后检查北京快3app下降。并且每次迭代后应该减少。下图所示的图表表示批量北京快3app下降曲线:

plt.plot(cost_gradient.index, cost_gradient['cost'])
plt.show()

输出:

 批量北京快3app下降

在上面所示的图表中,正如我们可以看到成本函数值一直在减小,并且在一个迭代的一点之后,它仍然是几乎不变的。这一点是我们最好的合适线。让我们绘制最好的合适线:

plt.scatter(data['RM'], data['price'])
plt.plot(data['RM'], data['RM'] * cost_gradient.iloc[cost_gradient.index[-1]].m_current + 
         cost_gradient.iloc[cost_gradient.index[-1]].c_current, '-r')
plt.xlabel("Average number of rooms per dwelling")
plt.ylabel("Price")
plt.title("Average number of rooms vs house Price")

输出:

 批量北京快3app下降

随机北京快3app下降

具有批量北京快3app下降的计算限制通过随机北京快3app下降来解决。在这里,我们将不同的样本作为批量从数据中执行北京快3app下降。

这里,由于我们使用随机分发来创建样本,因此达到最小值的路径是嘈杂的。

由于路径是嘈杂的,因此与批量北京快3app下降相比,它需要大量的迭代来达到最小值。但仍然,它较低的计算非常昂贵。

def stocashtic_gradient_descent(X, y, m_current=0, c_current=0,learning_rate=0.5,epochs=50):
    N = float(len(y))
    gd_df = pd.DataFrame( columns = ['m_current', 'c_current','cost'])
    
    for i in range(epochs):
        rand_ind = np.random.randint(0,len(y))
        X_i = X[rand_ind,:].reshape(1,X.shape[1])
        y_i = y[rand_ind].reshape(1,1)
        
        y_predicted = (m_current * X_i) + c_current
        cost = sum([data**2 for data in (y_predicted - y_i)]) / 2 * N
        m_gradient = (1/N) * sum(X_i * (y_predicted - y_i))
        c_gradient = (1/N) * sum(y_predicted - y_i)
        m_current = m_current - (learning_rate * m_gradient)        
        c_current = c_current - (learning_rate * c_gradient)
        gd_df.loc[i] = [m_current[0],c_current[0],cost[0]]
    return(gd_df)

在上面所示的算法中,对于批量北京快3app下降的唯一改变是LOC,其中我们正在从数据集中选择样本,而不是在整个数据集上运行北京快3app下降。

cost_history = stocashtic_gradient_descent(X_train,y_train)

确保北京快3app下降正常工作,我们在每次迭代后检查北京快3app下降。下图所示的图表表示随机北京快3app下降曲线:

plt.plot(cost_history.index, cost_history['cost'])
plt.xlabel('No if Iterations')
plt.ylabel('Cost Function')
plt.title('斯科什蒂北京快3app下降 ')
plt.show()

输出:

斯科什蒂北京快3app下降

笔记:  正如您可能已经观察到这种模式,然后随机北京快3app下降是有点嘈杂的。

让我们使用从随机北京快3app下降所获得的参数来绘制最佳拟合线:

plt.scatter(data['RM'], data['price'])
plt.plot(data['RM'], data['RM'] * cost_history.iloc[cost_history.index[-1]].m_current 
+ cost_history.iloc[cost_history.index[-1]].c_current, '-r')
plt.xlabel("Average number of rooms per dwelling")
plt.ylabel("Price")
plt.title("Average number of rooms vs house Price")

输出:

斯科什蒂北京快3app下降

sklearn sgdreporlsor

Sklearn还提供了功能 sgdrepressor 使用随机北京快3app下降找到最佳拟合线。请参阅下面显示的代码:

clf = linear_model.SGDRegressor(max_iter=1000, tol=0.001)
clf.fit(X_train, y_train.reshape(len(y_train),))

它将提供优化的系数。让我们绘制显示最佳拟合曲线的图形:

plt.scatter(data['RM'], data['price'])
plt.plot(data['RM'], data['RM'] * clf.coef_[0] + clf.intercept_, '-r')
plt.xlabel("Average number of rooms per dwelling")
plt.ylabel("Price")
plt.title("Average number of rooms vs house Price")

输出:

 sgdrepressor

迷你批量北京快3app下降

这是行业中更实用的使用方法。这种方法使用随机样本但批量。 (即,我们不计算每个样本的北京快3app下降,但对于一组观察组,导致更好的准确性)

def minibatch_gradient_descent(X, y, m_current=0, c_current=0,learning_rate=0.1,epochs=200, 
                                                   batch_size =50):
    N = float(len(y))
    gd_df = pd.DataFrame( columns = ['m_current', 'c_current','cost'])
    
    indices = np.random.permutation(len(y))
    X = X[indices]
    y = y[indices]
        
    for i in range(epochs):
        X_i = X[i:i+batch_size]
        y_i = y[i:i+batch_size]
        
        y_predicted = (m_current * X[i:i+batch_size]) + c_current
        cost = sum([data**2 for data in (y_predicted - y[i:i+batch_size])]) / 2 *N
        m_gradient = (1/N) * sum(X_i * (y_predicted - y_i))
        c_gradient = (1/N) * sum(y_predicted - y_i)
        m_current = m_current - (learning_rate * m_gradient)
        c_current = c_current - (learning_rate * c_gradient)
        gd_df.loc[i] = [m_current[0],c_current[0],cost]
    return(gd_df)

在上面显示的代码中,我们正在洗牌观察,然后创建批次。此后,我们正在计算创建的批次上的北京快3app下降。

minibatch_cost_history = minibatch_gradient_descent(X_train,y_train)

确保北京快3app下降正常工作,我们在每次迭代后检查北京快3app下降。下图所示的图表表示迷你批量北京快3app下降曲线:

plt.plot(minibatch_cost_history.index, minibatch_cost_history['cost'])
plt.xlabel('No if Iterations')
plt.ylabel('Cost Function')
plt.title(' 迷你批量北京快3app下降 ')
plt.show()

输出:

 迷你批量北京快3app下降

让我们使用从迷你批量北京快3app下降所获得的参数来绘制最佳拟合线:

plt.scatter(data['RM'], data['price'])
plt.plot(data['RM'], data['RM'] * minibatch_cost_history.iloc[minibatch_cost_history.index[-1]].m_current + minibatch_cost_history.iloc[minibatch_cost_history.index[-1]].c_current, '-r')
plt.xlabel("Average number of rooms per dwelling")
plt.ylabel("Price")
plt.title("Average number of rooms vs house Price")

输出:

 迷你批量北京快3app下降

正如您可能已经注意到批次,随机和小纤维的结果几乎相同。 (即,在三种方法中最佳拟合线几乎相同。)它是有道理的,因为我们使用的是仅具有计算费用的差异的相同算法。

概括

我们开始定义线性回归的线性回归,我们定义了eSS,RSS,TSS,RSE等几个指标,并将其平衡,帮助我们找到最适合的线路和评估模型性能。深度理解后,我们定义了成本函数并使用各种技术来最小化它:

  1. 普通最小二乘 - OLS估计
  2. 均方误差 - MSE

可以用来找到最好的合适线。我们定义了OLS的公式,并写了一个Python函数来计算OLS。此后,我们定义了MSE函数并理解用于最小化MSE的渐变血清的概念。我们看到了三种不同类型的北京快3app血液下降方法:

  1. 批量北京快3app下降
  2. 随机北京快3app下降
  3. 迷你批量北京快3app下降

在理解上述概念的同时,我们还了解了Sklearn封装LinearRegression和SGDregrorlessor,它们分别使用OLS和随机北京快3app下降方法来找到最佳的合适线。

笔记:  这些不是最好的模型,实际上,这些是r r被平方为消极的坏模型。上述工作仅用于示范目的。如果我知道这些是坏型号,为什么我选择了这个?要解释我将不久推出的线性回归的局限性。

您有任何反馈,建议或问题吗?让我们在下面的评论部分讨论它们。

作者信息

Tavish Aggarwal.

网站: http://tavishaggarwal.com

Tavish Aggarwal. 是一个数据科学家 在一个海德拉巴工作,具有广泛的经验,在跨电子商务,财务,医疗保健等等不同领域解决现实世界的业务问题。 他对技术充满热情,喜欢在团队中工作。