机器学习(二):线性回归(simple and multiple)

写以前先声明一下,https://steveli90.github.io 是个人我的github page,因此一样的文章我会在这上边先发。
原本我想机器学习系列用四到五篇文章结束,可是这一篇介绍回归的文章写了刚写了简单线性回归和多元线性回归就已经很长了为了读者阅读方便,我会分几篇文章来介绍。
关于数据集(data set)我不会在这里放出来,由于这个系列是介绍性质,主要是但愿你们可以从总体理解什么是机器学习以及机器学习的目的。之后我想建立一个实践系列,放出一些好的例子来供你们练习。
大概还有两周时间会结束这个系列,同时在其中我也会穿插偏向人工智能的深度学习(Deep Learning)中的回归与分类的内容,做为深度学习系列的预先学习。node

好啦,言归正传,开始主要的内容。python

回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术一般用于预测分析,时间序列模型以及发现变量之间的因果关系。例如,司机的鲁莽驾驶与道路交通事故数量之间的关系,最好的研究方法就是回归。
回归分析是建模和分析数据的重要工具。在这里,咱们使用曲线/线来拟合这些数据点,在这种方式下,从曲线或线到数据点的距离差别最小。ios

有关线性回归的研究及代码实现请参考个人另外一篇文章。git

线性回归是最贴近生活的数据模型之一。github

简单的线性回归

简单的线性回归公式以下:web

figure 2.1

从公式中咱们能够看出,简单线性回归只有一个自变量x1,b1是自变量的系数,y是因变量。x1多是连续型或者离散型的数据,因此咱们须要经过x1找出最合适的系数b1从而获得关于因变量y的曲线。dom

咱们下面用一个例子来讲明,这是一个关于工做经验与薪水之间关系的表格。分布以下图所示机器学习

figure 2.2

从charter上咱们很容易看出这是符合一个线性回归的模型,下面咱们就要作出回归的函数而且对将来数据进行预测。函数

咱们用上一节写过的模板来处理数据:工具

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Salary_Data.csv')
X = dataset.iloc[:, :-1].values#除了最后一列的其余列
y = dataset.iloc[:, 1].values #第二列

# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

通常Python的library会自动进行feature scaling,因此咱们不须要本身动手。

咱们将数据按照4:1分为训练组和测试组两部分。每一组分别包含自变量和因变量

figure 2.3

下面咱们须要作的是经过训练集的X_train与y_train 计算出符合训练集的曲线,而后将测试集的X_test 带入获得的曲线中,获得预测的结果y_pred,最后将预测结果y_pred与测试集中的y_test进行比较,看看是否符合分布,从而肯定预测是否准确。

# Fitting Simple LinearRegression to the training set
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train,y_train) # 经过train集找到曲线

y_pred = regressor.predict(X_test)

