CCPP_test

线性回归处理数据

处理方式 sklearn 线性回归
  • 数据来源
  • 数据探索
  • 数据处理
  • 运行 sklearn 线性模型
  • 模型评估
  • 可视化展示结果
数据来源

1、数据的介绍看这里: http://archive.ics.uci.edu/ml/datasets/Combined+Cycle+Power+Plant

2、数据的下载地址请移步 http://archive.ics.uci.edu/ml/machine-learning-databases/00294/

数据中有4个字段属性用来描述发电厂的输出电力,最后一个是真实的输出电力值。

我们现在需要做的是利用线性回归模型找到4个因素对输出电力的影响,来预测后期的发电力。

数据探索

我们所需要的库:

import pandas as pd
import numpy  as np
from sklearn import datasets, linear_model
from sklearn.linear_model import LinearRegression  # 导入线性回归模型

import matplotlib.pyplot as plt
  1. 读取数据(查看信息格式)
df=pd.read_excel("data.xlsx")       # 读取xlsx格式的文件
df.head()       # 读取前五行数据显示
  1. 数据信息查看
df.shape    # 数据大小分布(x行y列)
df.dtypes   # 数据类型(5列数据的数据格式)
df.isnull().sum()   # 数据为空的总数计数
  1. 数据统计信息查看
df.describe()   # 数据值统计(总数个数、分布百分比)
itemexpression
count每一列非空值的数量
mean每一列的平均值
std每一列的标准差
min最小值
25%25%分位数,排序之后排在25%位置的数
50%50%分位数
75%75%分位数
max最大值

对离散值来说特有的:

unique不重复的离散值数目,去重之后的个数
top出现次数最多的离散值
freq上述的top出现的次数
数据处理
  1. 选择需要的样本数据x,也就是前4个字段的信息(倒数第一列为结果值)
x=df.iloc[:.:-1]    # 所有行,除去倒数第一列(结果值)
x.head()
  1. 选择结果的y值(最后一个属性字段)
y=df[["PE"]]
y.head()
数据集划分

将一部分数据划入训练集,另一部分划入测试集

from sklearn.model_selection import train_test_split  # 从模型选择模块中导入训练、测试集模块

X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=1)

X_train   # 7176条数据训练数据

在这里插入图片描述

X_test` # 2392条测试数据

在这里插入图片描述

样本的输出值的行记录是和对应的X相同的;同时我们也发现:本次案例有75%的数据作为了训练集,25%作为了测试集 验证想法:

len(X_train)/len(df)    # 训练集与总体长度的比值
拟合实例化对象
line = LinearRegression()
line = line.fit(X_train, Y_train)

print(line.intercept_)      # 截距计算
print(line.coef_)           # 相关系数计算

得到结果:

[460.05727267]
[[-1.96865472 -0.2392946   0.0568509  -0.15861467]]

那么按输入顺序可以得到需求的线性表达式:
P E = − 1.96865472 × A T − 0.2392946 × V + 0.0568509 × A P − 0.15861467 × P H + 460.05727267 PE=-1.96865472\times AT-0.2392946\times V+0.0568509\times AP-0.15861467\times PH+460.05727267 PE=1.96865472×AT0.2392946×V+0.0568509×AP0.15861467×PH+460.05727267

模型评价

通过训练集的数据我们得到了线性回归的表达式,现在我们通过该表达式来模拟我们之前产生的测试集数据。

一个模型的评估,对于线性回归通常就是用上面我们介绍的均方差(Mean Squared Error, MSE)或者均方根差(Root Mean Squared Error, RMSE)在测试集上的表现来评价模型的好坏。下面通过代码来进行测试
(此处开始使用测试集数据进行误差分析)

y_pred = line.predict(X_test)  # 对测试集数据进行预测

y_pred

数据结果:

array([[457.26722361],
       [466.70748375],
       [440.33763981],
       ...,
       [457.39596168],
       [429.37990249],
       [438.16837983]])

len(y_pred) # 结果为2392

这里可以承接到《机器学习》(周志华) 的误差分析

from sklearn import metrics

# 输出MSE
print("MSE: ", metrics.mean_squared_error(Y_test, y_pred))


# 输出RMSE:MSE开根号的结果
print("RMSE: ",np.sqrt(metrics.mean_squared_error(Y_test,y_pred)))
使用交叉验证优化模型

交叉验证法:将全部数据样本 D D D划分作 k k k个大小相似的互斥子集。每个子集尽量保持数据分布的一致性。然后用 k − 1 k-1 k1个子集作为训练集,剩下那个作为测试集。

这样就可以获取 k k k组训练集/测试集,从而进行 k k k次的训练和测试,最终返回 k k k次训练的均值。

我们可以使用 s k l e a r n sklearn sklearn中自带的交叉验证方法来优化我们得到的模型,下面的例子中,采用的 10 10 10折交叉验证:

line
ans: LinearRegression()
from sklearn.model_selection import cross_val_predict  # 导入交叉验证模块

y_predicted = cross_val_predict(line,x,y,cv=10) 
y_predicted  # 通过交叉验证得到的预测值
ans:
array([[467.24487977],
       [444.06421837],
       [483.53893768],
       ...,
       [432.47556666],
       [443.07355843],
       [449.74395838]])
len(y_predicted)
ans: 9568
# 输出MSE

print("MSE(cross):",metrics.mean_squared_error(y,y_predicted)) 

print("RMSE(cross): ",np.sqrt(metrics.mean_squared_error(y,y_predicted)))


ans:
MSE(cross):  20.79367250985753
RMSE(cross):  4.560007950635342

这里验证了交叉验证的误差优于未优化的误差

绘图

最后,我们画出真实的样本值和预测值之间的图形,当点距离中间 y = x y=x y=x的值越近,说明预测损失越低。

下面是使用 m a t p l o t l i b matplotlib matplotlib绘图的代码和效果:

# 绘图部分
import matplotlib.pyplot as plt

fig, ax = plt.subplots()    # ax为设定坐标轴
ax.scatter(y, y_predicted)  # 标出所有点
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=3)    # 绘制线由(y.min(),y.min())至(y.max(),y.max()),
# 'k--' 表示 color='black', line_style 为虚线, lw 意为 'line_width'

ax.set_xlabel('Measured')  # 真实值
ax.set_ylabel('Predicted')  # 预测值

plt.show()

在这里插入图片描述

关于使用 p a n d a s pandas pandas 绘图
# 确立 pandas 中的 DataFrame 表的数据源
data = pd.concat([pd.DataFrame(y), pd.DataFrame(y_predicted)], axis=1)
data.columns = ['Measured', 'Predicted']
data

ans:
在这里插入图片描述

# pandas 绘图
import plotly.express as px

fig = px.scatter(data, x='Measured', y='Predicted', trendline="ols", trendline_color_override="red")
fig.show()

得到视图:
在这里插入图片描述

作者:皮皮大
复现者:Liwait
说明:其中部分代码使用 I D L E IDLE IDLE进行反馈调试,而且部分代码存在错误或缺漏处,我进行了一定修改,部分代码进行了加注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值