首页 > 其他 > 详细

机器学习02-线性回归改进

时间:2021-04-27 22:02:51      阅读:28      评论:0      收藏:0      [点我收藏+]

在意识到上次出现的问题之后,学习了新的技术并参考kaggle 上前辈的代码后,重写了之前的代码

首先介绍几个工具:

1、sklearn:即Scikit-learn 是针对Python 编程语言的免费软件机器学习库,相信这个下图领域内没人会陌生。在这里我使用LinearRegressionl 类替代了之前的穷举,使用评估库metrics 中的r2_score 函数替代了之前的MSE 函数,附上一个评价指标介绍

技术分享图片

 

 

 

2、pandes:Pandas 是Python 语言的一个扩展程序库,用于数据分析,在这里我使用read_csv 函数替换了之前使用python 的文件函数,同时附上一个中文API网站

 

代码如下:

 1 import numpy as np
 2 import pandas as pd
 3 # sklearn.linear_model 是scikit-learn 的线性回归模型库
 4 from sklearn.linear_model import LinearRegression
 5 # metrics 是scikit-learn 的评估值库
 6 from sklearn.metrics import r2_score
 7 import matplotlib.pyplot as plt
 8 
 9 # 从文件读取数据
10 df = pd.read_csv(
11     # 地址
12     filepath_or_buffer=archive/train.csv,
13     # 分隔符
14     sep=,,
15     # 跳过第一行,这里不需要
16     # skiprows=1,
17     # False 为数据有误的时候不报错,直接跳过;Ture 表示报错,比如train.csv 的216 行少了分隔符‘,‘
18     error_bad_lines=False,
19     # 将数据中的NULL 识别为空值
20     na_values=NULL
21 )
22 
23 x_data = []
24 y_data = []
25 for x_val, y_val in zip(df[x], df[y]):
26     x_data.append([float(x_val)])
27     y_data.append(float(y_val))
28 
29 # LinearRegression 使用普通最小二乘法做线性回归
30 # 1、实例化对象
31 lin_reg = LinearRegression()
32 # 2、拟合模型
33 model = lin_reg.fit(x_data, y_data)
34 # 3、预测y_hat 值
35 y_hat = model.predict(x_data)
36 
37 # r2_score 评估模型,注意到LinearRegression 也有一个score() ,这个函数实际上也是调用r2_score 函数返回quality = model.score(x_data, y_hat)
38 # r2_score 评估模型即可决系数R 平方,即回归平方和与总离差平方和的比值 = 1 - SUM[(y_hat - y_avg)^2]/SUM[(y - y_hat)^2]
39 # 反映了自变量对因变量的可解释比例
40 quality = r2_score(x_data, y_hat)
41 print("训练集可决系数 = ", quality)
42 
43 # figure 相当于画布,参数figsize 指定长宽
44 plt.figure(figsize=(10, 8))
45 # 散点
46 plt.scatter(x_data, y_data, color="blue", label="Train Data")
47 # 直线
48 plt.plot(x_data, y_hat, color="red", label="Regression")
49 # 标题
50 plt.title("Linear Regression Train")
51 # 显示图例,也就是上面的label
52 plt.legend()
53 # 显示网格
54 plt.grid("on")
55 plt.show()
56 
57 df_test = pd.read_csv(archive/test.csv)
58 # ~ 按位取反,下面两行处理NaN空值,也可以用pd.isna() 与pd.isnull()
59 df_test = df_test[~np.isnan(df_test.x)]
60 df_test = df_test[~np.isnan(df_test.y)]
61 
62 # reshape 改造成指定形状(1 列)的矩阵,内存地址不变。-1 表示通配符,即自动计算
63 x_test = df_test.x.values.reshape(-1, 1)
64 y_test = df_test.y.values.reshape(-1, 1)
65 
66 # 使用模型预测测试集的y_hat 值
67 y_test_hat = model.predict(x_test)
68 # 计算可决系数
69 quality_of_regression_test = r2_score(y_test, y_test_hat)
70 print("测试集可决系数 = ", quality_of_regression_test)
71 
72 plt.figure(figsize=(10, 8))
73 plt.scatter(x_test, y_test, color="blue", label="Test Data")
74 plt.plot(x_test, y_test_hat, color="red", label="Regression")
75 plt.title("Linear Regression Test")
76 plt.legend()
77 plt.grid("on")
78 plt.show()

控制台输出:

训练集可决系数 =  0.9999914739613014
测试集可决系数 =  0.9887986860328344

图像输出:

 

技术分享图片技术分享图片

代码中有几个需要注意的地方:

1、pandes.read_csv 函数参数有很多,实际上只要是使用‘,‘ 分隔的文件直接传入文件路径就可以读取,返回的是DataFrame 类型,类似字典。

2、pandes.read_csv 在读取训练集数据之后我没有判断空值,原因是我上次就已经发现了数据的错误,同时也是因为我忘记了(这不是一个好习惯),在作测试集判断拟合程度的时候参考了kaggle 上前辈的代码后加入了判空操作。

3、LinearRegression 类的函数在API 中参数的说明不太清晰,导致我试了很多次才知道要传入什么参数,可能是我的基础还不扎实导致的,实际上只需要将计算必须的参数传入即可。

 

总结:重写的代码可以生成模型用于测试集的拟合,同时学到了新的图像画法和更成熟的框架。但对于LinearRegression.fit() 函数生成模型的实现原理还并不清晰,猜测大概率是使用梯度下降+反向传播,但还需阅读源码学习后才能下定论。重写的代码参考了大佬的成果,并非自己原创,差距甚远。

 

机器学习02-线性回归改进

原文:https://www.cnblogs.com/RabbitKeeper/p/14710769.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!