回归是估计输入数据与连续值输出数据之间关系的过程。数据通常是实数形式的,我们的目标是估计满足输入到输出映射关系的基本函数。让我值们从一个简单的示例开始。考虑下面的输入与输出映射关系:
1→2
3→6
4.3→8.6
7.1→14.2
如果要你估计输入与输出的关联关系,你可以通过模式匹配轻松地找到结果。我们发现输出结果一直是输入数据的两倍,因此输入与输出的转换公式就是这样:
f(x)=2x
这是体现输入值与输出值关联关系的一个简单函数。但是,在真实世界中通常都不会这么简单,输入与输出的映射关系函数并不是一眼就可以看出来的。
线性回归用输入变量的线性组合来估计基本函数。上面的示例就是一种单输入单输出变量的线性回归。
线性回归的目标是提取输入变量与输出变量的关联线性模型,这就要求实际输出与线性方程预测的输出的残差平方和最小化。这种方法被称为普通最小二乘法。
我们可能觉得用一条曲线对这些点进行拟合效果会更好,但是线性回归不允许这样做。线性回归的主要优点就是方程简单。如果想用非线性回归,可能会得到更准确的型,但是拟合速度会慢很多。线性回归模型就像下图显示的,用一条直线近似数据点的趋势。接下来看看如何用 Python建立线性回归模型。
我们先准备好一份数据文件data_singlevar.txt,相关数据文件可到
https://github.com/windform/Python-Machine-Learning-Cookbook/blob/master/Chapter01/data_singlevar.txt
这个地址下载。
文件里第一个字段是输入值,第二个字段是与逗号前面的输入值相对应的输出值。
(1)我们先导入加载数据
#加载、导入数据
import sys
import numpy as np
filename = 'data_singlevar.txt'
x = []
y = []
with open(filename, 'r') as f:
for line in f.readlines():
data = [float(i) for i in line.split(',')]
xt, yt = data[:-1], data[-1]
X.append(xt)
y.append(yt)
把输入数据加载到变量x和y,其中x是数据,y是标记。在代码的for循环体中,我们解析每行数据,用逗号分割字段。然后,把字段转化为浮点数,并分别保存到变量x和y中。
(2)建立机器学习模型时,需要用一种方法来验证模型,检查模型是否达到一定的满意度。为了实现这个方法,把数据分成两组:训练数据集( training dataset)与测试数据集( testing dataset)。训练数据集用来建立模型,测试数据集用来验证模型对未知数据的学习效果。因此,先把数据分成训练数据集与测试数据集:
num_training = int(0.8 * len(x))
num_test = len(x) - num_training
#训练数据
x_train = np.array(x[:num_training]).reshape((num_training,1))
y_train = np.array(y[:num_training])
#测试数据
x_test = np.array(x[num_training:]).reshape((num_test,1))
y_test = np.array(y[num_training:])
这里用8%的数据作为训练数据集,其余20%的数据作为测试数据集。
(3)现在已经准备好训练模型。接下来创建一个回归器对象。
from sklearn import linear_model
#创建回归器对象
linear_regressor = linear_model.LinearRegression()
#用训练数据集训练模型
linear_regressor.fit(x_train,y_train)
(4)我们利用训练数据集训练了线性回归器,向fit方法提供输入数据即可训练模型,接下来是拟合数据模型:
#拟合
import matplotlib.pyplot as plt
y_train_pred = linear_regressor.predict(x_train)
plt.figure()
plt.scatter(x_train,y_train,color='green')
plt.plot(x_train,y_train_pred,color='black',linewidth=4)
plt.title('Training data')
plt.show()
从上图可以看出,模型训练的效果很好,但这只能体现模型对训练数据的拟合效果。
(5)接下来用模型对测试数据集进行预测:
#数据预测
y_test_pred = linear_regressor.predict(x_test)
plt.scatter(x_test,y_test,color='green')
plt.plot(x_test,y_test_pred,color='black',linewidth=4)
plt.title('Test data')
plt.show()
相关阅读:
《 》
《 》
閱讀更多 數據分析和挖掘 的文章