在意识到上次出现的问题之后,学习了新的技术并参考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() 函数生成模型的实现原理还并不清晰,猜测大概率是使用梯度下降+反向传播,但还需阅读源码学习后才能下定论。重写的代码参考了大佬的成果,并非自己原创,差距甚远。
原文:https://www.cnblogs.com/RabbitKeeper/p/14710769.html