线性回归能做什么

线性回归能模拟拟合一个多元1次方程,并得到相应系数和偏差

获取数据, 定义问题

没有数据, 我们就没办法研究机器学习, 所以我们先找到一点可以用来做线性回归问题求解的数据, 这里我们找到了UCI大学的公开的机器学习数据来练习线性回归.
数据的介绍: http://archive.ics.uci.edu/ml/datasets/Combined+Cycle+Power+Plant
数据的下载地址在这: http://archive.ics.uci.edu/ml/machine-learning-databases/00294/
里面是一个循环发电场的数据,共有9568个样本数据,每个数据有5列,分别是:AT(温度), V(压力), AP(湿度), RH(压强), PE(输出电力)。我们不用纠结于每项具体的意思。
我们的问题是得到一个线性的关系,对应PE是样本输出,而AT/V/AP/RH这4个是样本特征, 机器学习的目的就是得到一个线性回归模型,即:
线性回归 (Linear Regression) - 图1
而需要学习的, 就是线性回归 (Linear Regression) - 图2这5个参数

整理数据

下载后的数据可以发现是一个压缩文件,解压后可以看到里面有一个xlsx文件,我们先用excel把它打开,接着“另存为“csv”格式,保存下来,后面我们就用这个csv来运行线性回归。
打开这个csv可以发现数据已经整理好,没有非法数据,因此不需要做预处理。但是这些数据并没有归一化,也就是转化为均值0,方差1的格式。也不用我们搞,后面scikit-learn在线性回归时会先帮我们把归一化搞定。
好了,有了这个csv格式的数据,我们就可以大干一场了。

代码及运行结果展示

导入库

  1. import os
  2. %matplotlib inline
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. import pandas as pd
  6. from sklearn import datasets, linear_model

前期准备

获取数据并展示前5行

  1. # read_csv里面的参数就是csv文件在你电脑上的路径, 此处csv文件放在本文件的相对目录的CCPP文件夹下
  2. data = pd.read_csv('.\CCPP\ccpp.csv')
  3. # 读取csv文件的前5行和最后5行试试
  4. data.head()
AT V AP RH PE
0 8.34 40.77 1010.84 90.01 480.48
1 23.64 58.49 1011.40 74.20 445.75
2 29.74 56.90 1007.15 41.91 438.76
3 19.07 49.69 1007.22 76.79 453.09
4 11.80 40.66 1017.13 97.20 464.43

打印数据维度

  1. # 打印数据维度试试
  2. data.shape

(9568, 5)

获取数据前4列

  1. # 获取前4列的值
  2. x = data[['AT', 'V', 'AP', "RH"]]
  3. x.head()
AT V AP RH
0 8.34 40.77 1010.84 90.01
1 23.64 58.49 1011.40 74.20
2 29.74 56.90 1007.15 41.91
3 19.07 49.69 1007.22 76.79
4 11.80 40.66 1017.13 97.20

获取数据最后一列

  1. # 获取最后一列试试
  2. y = data[['PE']]
  3. y.head()
列数 PE
0 480.48
1 445.75
2 438.76
3 453.09
4 464.43

划分数据集

  1. # 把x,y的样本组合, 划成两个部分, 一部分是训练集, 一部分是测试集, 代码如下:
  2. from sklearn.model_selection import train_test_split
  3. x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1)
  4. # 打印分好的数据
  5. print(x_train.shape)
  6. print(x_test.shape)
  7. print(y_train.shape)
  8. print(y_test.shape)

(7176, 4) (2392, 4) (7176, 1) (2392, 1)

填入数据,进行训练

  1. # 运行scikit-learn的线性模型
  2. from sklearn.linear_model import LinearRegression
  3. linreg = LinearRegression()
  4. linreg.fit(x_train, y_train)

LinearRegression()

训练结束, 查看训练后的模型系数

  1. # 拟合完毕后, 看看我们模型的系数结果
  2. print(linreg.intercept_)
  3. print(linreg.coef_)
  4. '''
  5. [447.06297099]
  6. [[-1.97376045 -0.23229086 0.0693515 -0.15806957]]
  7. 也就得到我们的方程为
  8. PE = 447.06297099 -1.97376045 * AT -0.23229086 * V + 0.0693515 * AP -0.15806957 *RH
  9. '''

[447.06297099] [[-1.97376045 -0.23229086 0.0693515 -0.15806957]]

模型评价

