开发者学堂课程【人工智能必备基础:概率论与数理统计:高阶与分类变量实例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/545/detail/7437
高阶与分类变量实例
内容介绍
一、 高阶回归
二、 分类变量
一、高阶回归:
代码讲解:现要构造 Y=5+2·X+3·X^2,首先把当前式子构造出来,样本个数值是 50,x 指定成 np. linspace,从 0 到 10 间选 50 个数,因多了 x 方项,就将 x 方项添加进入,原始的数据还是 x,再加 e。所以这里第一列是 e,第二例是 x,第三列是 x 方。构造完数据后,先去构造 β,在讲高阶时,用 x 代表 x 方来求解。代码如下:
In [31]: #Y=5+2·X+3·X^2
nsample = 50
x = np. linspace(0, 10,nsample )
X = np. column_ stack((x, x**2))
X = sm.add_ constant (X)
代码讲解:指定β是真实值,是 5、2、3。加上np. random. normal (size=nsample)
,再加上 np.dot(X, beta) + e
(误差项),y = np.dot(X, beta) + e
的 y 是真实值,model 做最小二乘法,然后 .fit,得出最终结果。再算 params(表示最终的系数值)。就可分别得出 β0=5、β1=2、β2=2.97,与实际的结果值没差太大。代码如下:
In [32]: beta = np. array([5, 2, 3])
e = np. random. normal (size=nsample)
y = np.dot(X, beta) + e
model = sm. OLS(y, X)
results = model. fit()
results. Params
0ut[32]: array([ 4. 93210623, 2. 16604081, 2. 97682135])
In [33]: results. summary()
代码讲解:当前R方值是非常精确的,R-squared: 1000,对于当前式子来说。都将系数值展示出来,检验的结果都进行详细地展示。代码如下:
Covariance Type: nonrobust
coef std err
t P>|t| [0.025 0.975]
const 4.9321 0.330 14.935 0.000 4.268 5.596
x1
2.1660 0.153 14.182 0.000 1.859 2.473
x2
2.9768 0.015 201.548 0.000 2.947 3.007
Omnibus:
3.204 Durbin-Watson:
1.838
Prob(Omnibus): 0.202 Jarque-Bera(JB):1.916
Skew: -0.232
Prob(JB):0.384
Kurtosis: 2.161
Cond.No. 142
下面就是结果,R 方值非常接近于 1,是因为这个东西的拟合效果好。你的数据越多,指定的误差浮动范围越小,结果越好。
做高阶时需指定好当前的方程,难点在于需要怎样的方程进行表达。
二、分类变量
假设分类变量有 3 个取值 (a,b,c) ,比如考试成绩有 3 个等级,分别是优,良,中,或者是优,中,差。跟之前数据不一样,之前数据可能是年龄,可能是收入,都是连续值。但对于现在的指标值是个分类变量,所以先将数据转换成哑变量。现有 3 个等级,可认为 A 档是 1,B 档是 2,C 档是 3。先将数据格式进行转换,转成哑变量。哑变量中,有几种取值,长度就等于几。在哪个位置取值哪个位置就是1,其他位置就是 0。a 是第一个值,现有 a,b,c,3 个选项。所以构造的长度必然是等于 3。a 就是 (1,0.0) ,因为构造当前位置是 a。当前的位置是 b,b 的位置为 0,b (0,1,0),当前的位置是 c,c 的位置为 0,c(0,0,1), 这个时候就需要 3 个系数 β0, β1, β2,分别表示 3 种可能的取值。也就是 β0x0+β1x1+β2x2。
代码讲解:首先 nsample = 50,先去构造全是 0 的,因为需要将当前数据构造出来,指定成一个 int。如果将 int 去掉,就是 0.0,表示已指定完成。代码如下:In [38]: nsample = 50
groups = np. zeros (nsample, int)
groups
out[38]: array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0.0,0,0,0]
代码讲解:前 20 个等于 0,中间 20 个等于 1,后面 20 个等于 2。现有 3 中不同取值。在 statsmodel 当中,有 categorical 模块,需将构造好的数据传入就会转换成 categorical 类型。代码如下:In [39]: groups[20:40] = 1
groups[40:] = 2
dumay= s= categorical(groups, drop= True)
dummy
Out[391: array([[ 1., 0., 0.],
[1., 0., 0.],
(省略同上内容)
[0., 1., 0.],
[0., 1., 0.],
(省略同上内容)
[0., 0., 1.],
[0., 0., 1.],
(省略同上内容)
代码讲解:现 Y=5+2X+3Z1+6.Z2+9.Z3.(z1,z2,z3 分别表示 a,b,c),首先将 x 拿出,因刚才做了以上形式,所以要将上面的和 x 连接到一起,再加上常数项,都是一列 1。指定好实际的 β,5,2,3,6,9,然后加上一个 e,y 等于当前的实际值。代码如下:
In [43): #Y=5+2X+3Z1+6:22+9.Z3.
x = np.linspace(0, 20, nsample)
X = np. column _stack((x, dummy))
X =sm.add_ constant (X)
beta =[5, 2, 3, 6, 9]
y= np. random. normal (size=nsample)
Y=np. dot(X, beta) + e
result = sm. 0LS(y,X). fit()
result. summary ()
得到最终结果,得到一个 R 方值,和纠正过的 R 方值。纠正过的 R 方值普遍小于R 方,因为不想随着增加的变量去增大 α,得出的数据基本符合。
代码讲解:得到最终结果,现在虽然有个分类变量,但已将当前的指标值将它画出。
身高与体重
代码讲解:想构造个回归方程,将身高体重做一个回归方程。首先将身高和体重导入,这次用 Python 里另外的一个工具包,这个工具包包含了 plotly. graph_ objs as go 的东西。意思就是说,可以在界面做交互。接着过滤,因为认为身高小于 120 厘米的是离心点,接着画个散点图,用圆圈表示。代码如下:
In [4]:
import pandas as pd
import statsmodels. api as sm
from plotly. offline import init_ notebook _mode, iplot
import plotly. graph_ objs as go
(可在界面中做些交互)init_notebook_ mode(connected=True)
代码讲解:首先将身高的体重的数据读入,读完后做过滤,因为有些数据身高值是小于 120cm 的,就认为是离心点,所以进行了筛选。就是表示将身高大于 120cm拿出。代码如下:Read CSV data
In [8]:data = pd. read_ csv(‘ weight. Csv’ )
data = data[data. height > 120]
代码讲解:画散点图,将x和y传进去,用一个圆圈进行表示。代码和散点图如下:Generate scatterplot to determine fitness of linear regression
In [9]: trace = go. Scatter (x=data. height, y=data. weight, mode=’markers’ )
layout = go. Layout (
width=900,
height=500,
xaxis=dict(title=’Height’ , titlefont=dict (family=’ Consolas, monospace’, size=15)),
yaxis-dict(title=’Weight’, titlefont=dict (family=’ Consolas, monospace’ , size=15))
)
data2 = [trace]
fig = go. Figure (data=data2, layout=layout)
iplot(fig)
这个工具包,鼠标移动到哪,它就会将实际点拿出。现在看出身高的点的大致分布,可看出回归方程的样子。
直接根据之前讲的内容,直接用最小二乘法做。就得出结果值,发现都没有问题,可能 R 方值偏小,是正常现象,因为对于这个问题本身来说,有些值偏离程度大,所以 R 方值会偏小,为 0.59。
对结果进行画图,之后就是最终结果。红色的线就是回归方程,蓝色的点表示十几分数据。这样就将身高的体重的数据连在一起。
所以用 Python 里的工具包,只需要知道函数里面每个参数值是什么,这样就可以将当前任务解决。任何一个工具包都会有一个 API 文档,里面都会告诉有许多 API文档可以用,会告诉每个参数可以用,会告诉具有哪些属性和返回值。