本系列教程是scikit-learn学习的第一篇,我会根据scikit-learn官网教程和自己的学习经验来进行总结。首先,我会介绍模型的一些基本知识,不会花时间去推导公式,会介绍一下这个模型的适应情况,以及用scikit-learn这个框架来实现这个模型。
一、最小二乘法
还记得高中物理实验课的时候,做实验的时候我们会首先记录一系列的数据,然后根据这些自变量和因变量之间的关系(线性关系)画出直线,而在画直线的时候所采用的方法就是最小二乘法。最小二乘法也叫最小平方法是一种数学的优化算法,它是通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得求得的数据与实际数据之间误差的平方和最小。如果,自变量(x)和因变量(y)是线性组合的话,那么它们一定满足下面的公式
其中,w表示系数,可以用一个向量表示为W=(W1,W2......,Wp),在scikit-learn中,用coef_表示。其中W0表示截距,在scikit-learn中用intercept_表示。数据集的实际观测数据和预测数据(估计值)之间的残差平方和最小,公式如下:
其中,Xw表示预测值,y表示实际数据。下面,引用一个维基百科的例子来介绍一下使用最小二乘法的求解过程
通过上面的例子我们可以发现,我们是通过求解最小化误差来求解参数的。然而,我们在实际编程的时候并不会采用这种方式去求解参数,通常都是采用梯度下降算法迭代来使得预测值与实际值之间误差的平方和最小。在使用最小二乘法求解参数的时候有几个地方需要注意:
1、方程组的个数要多于未知数的个数。
2、模型与参数是线性的,参数只能以一次方出现。
3、对数据的噪声干扰之间是零均值同方差的,就是指在测量数据的时候要保证测量误差的平均值为0,而且每一个测量误差之间是不相关的,测量误差与X是不相关的。
二、scikit-learn实现线性模型
1、求解维基百科例子中的参数
from sklearn import linear_model import matplotlib.pyplot as plt import numpy as np if __name__ == "__main__": #定义自变量x x = np.array([[1],[2],[3],[4]],dtype=np.float32) #定义因变量y y = np.array([6,5,7,10],dtype=np.float32) #加载scikit-learn的线性模型 linear = linear_model.LinearRegression() #通过x和y来建立线性模型 linear.fit(x,y) #查看模型系数β2 print(linear.coef_) #[ 1.39999998] #查看模型的截距β1 print(linear.intercept_) #3.5000000596
2、scikit-learn官网的例子
http://sklearn.lzjqsdd.com/auto_examples/linear_model/plot_ols.html#example-linear-model-plot-ols-py
score(X, y, sample_weight=None)返回预测的决定系数R^2
R^2 = 1 - u/v,u是一个残差的和squares ((y_true - y_pred) ** 2).sum() ,v是一个平方和squares ((y_true - y_true.mean()) ** 2).sum(),最好的结果是1,它也能为负数,因为这个模型有可能被任意的损坏,一个常量的模型总是能预测一个期望值,在不考虑特征输入的情况,R^2=0。可以通过R^2来判断,预测的值与实际值的均值之间的关系。
from sklearn import linear_model,datasets import matplotlib.pyplot as plt import numpy as np if __name__ == "__main__": #加载scikit-learn中的数据集 #使用糖尿病人的数据集,一共有十个特征 diabetes = datasets.load_diabetes() #np.newaxis给列表增加一个轴,就是在加一组[] ''' print(diabetes.data[0:2,2]) [ 0.06169621 -0.05147406] print(diabetes.data[0:2,np.newaxis,2]) [[ 0.06169621] [-0.05147406]] 在给scikit-learn传入数据x的时候,格式要为[[][]...] ''' # 使用第三个特征,格式化数据x diabetes_x = diabetes.data[:,np.newaxis,2] #将数据集分为训练集和测试集,定义自变量 #取diabetes_x中的前19个 diabetes_x_train = diabetes_x[:-20] #取diabetes_x中从19开始后面所有的x diabetes_x_test = diabetes_x[-20:] #定义因变量 diabetes_y_train = diabetes.target[:-20] diabetes_y_test = diabetes.target[-20:] #根据因变量和自变量来拟合一个线性回归模型 regr = linear_model.LinearRegression() #通过训练集来训练模型 regr.fit(diabetes_x_train,diabetes_y_train) #根据训练好的模型来预测测试数据的结果 predict_test_y = regr.predict(diabetes_x_test) #计算预测的结果与实际结果之间的平方差的平均值 miss_distance_mean = np.mean((predict_test_y - diabetes_y_test) ** 2) print("miss_distance_mean:%.2f"%miss_distance_mean) predict_score = regr.score(diabetes_x_test,diabetes_y_test) print("predict_score:%.2f"%predict_score) #绘图 #描点 plt.scatter(diabetes_x_test,diabetes_y_test,color="black") #绘制预测的直线 plt.plot(diabetes_x_test,predict_test_y,color="blue",linewidth=3) plt.xticks(()) plt.yticks(()) plt.show()