【机器学习】<刘建平Pinard老师博客学习记录>Scikit-learn&Pandas(Numpy&Matplotlib)学习线性回归

目录

一、数据获取&问题定义:

1.数据获取:

2.问题定义: 

二、整理数据:

三、使用Pandas读取数据:

1.导入依赖库:

2.使用Pandas读取函数:

四、数据准备:

1.查看数据:

 2.划分训练集和测试集:

五、运行scikit-learn的线性模型:

六、模型评价:

七、交叉验证:

八、画图观察结果:


一、数据获取&问题定义:

1.数据获取:

数据集介绍:UCI Machine Learning Repository: Combined Cycle Power Plant Data Set

数据集下载: Index of /ml/machine-learning-databases/00294

2.问题定义: 

        里面是一个循环发电场的数据,共有9568个样本数据,每个数据有5列,分别是:AT(温度), V(压力), AP(湿度), RH(压强), PE(输出电力)。


二、整理数据:

        下载后的数据可以发现是一个压缩文件,解压后可以看到里面有一个xlsx文件,我们先用excel把它打开,接着“另存为“”csv格式,保存下来,后面我们就用这个csv来运行线性回归。

        打开这个csv可以发现数据已经整理好,没有非法数据,因此不需要做预处理。但是这些数据并没有归一化,也就是转化为均值0,方差1的格式。也不用我们搞,后面scikit-learn在线性回归时会先帮我们把归一化搞定。

一般情况下,我们需要对得到的数据集进行处理!!!


三、使用Pandas读取数据:

1.导入依赖库:

# 导入绘制图像的matplotlib库:
import matplotlib.pylab as plt

# 能够直接现实matplotlib绘制的图片,不需要调用show()方法:
%matplotlib inline

# 导入Numpy:
import numpy as np

# 导入Pandas:
import pandas as pd

# 导入机器学习库:
from sklearn import datasets, linear_model

        %matplotlib inline这一句是IPython的魔法函数,可以在IPython编译器里直接使用,作用是内嵌画图,省略掉plt.show()这一步,直接显示图像。如果不加这一句的话,我们在画图结束之后需要加上plt.show()才可以显示图像。

2.使用Pandas读取函数:

# read_csv 里面的参数是csv在磁盘上的路径(相对路径):
data = pd.read_csv('./Folds5x2_pp.csv')

# 默认展示前5行数据:
data.head()


四、数据准备:

1.查看数据:

查看数据维度:

# 查看样本格式:
data.shape

说明我们有9568个样本,每个样本有5列。

现在我们开始准备样本特征X,我们用AT, V,AP和RH这4个列作为样本特征。

# 取出特征值:
X = data[['AT', 'V', 'AP','RH']]

X.head()

接着我们准备样本输出y, 我们用PE作为样本输出。

Y = data[['PE']]

Y.head()

 2.划分训练集和测试集:

我们把X和Y的样本组合划分成两部分,一部分是训练集,一部分是测试集,代码如下:

# 导入机器学习库的数据划分函数:
from sklearn.cross_validation import train_test_split

# random_state:随机数的种子
X_train, X_test, y_train, y_test = train_test_split(X, Y, random_state=1)

        random_state (随机数种子):其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。

        查看下训练集和测试集的维度:

print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

可以看到75%的样本数据被作为训练集,25%的样本被作为测试集。满足简单交叉验证 

【机器学习】<刘建平Pinard老师博客学习记录>交叉验证(Cross Validation)_故里的博客-CSDN博客交叉验证是在机器学习建立模型和验证模型参数时常用的办法。交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。 那么什么时候才需要交叉验证呢?交叉验证用在数据不是很充足的时候。比如在我日常项目里面,对于普通适中问题,如果数据样本量小于一万条,我们就会采用交叉验证来训练优化选择...https://blog.csdn.net/weixin_52058417/article/details/122028525?spm=1001.2014.3001.5501


五、运行scikit-learn的线性模型:

        用scikit-learn的线性模型来拟合我们的问题了,scikit-learn的线性回归算法使用的是最小二乘法来实现的。

# 导入机器学习库线性回归函数:
from sklearn.linear_model import LinearRegression

linreg = LinearRegression()

# 使用线性回归进行训练模型:
linreg.fit(X_train, y_train)

拟合完毕后,我们看看我们的需要的模型系数结果:

print (linreg.intercept_)
print (linreg.coef_)


六、模型评价:

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

        我们看看我们的模型的MSE和RMSE,代码如下:

#模型拟合测试集
y_pred = linreg.predict(X_test)

from sklearn import metrics

# 用scikit-learn计算MSE
print("MSE:",metrics.mean_squared_error(y_test, y_pred))

# 用scikit-learn计算RMSE
print("RMSE:",np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

        得到了MSE或者RMSE,如果我们用其他方法得到了不同的系数,需要选择模型时,就用MSE小的时候对应的参数。

        比如这次我们用AT, V,AP这3个列作为样本特征。不要RH, 输出仍然是PE。代码如下:

X = data[['AT', 'V', 'AP']]
y = data[['PE']]

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

from sklearn.linear_model import LinearRegression
linreg = LinearRegression()
linreg.fit(X_train, y_train)

#模型拟合测试集
y_pred = linreg.predict(X_test)
from sklearn import metrics

# 用scikit-learn计算MSE
print("MSE:",metrics.mean_squared_error(y_test, y_pred))

# 用scikit-learn计算RMSE
print("RMSE:",np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

可以看出,去掉RH后,模型拟合的没有加上RH的好,MSE变大了。


七、交叉验证:

        我们可以通过交叉验证来持续优化模型,代码如下,我们采用10折交叉验证,即cross_val_predict中的cv参数为10:

X = data[['AT', 'V', 'AP', 'RH']]
y = data[['PE']]

from sklearn.model_selection import cross_val_predict
predicted = cross_val_predict(linreg, X, y, cv=10)

# 用scikit-learn计算MSE
print ("MSE:",metrics.mean_squared_error(y, predicted))

# 用scikit-learn计算RMSE
print ("RMSE:",np.sqrt(metrics.mean_squared_error(y, predicted)))

        可以看出,采用交叉验证模型的MSE比第六的大,主要原因是我们这里是对所有折的样本做测试集对应的预测值的MSE,而第六仅仅对25%的测试集做了MSE。两者的先决条件并不同。


八、画图观察结果:

        这里画图真实值和预测值的变化关系,离中间的直线y=x直接越近的点代表预测损失越低。代码如下:

fig, ax = plt.subplots()

ax.scatter(y, predicted)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
ax.set_xlabel('Measured')
ax.set_ylabel('Predicted')

plt.show()

以上就是用scikit-learn和pandas学习线性回归的过程,希望可以对初学者有所帮助。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃糖的范同学

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值