对前4列进行分析得到的模型,进行评价

  1. # 模型评价
  2. y_pred = linreg.predict(x_test)
  3. from sklearn import metrics
  4. # 用scikit-learn计算MSE
  5. print("MSE: ", metrics.mean_squared_error(y_test, y_pred))
  6. # 用scikir-learn计算RMSE
  7. print("RMSE: ", np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

MSE: 20.080401202073894 RMSE: 4.481116066570235

重新训练前3列,并进行分析得到的模型,进行评价

  1. X = data[['AT', 'V', 'AP']]
  2. y = data[['PE']]
  3. X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
  4. from sklearn.linear_model import LinearRegression
  5. linreg = LinearRegression()
  6. linreg.fit(X_train, y_train)
  7. #模型拟合测试集
  8. y_pred = linreg.predict(X_test)
  9. from sklearn import metrics
  10. # 用scikit-learn计算MSE
  11. print("MSE:",metrics.mean_squared_error(y_test, y_pred))
  12. # 用scikit-learn计算RMSE
  13. print("RMSE:",np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

MSE: 23.208907470136236 RMSE: 4.817562399194871

交叉验证

  1. # 交叉验证
  2. # 我们可以通过交叉验证持续优化模型, 代码如下, 我们采用10折交叉验证, 即cross_val_predict中的cv参数为10
  3. x = data[['AT', 'V', 'AP', 'RH']]
  4. y = data[['PE']]
  5. from sklearn.model_selection import cross_val_predict
  6. predicted = cross_val_predict(linreg, x, y, cv=10)
  7. # 用scikit-learn计算MSE
  8. print('MSE: ', metrics.mean_squared_error(y, predicted))
  9. # 用scikit-learn计算RMSE
  10. print('RMSE', np.sqrt(metrics.mean_squared_error(y, predicted)))

MSE: 20.795597461943103 RMSE 4.560219014690315

画图展示

  1. '''
  2. 这幅图描述了线性回归模型中真实值和预测值之间的差距, 点越靠近中间的y=x代表预测效果越好
  3. '''
  4. fig, ax = plt.subplots()
  5. ax.scatter(y, predicted)
  6. ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
  7. ax.set_xlabel('Measured')
  8. ax.set_ylabel('Predicted')
  9. plt.show()

image.png

完整代码

  1. import os
  2. %matplotlib inline
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. import pandas as pd
  6. from sklearn import datasets, linear_model
  7. # read_csv里面的参数就是csv文件在你电脑上的路径, 此处csv文件放在本文件的相对目录的CCPP文件夹下
  8. data = pd.read_csv('.\CCPP\ccpp.csv')
  9. # 读取csv文件的前5行和最后5行试试
  10. data.head()
  11. # 打印数据的维度
  12. data.shape
  13. x = data[['AT', 'V', 'AP', "RH"]]
  14. x.head()
  15. y = data[['PE']]
  16. y.head()
  17. # 把x,y的样本组合, 划成两个部分, 一部分是训练集, 一部分是测试集, 代码如下:
  18. from sklearn.model_selection import train_test_split
  19. x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1)
  20. # 打印分好的数据
  21. print(x_train.shape)
  22. print(x_test.shape)
  23. print(y_train.shape)
  24. print(y_test.shape)
  25. # 运行scikit-learn的线性模型
  26. from sklearn.linear_model import LinearRegression
  27. linreg = LinearRegression()
  28. linreg.fit(x_train, y_train)
  29. # 拟合完毕后, 看看我们模型的系数结果
  30. print(linreg.intercept_)
  31. print(linreg.coef_)
  32. '''
  33. [447.06297099]
  34. [[-1.97376045 -0.23229086 0.0693515 -0.15806957]]
  35. 也就得到我们的方程为
  36. PE = 447.06297099 -1.97376045 * AT -0.23229086 * V + 0.0693515 * AP -0.15806957 *RH
  37. '''
  38. # 模型评价
  39. y_pred = linreg.predict(x_test)
  40. from sklearn import metrics
  41. # 用scikit-learn计算MSE
  42. print("MSE: ", metrics.mean_squared_error(y_test, y_pred))
  43. # 用scikir-learn计算RMSE
  44. print("RMSE: ", np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
  45. X = data[['AT', 'V', 'AP']]
  46. y = data[['PE']]
  47. X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
  48. from sklearn.linear_model import LinearRegression
  49. linreg = LinearRegression()
  50. linreg.fit(X_train, y_train)
  51. #模型拟合测试集
  52. y_pred = linreg.predict(X_test)
  53. from sklearn import metrics
  54. # 用scikit-learn计算MSE
  55. print("MSE:",metrics.mean_squared_error(y_test, y_pred))
  56. # 用scikit-learn计算RMSE
  57. print("RMSE:",np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
  58. # 交叉验证
  59. # 我们可以通过交叉验证持续优化模型, 代码如下, 我们采用10折交叉验证, 即cross_val_predict中的cv参数为10
  60. x = data[['AT', 'V', 'AP', 'RH']]
  61. y = data[['PE']]
  62. from sklearn.model_selection import cross_val_predict
  63. predicted = cross_val_predict(linreg, x, y, cv=10)
  64. # 用scikit-learn计算MSE
  65. print('MSE: ', metrics.mean_squared_error(y, predicted))
  66. # 用scikit-learn计算RMSE
  67. print('RMSE', np.sqrt(metrics.mean_squared_error(y, predicted)))
  68. fig, ax = plt.subplots()
  69. ax.scatter(y, predicted)
  70. ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
  71. ax.set_xlabel('Measured')
  72. ax.set_ylabel('Predicted')
  73. plt.show()

感想

利用现成的接口,我们可以随意训练拥有n个自变量+1个因变量的n元1次方程

参考链接

https://www.cnblogs.com/pinard/p/6016029.html