Python 数据挖掘与机器学习实战 (63):回归分析介 3.4.3

阅读数:1 2020 年 1 月 11 日 17:04

Python数据挖掘与机器学习实战(63):回归分析介 3.4.3

(线性回归模型)

内容简介
本书作为数据挖掘和机器学习的读物,基于真实数据集进行案例实战,使用 Python 数据科学库,从数据预处理开始一步步介绍数据建模和数据挖掘的过程。书中主要介绍了数据挖掘的基础知识、基本工具和实践方法,通过循序渐进地讲解算法,带领读者轻松踏上数据挖掘之旅。本书采用理论与实践相结合的方式,呈现了如何使用逻辑回归进行环境数据检测,如何使用 HMM 进行中文分词,如何利用卷积神经网络识别雷达剖面图,如何使用循环神经网络构建聊天机器人,如何使用朴素贝叶斯算法进行破产预测,如何使用 DCGAN 网络进行人脸生成等。本书也涉及神经网络、在线学习、强化学习、深度学习和大数据处理等内容。
本书以人工智能主流编程语言 Python 3 版作为数据分析与挖掘实战的应用工具,从 Pyhton 的基础语法开始,陆续介绍了 NumPy 数值计算、Pandas 数据处理、Matplotlib 数据可视化、爬虫和 Sklearn 数据挖掘等内容。全书共涵盖 16 个常用的数据挖掘算法和机器学习实战项目。通过学习本书内容,读者可以掌握数据分析与挖掘的理论知识及实战技能。
本书内容丰富,讲解由浅入深,特别适合对数据挖掘和机器学习算法感兴趣的读者阅读,也适合需要系统掌握深度学习的开发人员阅读,还适合 Python 程序员及人工智能领域的开发人员阅读。编程爱好者、高校师生及培训机构的学员也可以将本书作为兴趣读物或教材使用。

线性回归模型具有如下优缺点。

  • 优点:快速;没有调节参数;可轻易解释;可理解。
  • 缺点:相比其他复杂一些的模型,其预测准确率不高,因为它假设特征和响应之间存在确定的线性关系,这种假设对于非线性的关系,线性回归模型显然不能很好地进行数据建模。

1.使用 pandas 构建 X(特征向量)和 y(标签列)

scikit-learn 要求 X 是一个特征矩阵,y 是一个 NumPy 向量。pandas 构建在 NumPy 之上。因此,X 可以是 pandas 的 DataFrame,y 可以是 pandas 的 Series,scikit-learn 可以理解这种结构。

复制代码
#创建特征列表
feature_cols = ['TV', 'Radio', 'Newspaper']
#使用列表选择原始 DataFrame 的子集
X = data[feature_cols]
X = data[['TV', 'Radio', 'Newspaper']]
# 输出前 5 项数据
print (X.head())

检查 X 类型及维度,代码如下:

复制代码
print (type(X))
print (X.shape)

输出结果如下:

复制代码
TV Radio Newspaper
0 230.1 37.8 69.2
1 44.5 39.3 45.1
2 17.2 45.9 69.3
3 151.5 41.3 58.5
4 180.8 10.8 58.4
<class 'pandas.core.frame.DataFrame'>
(200, 3)

查看数据集中的数据,代码如下:

复制代码
#从 DataFrame 中选择一个 Series
y = data['Sales']
y = data.Sales
#输出前 5 项数据
print (y.head())

输出的结果如下:

复制代码
0 22.1
1 10.4
2 9.3
3 18.5
4 12.9
Name: Sales

2.构建训练集与测试集

构建训练集和测试集,分别保存在 X_train、y_train、Xtest 和 y_test 中。

复制代码
<pre name="code" class="python"><span style="font-size:14px;">##构造训练
集和测试集
from sklearn.cross_validation import train_test_split #这里是引用交叉验证
X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1)
# 75% 用于训练,25% 用于测试
print (X_train.shape)
print (y_train.shape)
print (X_test.shape)
print (y_test.shape)

查看构建的训练集和测试集,输出结果如下:

复制代码
(150,3)
(150,)
(50,3)
(50,)

3.sklearn 的线性回归

使用 sklearn 做线性回归,首先导入相关的线性回归模型,然后做线性回归模拟。

