预测模型:
1.线性回归
回归分析是数据科学和统计学中的一个热门话题。它是对一组观测拟合一条曲线或某种函数,然后再用拟合出的曲线或函数预测未知的值。回归分析中最常见的是线性回归。
线性回归就是用一条直线去拟合一组观测。例如,我们有一组个人数据,其中有两个特征,即身高和体重。总之,线性回归就是用一条直线去拟合一组数据点。
(1)普通最小二乘法
如何进行线性回归?最常用的技术称为普通最小二乘法,简称 OLS。它的原理是使每个数据点与直线之间的误差的平方和最小。误差就是数据点和拟合出的直线之间的距离。
我们要将这些误差的平方都加起来,这看起来非常像计算方差,没错,只不过计算方差时误差是相对于均值的,而这里的误差是相对于我们拟合出的直线的。我们可以计算出数据点相对于直线的误差平方和,然后使这个平方和最小化,就可以找出最优拟合直线。
请记住用斜率和截距确定直线的公式:y = mx + b。斜率就是两个变量之间的相关系数乘以 Y的标准差再除以 X 的标准差。截距的计算方法是,用 Y 的均值减去斜率与 X 的均值的乘积。
(2)梯度下降法
它在三维数据上的效果最好,试图为你描绘出数据的轮廓。虽然这种方法的效果非常好,但是需要更多的计算成本。在处理 3D 数据时,非常适合使用梯度下降法。经常使用在高维数据中。
(3)判定系数或 r 方
a. 计算 r 方
b.解释 r 方
r 方的值在 0 和 1 之间。0 意味着拟合非常糟糕,没有捕获到数据中的任何变动。1 则意味着拟合非常完美,拟合直线可以捕获数据的所有变动,而且直线两侧的变动应该是一样的。所以 0是不好的,1 是好的,0 和 1 之间的值表示拟合效果处在好与坏之间。r 方值比较低说明拟合效果不好,r 方值较高说明拟合效果很好。
(4)使用 Python 进行线性回归并计算 r 方
import numpy as np
import matplotlib.pyplot as plt
pageSpeeds=np.random.normal(3.0,1.0,1000)
purchaseAmount=100-(pageSpeeds+np.random.normal(0,0.1,1000))*3
plt.scatter(purchaseAmount,pageSpeeds)
plt.show()
用普通最小二乘法找出最优拟合直线:
从 scipy 包中导入 stats 包,然后调用 stats.linregress()来处理。linregress()函数返回的内容非常丰富,包括斜率和截距,这是确定最优拟合直线所需的参数。它还会返回 r_value,我们可以从中得到 r 方的值,度量一下拟合的质量。还有另外两个指标,随后会介绍,眼下我们只需要斜率、截距和r_value。
# slope 表示斜率
# intercept 表示截距
# r_value 表示得到r方的值,度量一下拟合的质量
slope, intercept, r_value, p_value, std_err=stats.linregress(pageSpeeds,purchaseAmount)
print(r_value**2) #r方的值 0.9901814910672613
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# from pylab import *
pageSpeeds=np.random.normal(3.0,1.0,1000)
purchaseAmount=100-(pageSpeeds+np.random.normal(0,0.1,1000))*3
# slope 表示斜率
# intercept 表示截距
# r_value 表示得到r方的值,度量一下拟合的质量
slope, intercept, r_value, p_value, std_err=stats.linregress(pageSpeeds,purchaseAmount)
def predict(x):
return slope*x+intercept
fitLine=predict(pageSpeeds)
plt.scatter(pageSpeeds,purchaseAmount)
plt.plot(pageSpeeds,fitLine,'r')
plt.show()
2.多项式回归
不是所有的关系都是线性的,线性回归只是各种回归中的一种。线性回归直线的形式是y = mx + b,其中的 m 和 b 是通过普通最小二乘法或其他方法得到的。这只是一阶多项式。阶就是 x 的次数,所以 y = mx + b 是一阶多项式。如果需要,可以使用二阶多项式,它的形式是 y = ax2 + bx + c。如果使用二阶多项式进行回归,就应该找出 a、b 和 c 的值。还可以使用三阶多项式,它的形式为 y = ax3 + bx2 + cx + d。阶数越高,表示的曲线越复杂。所以,随着 x 次数的升高,你可以得到形状更复杂的曲线,表示出更复杂的关系。但是,并不是次数越高越好。通常,数据中的本质关系并不是那么复杂,如果你使用特别高的次数去拟合数据,就会导致过拟合!
一定要当心过拟合!
1)如果不必要,就不要使用更高的次数。
2)先进行数据可视化,看看需要使用多复杂的曲线。
3)对拟合结果进行可视化,检查一下你的曲线是否因为离群点而改变了形状。
4)高 r 方值只能说明曲线对训练数据拟合得很好,但不一定有好的预测效果。
稍后,我们会介绍一种预防过拟合的方法,称为训练/测试。
(1)使用 NumPy 实现多项式回归
np.random.seed 这行代码作用就是创建一个随机数种子,这意味着后面的随机操作都是确定的。这样可以确保每次运行这段代码时都能得到同样的结果。
从图中可以看出,数据中没有线性关系。可以试着拟合一条直线,这条直线对于大多数数据点还可以,它比较接近于图形右侧的数据点,但对于左侧的数据点,就差得比较远了。我们应该使用一条指数曲线。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2)
pageSpeeds=np.random.normal(3.0,1.0,1000)
purchaseAmount=np.random.normal(50.0,10.0,1000)/pageSpeeds
plt.scatter(pageSpeeds,purchaseAmount)
plt.show()
NumPy 中有个 ployfit 函数,可以非常容易地实现多项式回归,允许用任意阶数的多项式去拟合数据。例如,可以将
页面载入速度(pageSpeeds)数组作为 x 轴,将购物金额(purchaseAmount)数组作为 y 轴,然后调用 np.polyfit(x, y, 4),使用四阶多项式来拟合数据。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2)
pageSpeeds=np.random.normal(3.0,1.0,1000)
purchaseAmount=np.random.normal(50.0,10.0,1000)/pageSpeeds
x=np.array(pageSpeeds)
y=np.array(purchaseAmount)
p4=np.poly1d(np.polyfit(x,y,4)) #使用四阶多项式来拟合数据
#np.linspace主要用来创建等差数列
xp=np.linspace(0,7,100)
plt.scatter(x,y)
plt.plot(xp,p4(xp),'r')
plt.show()
(2)计算 r 方误差
我们可以计算 r 方误差。在 sklearn.metrics 包中,有个 r2_score()函数,使用 y 和 p4(x)作为参数,就可以计算出 r 方误差。
0 最差,1 最好,0.82 相当接近于 1,显然不是很完美,但已经可以了。可以看出,曲线在数据的中段表现相当好,在数据的最左侧和最右侧则不那么好。所以,0.82应该是个正确的值。
import numpy as np
from sklearn.metrics import r2_score
np.random.seed(2)
pageSpeeds=np.random.normal(3.0,1.0,1000)
purchaseAmount=np.random.normal(50.0,10.0,1000)/pageSpeeds
x=np.array(pageSpeeds)
y=np.array(purchaseAmount)
p4=np.poly1d(np.polyfit(x,y,4)) #使用四阶多项式来拟合数据
r2=r2_score(y,p4(x))
print(r2) #0.8293766396303073
(3)多项式回归练习
import numpy as np
from sklearn.metrics import r2_score
import matplotlib.pyplot as plt
p8=np.poly1d(np.polyfit(x,y,8)) #使用八阶多项式来拟合数据
xp=np.linspace(0,7,100)
plt.scatter(x,y)
plt.plot(xp,p8(xp),'r')
plt.show()
r2=r2_score(y,p8(x))
print(r2) #0.8814395663681522
3.多元回归和汽车价格预测
我们想知道这些不同因素组合在一起是如何影响预测值的,这时就需要使用多元回归。
假设我们想预测一下汽车的价格,这个价格可能由汽车的多个特征决定,比如车身风格、品牌、里程数,甚至是轮胎的质量,等等。在预测汽车价格时,有些特征比其他特征更为重要,但你必须同时考虑所有特征。
这里进行多元回归的方法仍然是使用最小二乘法对观测集合拟合一个模型,与前面的区别在于,我们要得到多个系数,每个特征都要有一个系数。
所以,举例来说,最后的价格模型应该是个线性组合,它是由一个类似于截距的常数项 α,加上里程数及其系数,加上车龄及其系数,再加上车门数及其系数组成的。
(1) 使用 Python 进行多元回归
这里引入了一个新的包,名为 pandas,它可以让我们非常容易地处理表格数据。它可以读入表格数据,并对其进行各种形式的重新排列、修改、切片和切丁。后面我们会经常用到这个包。
将 pandas 导入为 pd,pd 中有个 read_Excel()函数,可以从 HTTP 网页中读取 Microsoft Excel 电子表格。所以,pandas 的功能是非常强大的。
将这个 Excel 电子表格文件读取到本地,如果运行上面的代码,它会将数据加载到一个DataFrame 对象,我们将这个对象命名为 df。然后对这个数据框调用 head()函数,看看它的前几行数据:
import pandas as pd
df=pd.read_excel('http://cdn.sundog-soft.com/Udemy/DataScience/cars.xls')
print(df.head())
现在要使用 pandas 将我们关心的特征分离出来。我们将基于里程数、型号和车门数来构造模型去预测汽车价格,其他特征都不用了。
在代码中,我们使用 pandas 中的Categorical()函数将数据框中的型号数据转换成了一组数值,也就是一组编码。模型在 x 轴上的输入是里程数(Mileage)、转换为定序数据的型号(Model_ord)和车门数(Doors)。在y 轴上要预测的值是价格(Price)。接下来的两行代码使用普通最小二乘法(OLS)创建了一个模型 est,并使用 Mileage、Model_ord 和 Doors 进行拟合。然后调用 summary 方法打印出模型。
import pandas as pd
from pylab import *
import statsmodels.api as sm
df=pd.read_excel('http://cdn.sundog-soft.com/Udemy/DataScience/cars.xls')
print(df.head())
df['Model_ord'] = pd.Categorical(df.Model).codes
X = df[['Mileage', 'Model_ord', 'Doors']]
y = df[['Price']]
X1 = sm.add_constant(X)
est = sm.OLS(y, X1).fit()
E=est.summary()
print(E)
import pandas as pd
from pylab import *
import statsmodels.api as sm
df=pd.read_excel('http://cdn.sundog-soft.com/Udemy/DataScience/cars.xls')
df['Model_ord'] = pd.Categorical(df.Model).codes
X = df[['Mileage', 'Model_ord', 'Doors']]
y = df[['Price']]
e=y.groupby(df.Doors).mean()
print(e)
'''
Price
Doors
2 23807.135520
4 20580.670749
'''