栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【机器学习】<刘建平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学习线性回归的过程,希望可以对初学者有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/674880.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号