线性回归处理数据
处理方式 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
- 读取数据(查看信息格式)
df=pd.read_excel("data.xlsx") # 读取xlsx格式的文件
df.head() # 读取前五行数据显示
- 数据信息查看
df.shape # 数据大小分布(x行y列)
df.dtypes # 数据类型(5列数据的数据格式)
df.isnull().sum() # 数据为空的总数计数
- 数据统计信息查看
df.describe() # 数据值统计(总数个数、分布百分比)
item | expression |
---|---|
count | 每一列非空值的数量 |
mean | 每一列的平均值 |
std | 每一列的标准差 |
min | 最小值 |
25% | 25%分位数,排序之后排在25%位置的数 |
50% | 50%分位数 |
75% | 75%分位数 |
max | 最大值 |
对离散值来说特有的:
unique | 不重复的离散值数目,去重之后的个数 |
---|---|
top | 出现次数最多的离散值 |
freq | 上述的top出现的次数 |
数据处理
- 选择需要的样本数据x,也就是前4个字段的信息(倒数第一列为结果值)
x=df.iloc[:.:-1] # 所有行,除去倒数第一列(结果值)
x.head()
- 选择结果的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×AT−0.2392946×V+0.0568509×AP−0.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 k−1个子集作为训练集,剩下那个作为测试集。
这样就可以获取 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进行反馈调试,而且部分代码存在错误或缺漏处,我进行了一定修改,部分代码进行了加注