1.获取数据,定义问题

数据介绍: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个是样本特征, 机器学习的目的就是得到一个线性回归模型,即:
线性回归的实践 - 图4
而需要学习的,就是线性回归的实践 - 图5这5个参数。

2.整理数据

3.Pandas读取数据

倒入依赖库

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4. from sklearn import datasets, linear_model

读取数据

  1. data = pd.read_csv("./data/CCPP/CCPP.csv")
  2. data.head()

image.png

4. 准备运行算法的数据

  1. X = data[["AT", "V", "AP", "RH"]]
  2. X

image.png

  1. Y = data[["PE"]]
  2. Y.head()

image.png

5. 划分训练集和测试集

  1. from sklearn.cross_validation import train_test_split
  2. X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state = 1)
  3. print(X_train.shape)
  4. print(Y_train.shape)
  5. print(X_test.shape)
  6. print(Y_test.shape)

6. 运行scikit-learn的线性模型

  1. from sklearn.linear_model import LinearRegression
  2. linreg = LinearRegression()
  3. linreg.fit(X_train, Y_train)
  4. print(linreg.intercept_)
  5. print(linreg.coef_)
  6. # Output:
  7. [460.05727267]
  8. [[-1.96865472 -0.2392946 0.0568509 -0.15861467]]

线性回归的实践 - 图9

7. 模型评价

我们需要评估我们的模型的好坏程度,对于线性回归来说,我们一般用均方差(Mean Squared Error, MSE)或者均方根差(Root Mean Squared Error, RMSE)在测试集上的表现来评价模型的好坏。

  1. #模型拟合测试集
  2. Y_pred = linreg.predict(X_test)
  3. from sklearn import metrics
  4. # 用scikit-learn计算MSE
  5. print("MSE:%d",metrics.mean_squared_error(Y_test, Y_pred))
  6. # 用scikit-learn计算RMSE
  7. print("RMSE:%data",np.sqrt(metrics.mean_squared_error(Y_test, Y_pred)))
  8. # Output:
  9. MSE:%d 20.83719154722035
  10. RMSE:%data 4.564777272465805

8. 交叉验证

  1. from sklearn.model_selection import cross_val_predict
  2. predicted = cross_val_predict(linreg, X, Y, cv= 10)
  3. # 用scikit-learn计算MSE
  4. print("MSE:%d",metrics.mean_squared_error(Y, predicted))
  5. # 用scikit-learn计算RMSE
  6. print("RMSE:%data",np.sqrt(metrics.mean_squared_error(Y, predicted)))
  7. # Output:
  8. MSE:%d 20.793672509857537
  9. RMSE:%data 4.560007950635343

9. 画图观察结果

  1. fig, ax = plt.subplots()
  2. ax.scatter(y, predicted)
  3. ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
  4. ax.set_xlabel('Measured')
  5. ax.set_ylabel('Predicted')
  6. plt.show()

image.png