使用Python进行线性回归?


线性回归是机器学习中最简单且常用的工具之一,用于指示两个变量之间是否存在正相关或负相关关系。

线性回归是少数几个用于快速预测分析的优秀工具之一。在本节中,我们将使用python pandas包加载数据,然后估计、解释和可视化线性回归模型。

在我们深入探讨之前,让我们先讨论一下什么是回归?

什么是回归?

回归是一种预测建模技术,有助于建立因变量和自变量之间的关系。

回归类型

  • 线性回归
  • 逻辑回归
  • 多项式回归
  • 逐步回归

线性回归用于何处?

  • 评估趋势和销售预测
  • 分析价格变化的影响
  • 评估风险

构建线性回归模型的步骤

  • 首先,我们将构建设置并下载数据集和jupyter(我正在本教程中使用它,您可以使用其他IDE,如anaconda等)。

  • 导入所需的包和数据集。

  • 加载数据集后,我们将探索数据集。

  • 将使用我们的数据集进行线性回归。

  • 然后,我们将探索变量与一天中的时间之间的关系。

  • 总结。

设置

您可以从以下链接下载数据集:

http://en.openei.org/datasets/dataset/649aa6d3-2832-4978-bc6e-fa563568398e/resource/b710e97d-29c9-4ca5-8137-63b7cf447317/download/building1retail.csv

我们将使用它来使用室外空气温度 (OAT) 作为解释变量来模拟建筑物的电力消耗。

将csv文件保存在jupyter或IDE安装的同一文件夹中。

导入所需的库和数据集

首先,我们将导入所需的库,然后使用pandas python库读取数据集。

# Importing Necessary Libraries

import pandas as pd
#Required for numerical functions
import numpy as np
from scipy import stats
from datetime import datetime
from sklearn import preprocessing
from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression
#For plotting the graph
import matplotlib.pyplot as plt
%matplotlib inline

# Reading Data
df = pd.read_csv('building1retail.csv', index_col=[0],
date_parser=lambda x: datetime.strptime(x, "%m/%d/%Y %H:%M"))
df.head()

输出

探索数据集

因此,让我们首先通过使用pandas绘制它来可视化我们的数据集。

df.plot(figsize=(22,6))

输出

因此,x轴显示的是从2010年1月到2011年1月的数据。

如果我们看到上面的输出,我们可以注意到该图有两个奇怪的地方

  • 似乎没有缺失数据,要检查它,只需运行

df.isnull().values.any()

输出

False

False结果告诉我们数据框中没有空值。

  • 看来数据中有一些异常值(向下的长尖峰)。

异常值或“离群值”通常是实验错误的结果,也可能是真实值。无论哪种情况,我们都将丢弃它,因为它们会严重影响回归线的斜率。

在我们丢弃“离群值”之前,让我们首先检查一下我们的数据表示的是哪种类型的分布。

df.hist()

输出

从上面的直方图可以看出,我们的图表显示的数据大致遵循正态分布。

因此,让我们删除所有大于平均值 3 个标准差的值,并绘制新的数据框。

std_dev = 3
df = df[(np.abs(stats.zscore(df)) < float(std_dev)).all(axis=1)]
df.plot(figsize=(22, 6))

输出

因此,从上面的输出中我们可以看到,我们已经在某种程度上消除了尖峰,并清理了我们的数据。

验证线性关系

为了找到OAT和电力之间是否存在任何线性关系,让我们绘制一个简单的散点图。

plt.scatter(df['OAT (F)'], df['Power (kW)'])

输出

线性回归

为了运行模型并评估其性能,我们将使用Scikit-learn模块,我们还将使用k倍交叉验证(k=3)来评估模型的性能。

X = pd.DataFrame(df['OAT (F)'])
y = pd.DataFrame(df['Power (kW)'])
model = LinearRegression()
scores = []
kfold = KFold(n_splits=3, shuffle=True, random_state=42)
for i, (train, test) in enumerate(kfold.split(X, y)):
model.fit(X.iloc[train,:], y.iloc[train,:])
score = model.score(X.iloc[test,:], y.iloc[test,:])
scores.append(score)
print(scores)

输出

[0.38768927735902703, 0.3852220878090444, 0.38451654781487116]

在上面的程序中,model = LinearRegression() 创建了一个线性回归模型,for循环将数据集分成三折。然后在循环内,我们拟合数据,然后通过将其分数附加到列表中来评估其性能。

但是,结果看起来并不好,我们可以提高其性能。

一天中的时间

电力(变量)高度依赖于一天中的时间。让我们使用此信息通过使用独热编码将其合并到我们的回归模型中。

model = LinearRegression()
scores = []
kfold = KFold(n_splits=3, shuffle=True, random_state=42)
for i, (train, test) in enumerate(kfold.split(X, y)):
   model.fit(X.iloc[train,:], y.iloc[train,:])
   scores.append(model.score(X.iloc[test,:], y.iloc[test,:]))
print(scores)

输出

[0.8074246958895391, 0.8139449185141592, 0.8111379602960773]

我们的模型有了很大的改进。

总结

在本节中,我们学习了探索数据集并将其准备用于拟合回归模型的基础知识。我们评估了其性能,检测到了其缺点并对其进行了修复。

更新于:2019年7月30日

638 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告