来自于邹博机器学习第七期第九课中的内容:简单介绍就是一个产品的销量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}
可以看出模型得分非常接近且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()函数做了处理