预测数值型数据:回归(一)

  机器学习算法的基本任务就是预测,预测目标按照数据类型可以分为两类:一种是标称型数据(通常表现为类标签),另一种是连续型数据(例如房价或者销售量等等)。针对标称型数据的预测就是我们常说的分类,针对数值型数据的预测就是回归了。这里有一个特殊的算法需要注意,逻辑回归(logistic regression)是一种用来分类的算法,那为什么又叫“回归”呢?这是因为逻辑回归是通过拟合曲线来进行分类的。也就是说,逻辑回归只不过在拟合曲线的过程中采用了回归的思想,其本质上仍然是分类算法。
  假如我们要预测某一地区的房价,我们可能会列出以下的式子进行估计:
  
                   房价 = 0.7 * 面积 + 0.19 * 房子的朝向
  
   这个简单的式子就叫回归方程,其中0.7和0.19称为回归系数,面积和房子的朝向称为特征。有了这些概念,我们就可以说,回归实际上就是求回归系数的过程。在这里我们看到,房价和面积以及房子的朝向这两个特征呈线性关系,这种情况我们称之为线性回归。当然还存在非线性回归,在这种情况下会考虑特征之间出现非线性操作的可能性(比如相乘或者相除),由于情况有点复杂,不在这篇文章的讨论范围之内。
  简便起见,我们规定代表输入数据的矩阵为 X (维度为m*n,m为样本数,n为特征维度),回归系数向量为 θ (维度为n*1)。对于给定的数据矩阵 X ,其预测结果由: Y=Xθ 这个式子给出。我们手里有一些现成的x和y作为训练集,那么如何根据训练集找到合适的回归系数向量 θ 是我们要考虑的首要问题,一旦找到 θ ,预测问题就迎刃而解了。在实际应用中,我们通常认为能带来最小平方误差的 θ 就是我们所要寻找的回归系数向量。平方误差指的是预测值与真实值的差的平方。采用平方这种形式的目的在于规避正负误差的互相抵消。所以,我们的目标函数如下所示:   

minθi=0m(yixTiθ)2

  这里的m代表训练样本的总数。对这个函数的求解有很多方法,由于网络上对于详细解法的相关资料太少,下面展示一种利用正规方程组的解法:
这里写图片描述 (1)
这里写图片描述        AtrAB=BT (2)
  针对上式不太清楚的朋友可以看我之前写的这篇博文:http://blog.csdn.net/qrlhl/article/details/47758509。根据以上式子,解法如下:

这里写图片描述

  令其等于0,即可得: θ=(XTX)1XTy 。有一些需要说明的地方:第三步是根据实数的迹和等于本身这一事实推导出的(括号中的每一项都为实数),第四步是根据式(2)推导出来的。第五步是根据式(1)推导出来的,其中的C为单位矩阵 I 。这样,我们就得到了根据训练集求得回归系数矩阵θ的方程。这种方法的特点是简明易懂,不过缺点也很明显,就是 XTX 这一项不一定可以顺利的求逆。由于只有满秩才可以求逆,这对数据矩阵 X 提出了一定的要求。有人也许会问XTX不是满秩的情况下怎么办?这个时候就要用到岭回归(ridge regression)了,这一部分留到下次再讲。
  说了这么久,放一张图上来看看线性回归的效果:

这里写图片描述
  
  可以看到,直线较好的拟合了数据点的变化趋势,可以作出相对较好的预测。但是细心的朋友可能会发现,如果在数据点的每一段用一小段直线拟合也许会获得更加好的结果,就像这样:
  
            这里写图片描述

  这种方法叫做局部加权线性回归(Locally Weighted Linear Regression,LWLR),关于这种方法的细节,我们下次再说。

在Python中,我们可以使用matplotlib库绘制图形,pandas处理数据,numpy进行数学运算,以及自定义线性回归来进行预测。这里是一个简单的例子,假设你有一个名为`abalone_data.csv`的数据集,其中包含鲍鱼年龄以及其他可能影响年龄的因素。 首先,你需要导入所需的库并加载数据: ```python import pandas as pd import matplotlib.pyplot as plt import numpy as np # 加载数据 data = pd.read_csv('abalone_data.csv') ``` 然后,你可以选择一些特征作为输入X,比如壳长、壳高和重量等,年龄作为输出Y: ```python X = data[['length', 'diameter', 'weight']] # 假设长度、直径和重量是特征 y = data['rings'] # 假设rings列是目标变量,即年龄 ``` 接着,创建一个简单的线性回归: ```python class LinearRegression: def __init__(self, learning_rate=0.01, n_iterations=1000): self.learning_rate = learning_rate self.n_iterations = n_iterations self.weights = np.zeros(X.shape[1]) self.bias = 0 def predict(self, X): return np.dot(X, self.weights) + self.bias def fit(self, X, y): for _ in range(self.n_iterations): y_pred = self.predict(X) dw = (1 / len(y)) * np.dot(X.T, (y - y_pred)) db = (1 / len(y)) * np.sum(y - y_pred) self.weights -= self.learning_rate * dw self.bias -= self.learning_rate * db ``` 训练模并进行预测: ```python model = LinearRegression() model.fit(X, y) predictions = model.predict(X) ``` 为了可视化结果,你可以画出实际年龄和预测年龄之间的散点图: ```python plt.scatter(y, predictions) plt.xlabel('Actual Rings') plt.ylabel('Predicted Rings') plt.title('Age Prediction using Simple Linear Regression') plt.show() ``` 分析部分,你可以通过观察散点图和回归线的倾斜程度判断模的效果。如果大部分点接近直线,说明模拟合较好;若偏离较大,可能存在过拟合或欠拟合问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值