# visualising the Traning set results
plt.scatter(X_train, y_train, color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('Salary vs Experience(Traning set)')
plt.xlabel('Year of Experience')
plt.ylabel('Salary')
plt.show()

经过学习咱们能够获得训练曲线

figure 2.4

下面咱们导入测试数据

plt.scatter(X_test, y_test, color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('Salary vs Experience(Traning set)')
plt.xlabel('Year of Experience')
plt.ylabel('Salary')
plt.show()

figure 2.5

这里须要注意两点,第一,在导入测试集时咱们依然使用训练集获得的曲线,因此咱们的plot函数中参数不便,固然若是你用测试集的数据应该也会获得相同的曲线。
第二有的人以为既然须要预测数据应该将y_test 替换成 y_pred。 其实不须要这样的。由于咱们y_pred 上的点应该都是和曲线高度重合的,如图:

figure 2.6

这样一个简单线性回归的机器学习功能就完成啦~~最后我贴出R语言实现的步骤。

# Simple Linear Regression

# Importing the dataset
dataset = read.csv('Salary_Data.csv')

# Splitting the dataset into the Training set and Test set
# install.packages('caTools')
library(caTools)
set.seed(123)
split = sample.split(dataset$Salary, SplitRatio = 2/3)
training_set = subset(dataset, split == TRUE)
test_set = subset(dataset, split == FALSE)

# Feature Scaling
# training_set = scale(training_set)
# test_set = scale(test_set)

# Fitting Simple Linear Regression to the Training set
regressor = lm(formula = Salary ~ YearsExperience,
               data = training_set)

# Predicting the Test set results
y_pred = predict(regressor, newdata = test_set)

# Visualising the Training set results
library(ggplot2)
ggplot() +
  geom_point(aes(x = training_set$YearsExperience, y = training_set$Salary),
             colour = 'red') +
  geom_line(aes(x = training_set$YearsExperience, y = predict(regressor, newdata = training_set)),
            colour = 'blue') +
  ggtitle('Salary vs Experience (Training set)') +
  xlab('Years of experience') +
  ylab('Salary')

# Visualising the Test set results
library(ggplot2)
ggplot() +
  geom_point(aes(x = test_set$YearsExperience, y = test_set$Salary),
             colour = 'red') +
  geom_line(aes(x = training_set$YearsExperience, y = predict(regressor, newdata = training_set)),
            colour = 'blue') +
  ggtitle('Salary vs Experience (Test set)') +
  xlab('Years of experience') +
  ylab('Salary')

多重线性回归(Multiple Linear Regression)

多重线性回归将会不仅有一个自变量,而且每一个自变量拥有本身的系数且符合线性回归。

figure 2.7

在创建多重线性回归以前,有这么几个前提必需要注意一下,这些有助于你判断数据是否适合使用多重线性回归:
1, 线性(linearity)
2, 同方差(Homoscedasticity)
3, 多元正态性(Multivariate normality)

多因素共同影响分布结果

4, 错误的独立性(independence of errors)

每个变量产生的错误将会独立的影响预测结果,不会对其余变量产生影响

5, 多重共线性的缺少(lack of multicollinearity)

变量之间存在高度相关关系而使得回归估算不许确,如接下来要提到的虚拟变量陷阱(dummy variable trap)有可能触发多重共线性的问题

虚拟变量陷阱(Dummy variable trap)

在前一章中已经提到过,在回归预测中咱们须要全部的数据都是numeric的,可是会有一些非numeric的数据,好比国家,省,部门,性别。这时候咱们须要设置虚拟变量(Dummy variable)。作法是将此变量中的每个值,衍生成为新的变量,是设为1,否设为0.举个例子,“性别"这个变量,咱们能够虚拟出“男”和"女"两虚拟变量,男性的话“男”值为1,"女"值为,;女性的话“男”值为0,"女"值为1。

可是要注意,这时候虚拟变量陷阱就出现了。就拿性别来讲,其实一个虚拟变量就够了,好比 1 的时候是“男”, 0 的时候是"非男",即为女。若是设置两个虚拟变量“男”和“女”,语义上来讲没有问题,能够理解,可是在回归预测中会多出一个变量,多出的这个变量将会对回归预测结果产生影响。通常来讲,若是虚拟变量要比实际变量的种类少一个。

因此在多重线性回归中,变量不是越多越好,而是选择适合的变量。这样才会对结果准确预测。

创建模型

咱们能够经过如下五个步骤创建回归模型:(stepwise Regression)

1, 确立全部的可能(变量all in)
创建全部的个模型包含全部可能的变量

2, 逆向消除(backward elimination)
(1)选择一个差别等级(significance level)好比SL=0.05, 0.05 意味着此变量对结果有95%的贡献。 P(A|B) = 0.05
(2)将全部的变量放进你的模型中。
(3)选择P值最高的变量,若是P>SL。到第四步,不然结束,完成建模。关于变量的P值,统计软件能够计算出并选择最高P值的变量
(4)移除此变量,并从新进行第三步。
有关逆向消除和逐步回归的方法,能够参考一下两个连接:
Backward elimination and stepwise regression
Variable Selection

3, 正向选择(forward selection)
(1)选择一个差别等级(significance level)好比SL=0.05
(2)创建全部的简单回归的模型,并找到最小的P值
(3)确立一个简单模型,并将拥有最小P值的变量加入此模型
(4)若是P>SL,模型创建成功,不然在进行第三步

4,双向消除(bidirectionnal elimination)
同时进行逆向消除和正向选择。

*全部可能的模型:意思是全部变量排列组合成的模型,若是有N个变量,那么一共会有2的N次方个模型(2^N-1)
在R语言中,每个变量后面会用星号表示此变量对回归模型的影响,星号越多越重要。

Stepwise Regression 这是宾夕法尼亚州立大学的讲解。我以为挺不错的
另外,其实这几步不是很难,关键的一点是SL值的肯定。还有就是P值的生成。

如何计算P值(p-value)

figure 2.8

假定有两组人群,一组x=0,另外一组x=1。从两组中各随机抽取2个个体,测量Y
的值,如图所示,看看这两组的Y是否相同?
如今各组再多抽取若干个体,数据如图所示,能够计算各组的均数,这两个均
数不在同一条线上,这是从所抽取的样本中估计出来的。从样本中获得的两个
均数不等于两组整体的均数,从样本中获得的两均数距离不等于两个整体均数
的差,t 检验是根据两样本均数及两样本的标准差,计算若是两整体均数相同的
话,抽样获得两样本均数差达如此之大或更大的可能性多大,就是p 值,p值
<0.05,表示二者之间的距离显著。
如今看回归分析,创建回归方程如上所示。从方程中看,当x=0时,Y=β0;当x=1
时,Y=β0 + β1。所以,β0表示X=0组Y的均数,β1表示X=1组Y的均数与X=0组Y的均
数的差,ei是每一个个体与其所在组均数的差。所以回归方程对β1= 0 的检验等同
于t检验两组均数的比较。

用Python和R进行操做

咱们可使用以前创建的模板,将数据导入。

今天咱们使用一个多变量对商业profit影响的数据集。

figure 2.9

在此数据集中,咱们肯定前四个变量(R&D Speed, Administration, Marketing Speed, State)为自变量。最后一个profit为因变量。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('50_Startups.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values

因为数据中包含state变量,咱们用虚拟变量代替

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder = LabelEncoder()
X[:, 3] = labelencoder.fit_transform(X[:, 3])
onehotencoder = OneHotEncoder(categorical_features = [3])
X = onehotencoder.fit_transform(X).toarray()
#为了不虚拟变量陷阱
X = X[:, 1:] #从1 开始,并不是0

figure 2.10

将数据集分为训练集和测试集,咱们选择test size为0.2(4:1)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

执行多重线性回归:

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

获得预测结果:

y_pred = regressor.predict(X_test)

咱们比较一下预测结果(y_pred)和实际结果(y_test)中的差别

figure 2.11

plt.scatter(np.arange(10),y_test, color = 'red',label='y_test')
plt.scatter(np.arange(10),y_pred, color = 'blue',label='y_pred')
plt.legend(loc=2);
plt.show()

figure 2.12

其实不少结果仍是很接近的。

这样咱们就完成了多元线性回归的建模过程。其实咱们与简单线性回归比较一下,代码彻底相同,因此在sklearn的线性回归库中没有简单或者多元的区分。可是多元线性回归很难用图像表示,由于包含多个自变量。

下面是R的代码,方法是同样的,可是有些地方须要说明一下的:
首先建模代码不难我就很少解释了,其中咱们须要用到 caTools的库,须要提早导入一下,

# 导入数据
dataset = read.csv('50_Startups.csv')

# 虚拟变量
dataset$State = factor(dataset$State,
                       levels = c('New York', 'California', 'Florida'),
                       labels = c(1, 2, 3))

# install.packages('caTools')
library(caTools)
set.seed(123)
split = sample.split(dataset$Profit, SplitRatio = 0.8)
training_set = subset(dataset, split == TRUE) # 多自变量
test_set = subset(dataset, split == FALSE) # 单因变量

# 多重线性回归
regressor = lm(formula = Profit ~ .,
               data = training_set)

# 预测结果
y_pred = predict(regressor, newdata = test_set)

咱们执行一下summary(regressor) 来看看这个factor的结构:

figure 2.13

首先,R语言自动对虚拟变量进行了优化,因此咱们不须要担忧虚拟变量陷阱的问题。

从图中咱们能够看出,RD Speed对结果影响很大,注意P值,只有RD Speed 是小于0.05的,其余的都挺大的。因此RD Speed对结果贡献很大。以后咱们就能够移除其余的保留这个。

Signif. codes 表示此变量对结果的significance level,也就是重要性有多大。

至此多元线性回归就结束了。

cite works:

陈常中:线性回归分析(http://www.empowerstats.com/m...

相关文章
相关标签/搜索