Ridge和lasso回归实现的一个小案例

来自于邹博机器学习第七期第九课中的内容:简单介绍就是一个产品的销量sales与TV、radio、newspaper三个投入量之间的关系。

直接上代码:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.linear_model import Lasso, Ridge

其中train_test_split是将数据进行分割为训练集和测试集,GridSearchCV它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。

if __name__ == "__main__":
    # pandas读入
    data = pd.read_csv('E:\\code\\Advertising.csv')
    # print(data)
    x = data[['TV', 'Radio', 'Newspaper']]
    # x = data[['TV', 'Radio']]
    y = data['Sales']
    # print(x)
    # print(y)

    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, test_size=0.2)
    model = Lasso()
    # model = Ridge()
    alpha_can = np.logspace(-3, 2, 10)

    #在控制台输出过程中,默认小数会以科学计数法的形式输出,默认值为False
    np.set_printoptions(suppress=True)                    #即输出小数

    print('alpha_can = ', alpha_can)
    lasso_model = GridSearchCV(model, param_grid={'alpha': alpha_can}, cv=5)
    #GridSearchCV用法参考 http://blog.csdn.net/cherdw/article/details/54970366
    lasso_model.fit(x_train, y_train)
    print('超参数:\n', lasso_model.best_params_)

    order = y_test.argsort(axis=0)
    # argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y_test
    print('order: \n',order)
    y_test = y_test.values[order]
    #当把索引对应的赋值给y_test时,输出的y_test自动从小到大排序
    print('y_test:',y_test)
    x_test = x_test.values[order,:]
    y_hat = lasso_model.predict(x_test)
    print('score:',lasso_model.score(x_test, y_test))
    mse = np.average((y_hat - np.array(y_test)) ** 2)  # Mean Squared Error
    rmse = np.sqrt(mse)  # Root Mean Squared Error
    print({'mse':mse},{'rmse': rmse})

    t = np.arange(len(x_test))
    mpl.rcParams['font.sans-serif'] = ['simHei']
    mpl.rcParams['axes.unicode_minus'] = False
    plt.figure(facecolor='w')
    plt.plot(t, y_test, 'r-', linewidth=2, label='真实数据')
    plt.plot(t, y_hat, 'g-', linewidth=2, label='预测数据')
    plt.title('线性回归预测销量', fontsize=18)
    plt.legend(loc='upper left')
    plt.grid(b=True, ls=':')
    plt.show()

1、lasso回归结果为:{'alpha': 0.59948425031894093},模型得分score: 0.891103116143
     {'mse': 2.0226718195221851}

2、将model改为Ridge时输出结果为:{'alpha': 7.7426368268112773},模型得分score: 0.892714279041
    {'mse': 1.9927457676936733}
Ridge和lasso回归实现的一个小案例
可以看出模型得分非常接近且mse相差也不大,当然本例不能说明两种方法差别不大,只给出两种方法的基本实现。
其实lasso和ridge分别对应了正则化中的L1和L2,详情参考http://blog.csdn.net/zouxy09/article/details/24971995/

3、注意到如果将下面的代码注释掉
order = y_test.argsort(axis=0)
# argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y_test
print('order: \n',order)
y_test = y_test.values[order]
#当把索引对应的赋值给y_test时,输出的y_test自动从小到大排序
x_test = x_test.values[order,:]
所得的结果相差不大,但得出的图形变化就大了,因为y_test数据我们没有进行排序,是乱的,
就出现了下图所示,为了美观起见,用argsort()函数做了处理