线性回归-最小二乘法
概述
给定包含正确答案的样本数据集,选择一个概念函数H,并为H找到适应样本数据集的最优参数,从而建立预测模型为新查询数据预测答案。
线性最小二乘法原理
对于已知的样本数据集,可以用线性方程组表示为:
m表示有m个线性方程,n表示有n个未知数,也就是样本数据集是n维,矩阵表示为:
,,
该方程组一般而言没有解,只能选取最合适的让等式尽量成立,引入残差平方和函数:
取得最小值时的解记为:
对使用求导方法求得极值,可以得到:
如果矩阵为非奇异矩阵则有唯一解:
普通最小二乘法就是拟合一个带有系数的线性模型,使得数据集实际观测数据和预测数据之间的残差平方和最小。回归评价指标最常用的有均方误差根(RMSE)和R平方(R2),详细的回归评价指标参考其他文章。
普通最小二乘法示例:
__author__ = 'gytan' import matplotlib.pyplot as plt import numpy as np from sklearn import datasets, linear_model from sklearn.metrics import mean_squared_error, r2_score # load the diabetes dataset diabetes = datasets.load_diabetes() # use only one feature diabetes_X = diabetes.data[:, np.newaxis, 2] # split the data into training/testing sets diabetes_X_train = diabetes_X[:-20] diabetes_X_test = diabetes_X[-20:] # split the targets into training/testing sets diabetes_Y_train = diabetes.target[:-20] diabetes_Y_test = diabetes.target[-20:] # create linear regression object regr = linear_model.LinearRegression() # train the model using the training sets regr.fit(diabetes_X_train, diabetes_Y_train) # make predictions using the testing set diabetes_Y_pred = regr.predict(diabetes_X_test) # the coefficients print('Coefficients: \n', regr.coef_) # the mean squared error print("Mean squared error: %.2f"%mean_squared_error(diabetes_Y_test, diabetes_Y_pred)) # explained variance score: 1 is perfect rediction print("Variance score: %.2f"%r2_score(diabetes_Y_test, diabetes_Y_pred)) # plot outputs plt.scatter(diabetes_X_test, diabetes_Y_test, color = 'black') plt.plot(diabetes_X_test, diabetes_Y_pred, color = 'blue', linewidth = 3) plt.xticks(()) plt.yticks(()) plt.show()
对于普通最小二乘法的系数估计问题,其依赖于样本数据各项的相互独立性。当各项是相关的,且矩阵X的各列近似线性相关,这就是多重共线性问题,这会导致最小二乘法估计对于随机误差非常敏感,产生较大的方差。
岭回归
岭回归是一种专用于共线性数据的回归方法,实质是一种改进的最小二乘法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要好于普通最小二乘法。
岭回归使用X的奇异值分解来计算最小二乘解,通过对系数的大小施加惩罚来解决普通最小二乘法的共线性问题。
残差平方和取最小值时:
I为单位矩阵。
如果增大,则中各元素的绝对值趋于变小,相对于正确的偏差越来越大,当趋向于无穷大时,趋于0。随的改变而改变的轨迹称为岭迹。实际应用中,可以选取非常多的值来计算非常多的,做出一个岭迹图,观察图形轨迹稳定的位置来确认值。
岭回归是对普通最小二乘法的改进,损失了无偏性来换取高的数值稳定性,从而得到较高的计算精度。
岭回归轨迹示例:
__author__ = 'gytan' import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model # X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis]) Y = np.ones(10) # compute paths n_alphas = 200 alphas = np.logspace(-10, -2, n_alphas) coefs = [] for a in alphas: ridge = linear_model.Ridge(alpha = a, fit_intercept = False) ridge.fit(X, Y) coefs.append(ridge.coef_) # results ax = plt.gca() ax.plot(alphas, coefs) ax.set_xscale('log') ax.set_xlim(ax.get_xlim()[::-1]) plt.xlabel('alpha') plt.ylabel('weights') plt.title('Ridge coefficients as a function of the regularization') plt.axis('tight') plt.show()