文章数据
收藏(次)
【python数据分析】第十三章 Python建模库介绍
import numpy as np
import pandas as pd
import patsy
--------------------------------------------------------------------------------
下面的代码就是给 data变换,没有实际应用变换后的数据,不知道目的是什么
看一下怎么变换即可。
data = pd.DataFrame({
'x0':[1,2,3,4,5],
'x1':[0.01, -0.01, 0.25, -4.1, 0.0],
'y' :[-1.5, 0, 3.6, 1.3, -2]
})
--------------------------------------------------------------------------------
data.columns # 获取表头 Index(['x0', 'x1', 'y'], dtype='object')
--------------------------------------------------------------------------------
data.values # 返回数据的数组。模型就是在这个基础上建立
--------------------------------------------------------------------------------
# 使用原数据数组 + 新表头组成新的 DF 数
df2 = pd.DataFrame(data.values, columns=['c1', 'c2', 'c3'])
--------------------------------------------------------------------------------
df3 = data.copy() # copy 得到新的 DF
--------------------------------------------------------------------------------
df3['strings'] = ['a', 'b', 'c', 'd', 'e'] # 添加新的一列, 列名 'strings'
--------------------------------------------------------------------------------
df3.loc[:, 'x0':'y'] # df3 现在有一行非数值的列,也就是麻烦数据,挑出想要的数据
--------------------------------------------------------------------------------
data.loc[:, 'x0':'x1'].values # 挑出想要分析的列,变成数组方便分析
--------------------------------------------------------------------------------
data['category'] = pd.Categorical(['a', 'b', 'a', 'a', 'b'], categories=['a', 'b'])
data 输出:
x0 x1 y category
0 1 0.01 -1.5 a
1 2 -0.01 0.0 b
2 3 0.25 3.6 a
3 4 -4.10 1.3 a
4 5 0.00 -2.0 b
现在 catgory 这一列也是麻烦列,但是又不能删除,因为它代表着数据的分组类型。
这时可以提取特征向量,
dummies = pd.get_dummies(data.category)
dummies 输出:输出的内容是 特征值 a, b在 data['category'] 上的特征向量,丢弃a,b 这样的字符串,保留关系即可
a b
0 1 0
1 0 1
2 1 0
3 1 0
4 0 1
dummies = pd.get_dummies(data.category, prefix='category')
上面得到的 dummies 的列名就是 特征值的名字,可以改,比如加一个前缀
输出
category_a category_b
0 1 0
1 0 1
2 1 0
3 1 0
4 0 1
这时就能把 data 中的麻烦列 category 删除了,因为现在已经有了特征向量。把特征向量拼接上
data.drop('category', axis=1).join(dummies)
输出:
x0 x1 y category_a category_b
0 1 0.01 -1.5 1 0
1 2 -0.01 0.0 0 1
2 3 0.25 3.6 1 0
3 4 -4.10 1.3 1 0
4 5 0.00 -2.0 0 1
展示了使用 category 提取特征值的过程
================================================================================
用Patsy创建模型描述, 需要包 import patsy
--------------------------------------------------------------------------------
Patsy是Python的一个库,使用简短的字符串“公式语法”描述统计模型
Patsy的公式是一个特殊的字符串语法: y ~ x0 + x1
a+b不是将a与b相加的意思,而是为模型创建的设计矩阵
patsy.dmatrices函数接收一个公式字符串和一个数据集(可以是DataFrame或数组的字典),
为线性模型创建设计矩阵
--------------------------------------------------------------------------------
data = pd.DataFrame({
'x0':[1,2,3,4,5],
'x1':[0.01, -0.01, 0.25, -4.1, 0.0],
'y' :[-1.5, 0, 3.6, 1.3, -2]
})
data 输出:
x0 x1 y
0 1 0.01 -1.5
1 2 -0.01 0.0
2 3 0.25 3.6
3 4 -4.10 1.3
4 5 0.00 -2.0
计算 ax + by = c 方程组的拟合曲线
a 是 x0 列, b 是 x1 列, c 是 y 列 的矩阵。
现在 两个变量,有5个方程,如果5个方程组成的矩阵的秩大于2,表明无解。只能
计算拟合曲线,也就是尽可能让方程组成立的近似解。
--------------------------------------------------------------------------------
y, X = patsy.dmatrices('y ~ x0 + x1', data)
y 输出:
DesignMatrix with shape (5, 1)
y
-1.5
0.0
3.6
1.3
-2.0
Terms:
'y' (column 0)
x 输出:
DesignMatrix with shape (5, 3)
Intercept x0 x1
1 1 0.01
1 2 -0.01
1 3 0.25
1 4 -4.10
1 5 0.00
Terms:
'Intercept' (column 0)
'x0' (column 1)
'x1' (column 2)
--------------------------------------------------------------------------------
把 x y 转成数组的形式
np.asarray(y)
np.asarray(x)
x 转成数组输出:
array([[ 1. , 1. , 0.01],
[ 1. , 2. , -0.01],
[ 1. , 3. , 0.25],
[ 1. , 4. , -4.1 ],
[ 1. , 5. , 0. ]])
x 输出中有一个 Intercept, 值都是1,
你可能想Intercept是哪里来的。这是线性模型(比如普通最小二乘回归)的惯例用
法。添加 +0 到模型可以不显示intercept:
y, X = patsy.dmatrices('y ~ x0 + x1+0', data)
如果不去掉,他把 这列也当成一列进行计算
相当于计算 ax + by + cz = y 的拟合了
--------------------------------------------------------------------------------
coef, resid, _, _ = np.linalg.lstsq(X, y)
coef 输出: 去掉了 Intercept, 得到的结果
array([[ 0.00925424],
[-0.25485421]])
也就是 0.00925424 x0 + -0.25485421 x1 = y 是最合适的近似解。最小二乘法计算获取
coef = pd.Series(coef.squeeze(), index=X.design_info.column_names)
coef 输出: 美化输出
x0 0.009254
x1 -0.254854
dtype: float64
--------------------------------------------------------------------------------
用Patsy公式进行数据转换
--------------------------------------------------------------------------------
# 已经看不懂了
y, X = patsy.dmatrices('y ~ x0 + np.log(np.abs(x1) + 1)', data)
y, X = patsy.dmatrices('y ~ standardize(x0) + center(x1)', data)
y, X = patsy.dmatrices('y ~ I(x0 + x1)', data)
--------------------------------------------------------------------------------
分类数据和Patsy
================================================================================
statsmodels介绍
--------------------------------------------------------------------------------
import statsmodels.api as sm
import statsmodels.formula.api as smf
================================================================================
scikit-learn介绍:略
--------------------------------------------------------------------------------
分享
收藏
点赞人
举报
文章标签
评论列表