复制代码
from sklearn.linear_model import LinearRegression
linreg = LinearRegression()
model=linreg.fit(X_train, y_train) #线性回归
print (model)
print (linreg.intercept_) #输出结果
print (linreg.coef_)

输出的结果如下:

复制代码
LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
2.66816623043
[ 0.04641001 0.19272538 -0.00349015]

输出变量的回归系数:

复制代码
# 将特征名称与系数对应
zip(feature_cols, linreg.coef_)

输出如下:

复制代码
[('TV', 0.046410010869663267),
('Radio', 0.19272538367491721),
('Newspaper', -0.0034901506098328305)]

线性回归的结果如下:

y=2.66+0.0464×TV+0.192×Radio0.00349×Newspaper(38)

如何解释各个特征对应的系数的意义呢?

对于给定了 RadioNewspaper 的广告投入,如果在 TV 广告上每多投入 1 个单位,对应销量将增加 0.0466 个单位。也就是其他两个媒体的广告投入固定,在 TV 广告上每增加 1000 美元(因为单位是 1000 美元),销量将增加 46.6(因为单位是 1000)。但是大家注意,这里的 Newspaper 的系数是负数,所以可以考虑不使用 Newspaper 这个特征。

4.预测

通过线性模拟求出回归模型之后,可通过模型预测数据,通过 predict 函数即可求出预测结果。

复制代码
y_pred = linreg.predict(X_test)
print (y_pred)
print (type(y_pred))

输出结果如下:

复制代码
[ 14.58678373 7.92397999 16.9497993 19.35791038 7.36360284
7.35359269 16.08342325 9.16533046 20.35507374 12.63160058
22.83356472 9.66291461 4.18055603 13.70368584 11.4533557
4.16940565 10.31271413 23.06786868 17.80464565 14.53070132
15.19656684 14.22969609 7.54691167 13.47210324 15.00625898
19.28532444 20.7319878 19.70408833 18.21640853 8.50112687
9.8493781 9.51425763 9.73270043 18.13782015 15.41731544
5.07416787 12.20575251 14.05507493 10.6699926 7.16006245
11.80728836 24.79748121 10.40809168 24.05228404 18.44737314
20.80572631 9.45424805 17.00481708 5.78634105 5.10594849]
<type 'numpy.ndarray'>

5.评价测度

对于分类问题,评价测度是准确率,但其不适用于回归问题,因此使用针对连续数值的评价测度(evaluation metrics)。

这里介绍 3 种常用的针对线性回归的评价测度。

  • 平均绝对误差(Mean Absolute Error,MAE);
  • 均方误差(Mean Squared Error,MSE);
  • 均方根误差(Root Mean Squared Error,RMSE)。

这里使用 RMES 进行评价测度。

复制代码
#计算 Sales 预测的 RMSE
print (type(y_pred),type(y_test))
print (len(y_pred),len(y_test))
print (y_pred.shape,y_test.shape)
from sklearn import metrics
import numpy as np
sum_mean=0
for i in range(len(y_pred)):
sum_mean+=(y_pred[i]-y_test.values[i])**2
sum_erro=np.sqrt(sum_mean/50)
# 计算 RMSE 的大小
print ("RMSE by hand:",sum_erro)

最后的结果如下:

复制代码
<type 'numpy.ndarray'><class 'pandas.core.series.Series'>
50 50
(50,) (50,)
RMSE by hand: 1.42998147691

接下来绘制 ROC 曲线,代码如下:

复制代码
import matplotlib.pyplot as plt
plt.figure()
plt.plot(range(len(y_pred)),y_pred,'b',label="predict")
plt.plot(range(len(y_pred)),y_test,'r',label="test")
plt.legend(loc="upper right") #显示图中的标签
plt.xlabel("the number of sales") #横坐标轴
plt.ylabel('value of sales') #纵坐标轴
plt.show()#显示结果

运行程序,显示结果如图 3-4 所示(上面的曲线是真实值曲线,下面的曲线是预测值曲线)。

至此,整个一次多元线性回归的预测就结束了。

Python数据挖掘与机器学习实战(63):回归分析介 3.4.3

图 3-4 模拟效果比对图

Python数据挖掘与机器学习实战(63):回归分析介 3.4.3

购书地址 https://item.jd.com/12623592.html?dist=jd

评论

发布