机器学习教程之2-线性回归(linear regression)的sklearn实现

来源:互联网 发布:河南财经政法大学知乎 编辑:程序博客网 时间:2024/06/05 20:10

0.概述

线性回归属于机器学习中的回归问题,因为线性回归是根据数据预测一个准确的输出值,而不是分类结果。
注意:”机器学习教程之1”里的感知器讲的是分类问题,它是寻找超平面将数据分为正、负两类。

优点:非常简单、易于建模、应用广泛

缺点

1.模型表示


数据集:数据的集合

监督学习:从已有数据中发现关系:由多个输入映射一个输出。并用数学模型表示,将新数据用这数学模型运算得到新的输出。

监督学习的方式:回归问题和分类问题。

回归问题:根据之前的数据预测出一个准确的输出值。

训练集:在监督学习中的数据集

特征/输入变量:用x表示

目标变量/输出变量:用y表示

训练集中的实例:(x,y)

观察实例:第i个观察实例用(x(i),y(i))表示,注意(i)是上标

训练集中实例的数量:用m表示

学习算法的解决方案或函数也称为假设(hypothesis):用h表示

监督学习完整流程如下图所示

假设函数实例

因为只含有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题。

2.代价函数

代价函数表示数据的理论值和实际值的拟合程度,代价函数越小,拟合度越高。

选择的参数决定了得到的直线相对于训练集的准确程度,模型所预测的值训练集中实际值之间的差距叫建模误差(modeling error)(下图中蓝线所指):

代价函数/平方误差代价函数

代价函数的作用是帮助寻找到最佳的假设函数,即找到上式的最小值,上式的代价函数对于大多数问题,特别是回归问题,是一个合理的选择。

代价函数的示意图如下:

3.梯度下降(gradient descent)

直接找到代价函数是困难。梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数最小值

批量梯度下降(batch gradient descent)算法公式为:

上式中的表示学习率(learning rate),学习速率决定了沿着能让代价函数下降程度最大的方向迈出的步子有多大。

说明:批量梯度下降算法直到参数theta j不变时,算法终止,此时的theta j能使得代价函数J取最小值,即此时的假设函数是我们想要的。

4.代码

1)原始模型

"""功能:线性回归说明:作者:唐天泽博客:http://blog.csdn.net/u010837794/article/details/70832763日期:2017-08-14""""""导入项目所需的包"""import numpy as npimport matplotlib.pyplot as plt# 使用交叉验证的方法,把数据集分为训练集合测试集from sklearn.model_selection import train_test_splitfrom sklearn import datasetsfrom sklearn.linear_model import LinearRegression# 加载iris数据集def load_data():    diabetes = datasets.load_diabetes()    # 将数据集拆分为训练集和测试集     X_train, X_test, y_train, y_test = train_test_split(    diabetes.data, diabetes.target, test_size=0.30, random_state=0)    return X_train, X_test, y_train, y_test# 使用LinearRegression考察线性回归的预测能力def test_LinearRegression(X_train, X_test, y_train, y_test):    # 选择模型    cls = LinearRegression()    # 把数据交给模型训练    cls.fit(X_train, y_train)    print("Coefficients:%s, intercept %s"%(cls.coef_,cls.intercept_))    print("Residual sum of squares: %.2f"% np.mean((cls.predict(X_test) - y_test) ** 2))    print('Score: %.2f' % cls.score(X_test, y_test))if __name__=='__main__':    X_train,X_test,y_train,y_test=load_data() # 产生用于回归问题的数据集    test_LinearRegression(X_train,X_test,y_train,y_test) # 调用 test_LinearRegression

Coefficients:[ -52.46990775 -193.51064552 579.4827762 272.46404234 -504.72401371
241.68441866 -69.73618783 86.62018451 721.95580222 26.77887028], intercept 153.719145405
Residual sum of squares: 3097.15
Score: 0.39

2)正则化模型之1-岭回归

岭回归(Ridge Regression)是一种正则化方法,通过在代价函数中加入L2 范数惩罚项,来控制线性模型的复杂程度,从而使得模型更稳健。

"""功能:线性回归说明:作者:唐天泽博客:http://blog.csdn.net/u010837794/article/details/70832763日期:2017-08-14""""""导入项目所需的包"""import numpy as npimport matplotlib.pyplot as plt# 使用交叉验证的方法,把数据集分为训练集合测试集from sklearn.model_selection import train_test_splitfrom sklearn import datasetsfrom sklearn.linear_model import Ridge# 加载iris数据集def load_data():    diabetes = datasets.load_diabetes()    # 将数据集拆分为训练集和测试集     X_train, X_test, y_train, y_test = train_test_split(    diabetes.data, diabetes.target, test_size=0.30, random_state=0)    return X_train, X_test, y_train, y_test# 使用LogisticRegression考察线性回归的预测能力def test_Ridge(X_train, X_test, y_train, y_test):    # 选择模型    cls = Ridge()    # 把数据交给模型训练    cls.fit(X_train, y_train)    print("Coefficients:%s, intercept %s"%(cls.coef_,cls.intercept_))    print("Residual sum of squares: %.2f"% np.mean((cls.predict(X_test) - y_test) ** 2))    print('Score: %.2f' % cls.score(X_test, y_test))if __name__=='__main__':    X_train,X_test,y_train,y_test=load_data() # 产生用于回归问题的数据集    test_Ridge(X_train,X_test,y_train,y_test) # 调用 test_LinearRegression

Coefficients:[ 15.71325823 -52.32775592 282.88562602 169.95504822 17.2315442
-20.84531218 -149.33219607 113.37861106 251.47110129 100.21147127], intercept 152.896006832
Residual sum of squares: 3238.49
Score: 0.37

(3)在(2)的基础上检验不同的alpha值对于预测性能的影响

"""功能:线性回归说明:作者:唐天泽博客:http://blog.csdn.net/u010837794/article/details/70832763日期:2017-08-14""""""导入项目所需的包"""import numpy as npimport matplotlib.pyplot as plt# 使用交叉验证的方法,把数据集分为训练集合测试集from sklearn.model_selection import train_test_splitfrom sklearn import datasetsfrom sklearn.linear_model import Ridge# 加载iris数据集def load_data():    diabetes = datasets.load_diabetes()    # 将数据集拆分为训练集和测试集     X_train, X_test, y_train, y_test = train_test_split(    diabetes.data, diabetes.target, test_size=0.30, random_state=0)    return X_train, X_test, y_train, y_test# 使用LogisticRegression考察线性回归的预测能力def test_Ridge_alpha(X_train, X_test, y_train, y_test):    alphas=[0.01,0.02,0.05,0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000]    scores=[]    for i,alpha in enumerate(alphas):        # 选择模型        cls = Ridge(alpha=alpha)        # 把数据交给模型训练        cls.fit(X_train, y_train)        scores.append(cls.score(X_test, y_test))    ## 绘图    fig=plt.figure()    ax=fig.add_subplot(1,1,1)    ax.plot(alphas,scores)    ax.set_xlabel(r"$\alpha$")    ax.set_ylabel(r"score")    ax.set_xscale('log')    ax.set_title("Ridge")    plt.show()if __name__=='__main__':    X_train,X_test,y_train,y_test=load_data() # 产生用于回归问题的数据集    test_Ridge_alpha(X_train,X_test,y_train,y_test) # 调用 test_LinearRegression

5.总结

6.参考资料

[1] ng CS229
[2] 李航 《统计学习方法》
[3] 华校专《Python大战机器学习》

1 0
原创粉丝点击