首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 机器学习:多元线性回归

1、什么是多元线性回归模型?

当y值的影响因素不唯一时,采用多元线性回归模型。例如商品的销售额可能不电视广告投入,收音机广告投入,报纸广告投入有关系,可以有 sales =β0+β1*TV+β2* radio+β3*newspaper.

2、使用pandas来读取数据

pandas 是一个用于数据探索、数据分析和数据处理的python库

importpandas as pd

# read csv file directly from a URL and save the results

data=pd.read_csv('/home/lulei/Advertising.csv')

# display the first 5 rows

data.head()

这里的Advertising.csv是来自http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv。大家可以自己下载。

上面代码的运行结果:

TV Radio Newspaper Sales0 230.1 37.8 69.2 22.11 44.5 39.3 45.1 10.42 17.2 45.9 69.3 9.33 151.5 41.3 58.5 18.54 180.8 10.8 58.4 12.9

pandas的两个主要数据结构:Series和DataFrame:

Series类似于一维数组,它有一组数据以及一组与之相关的数据标签(即索引)组成。

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典。

# display the last 5 rows

data.tail()

只显示结果的末尾5行

TV Radio Newspaper Sales195 38.2 3.7 13.8 7.6196 94.2 4.9 8.1 9.7197 177.0 9.3 6.4 12.8198 283.6 42.0 66.2 25.5199 232.1 8.6 8.7 13.4

# check the shape of the DataFrame(rows, colums)

data.shape

查看DataFrame的形状,注意第一列的叫索引,和数据库某个表中的第一列类似。

(200,4)

3、分析数据

特征:

TV:对于一个给定市场中单一产品,用于电视上的广告费用(以千为单位)

Radio:在广播媒体上投资的广告费用

Newspaper:用于报纸媒体的广告费用

响应:

Sales:对应产品的销量

在这个案例中,我们通过不同的广告投入,预测产品销量。因为响应变量是一个连续的值,所以这个问题是一个回归问题。数据集一共有200个观测值,每一组观测对应一个市场的情况。

注意:这里推荐使用的是seaborn包。网上说这个包的数据可视化效果比较好看。其实seaborn也应该属于matplotlib的内部包。只是需要再次的单独安装。

importseaborn as sns

importmatplotlib.pyplot as plt

# visualize the relationship between the features and the response using scatterplots

sns.pairplot(data, x_vars=['TV','Radio','Newspaper'], y_vars='Sales', size=7, aspect=0.8)

plt.show()#注意必须加上这一句,否则无法显示。

这里选择TV、Radio、Newspaper 作为特征,Sales作为观测值

seaborn的pairplot函数绘制X的每一维度和对应Y的散点图。通过设置size和aspect参数来调节显示的大小和比例。可以从图中看出,TV特征和销量是有比较强的线性关系的,而Radio和Sales线性关系弱一些,Newspaper和Sales线性关系更弱。通过加入一个参数kind='reg',seaborn可以添加一条最佳拟合直线和95%的置信带。

sns.pairplot(data, x_vars=['TV','Radio','Newspaper'], y_vars='Sales', size=7, aspect=0.8, kind='reg')

plt.show()

结果显示如下:

4、线性回归模型

优点:快速;没有调节参数;可轻易解释;可理解。

缺点:相比其他复杂一些的模型,其预测准确率不是太高,因为它假设特征和响应之间存在确定的线性关系,这种假设对于非线性的关系,线性回归模型显然不能很好的对这种数据建模。

线性模型表达式: 其中

y是响应

在这个案例中:

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

scikit-learn要求X是一个特征矩阵,y是一个NumPy向量。

pandas构建在NumPy之上。

因此,X可以是pandas的DataFrame,y可以是pandas的Series,scikit-learn可以理解这种结构。

#create a python list of feature names

feature_cols = ['TV','Radio','Newspaper']

# use the list to select a subset of the original DataFrame

X = data[feature_cols]

# equivalent command to do this in one line

X = data[['TV','Radio','Newspaper']]

# print the first 5 rows

printX.head()

# check the type and shape of X

printtype(X)

printX.shape

输出结果如下:

TV Radio Newspaper0 230.1 37.8 69.21 44.5 39.3 45.12 17.2 45.9 69.33 151.5 41.3 58.54 180.8 10.8 58.4(200, 3)

# select a Series from the DataFrame

y = data['Sales']

# equivalent command that works if there are no spaces in the column name

y = data.Sales

# print the first 5 values

printy.head()

输出的结果如下:

0 22.11 10.42 9.33 18.54 12.9Name: Sales

(2)、构建训练集与测试集

##构造训练集和测试集

from sklearn.cross_validation import train_test_split #这里是引用了交叉验证

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

#default split is 75% for training and 25% for testing

[html]view plaincopy

print X_train.shape

print y_train.shape

print X_test.shape

print y_test.shape

输出结果如下:

(150, 3)(150,)(50, 3)(50,)

(3)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]

# pair the feature names with the coefficients

zip(feature_cols, linreg.coef_)

输出如下:

y=2.668+0.0464∗TV+0.192∗Radio-0.00349∗Newspaper

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

对于给定了Radio和Newspaper的广告投入,如果在TV广告上每多投入1个单位,对应销量将增加0.0466个单位。就是加入其它两个媒体投入固定,在TV广告上每增加1000美元(因为单位是1000美元),销量将增加46.6(因为单位是1000)。但是大家注意这里的newspaper的系数居然是负数,所以我们可以考虑不使用newspaper这个特征。这是后话,后面会提到的。

(4)、预测

y_pred = linreg.predict(X_test)

printy_pred

printtype(y_pred)

输出结果如下:

5、回归问题的评价测度

(1) 评价测度

对于分类问题,评价测度是准确率,但这种方法不适用于回归问题。我们使用针对连续数值的评价测度(evaluation metrics)。

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

1)平均绝对误差(Mean Absolute Error, MAE)

(2)均方误差(Mean Squared Error, MSE)

(3)均方根误差(Root Mean Squared Error, RMSE)

这里我使用RMES。

计算Sales预测的RMSE

printtype(y_pred),type(y_test)

printlen(y_pred),len(y_test)

printy_pred.shape,y_test.shape

fromsklearnimportmetrics

importnumpy as np

sum_mean=

foriinrange(len(y_pred)):

sum_mean+=(y_pred[i]-y_test.values[i])**2

sum_erro=np.sqrt(sum_mean/50)

# calculate RMSE by hand

print"RMSE by hand:",sum_erro

最后的结果如下:

(2)做ROC曲线

importmatplotlib.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()

显示结果如下:(红色的线是真实的值曲线,蓝色的是预测值曲线)

直到这里整个的一次多元线性回归的预测就结束了。

6、改进特征的选择

在之前展示的数据中,我们看到Newspaper和销量之间的线性关系竟是负关系(不用惊讶,这是随机特征抽样的结果。换一批抽样的数据就可能为正了),现在我们移除这个特征,看看线性回归预测的结果的RMSE如何?

依然使用我上面的代码,但只需修改下面代码中的一句即可:

#create a python list of feature names

feature_cols = ['TV','Radio','Newspaper']

# use the list to select a subset of the original DataFrame

X = data[feature_cols]

# equivalent command to do this in one line

#X = data[['TV', 'Radio', 'Newspaper']]#只需修改这里即可

X = data[['TV', 'Radio']] #去掉newspaper其他的代码不变

# print the first 5 rowsprint X.head()# check the type and shape of Xprint type(X)print X.shape

最后的到的系数与测度如下:

LinearRegression(copy_X=True, fit_intercept=True, normalize=False)

然后再次使用ROC曲线来观测曲线的整体情况。我们在将Newspaper这个特征移除之后,得到RMSE变小了,说明Newspaper特征可能不适合作为预测销量的特征,于是,我们得到了新的模型。我们还可以通过不同的特征组合得到新的模型,看看最终的误差是如何的。

备注:

之前我提到了这种错误:

注:上面的结果是由train_test_spilit()得到的,但是我不知道为什么我的版本的sklearn包中居然报错:

ImportErrorfor testingImportError: cannot import name train_test_split

处理方法:1、我后来重新安装sklearn包。再一次调用时就没有错误了。

2、自己写函数来认为的随机构造训练集和测试集。(这个代码我会在最后附上。)

这里我给出我自己写的函数:

运算结果如下:

LinearRegression(copy_X=True, fit_intercept=True, normalize=False)3.1066750253

[ 0.04588016 0.18078772 -0.00187699]

RMSE by hand: 1.39068687332

∞∞∞∞∞

IT派 -

持续关注互联网、区块链、人工智能领域

邀你加入{ IT派AI机器学习群 }

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180604B0ADTI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券