graph LR
A[数据挖掘] --> C(共同点) # 数据挖掘指向共同点
B[机器学习] --> C(共同点) # 机器学习指向共同点
D[统计学习] --> C(共同点) # 统计学习指向共同点
C --> E[洞察与预测] # 共同点指向洞察与预测
Python 建模库入门
让我们定义一些重要的术语:
数据挖掘、机器学习和统计学习是相关的:
graph LR
A[数据挖掘] --> C(共同点) # 数据挖掘指向共同点
B[机器学习] --> C(共同点) # 机器学习指向共同点
D[统计学习] --> C(共同点) # 统计学习指向共同点
C --> E[洞察与预测] # 共同点指向洞察与预测
它们都旨在提取洞察并进行预测。机器学习和统计学习提供了在更广泛的数据挖掘环境中使用的工具。
Python 在数据分析中占据主导地位,原因如下:
典型的模型开发工作流程:
graph LR
A[数据加载 (pandas)] --> B[数据清洗 (pandas)] # 数据加载指向数据清洗
B --> C[特征工程 (pandas, 其他工具)] # 数据清洗指向特征工程
C --> D[模型构建 (statsmodels, scikit-learn)] # 特征工程指向模型构建
D --> E[模型评估 (statsmodels, scikit-learn)] # 模型构建指向模型评估
E --> F[预测/推理] # 模型评估指向预测/推理
主要的接口通常是 NumPy 数组。pandas DataFrame 构建在 NumPy 之上,因此转换很容易。
使用 .to_numpy()
将 DataFrame 转换为 NumPy 数组:
重要提示: .to_numpy()
优于 .values
。
从 NumPy 数组创建 DataFrame:
我们在创建 DataFrame 时提供了列名。
dtype=object
数组(对于数值计算效率较低)。示例:
对于建模,在转换之前使用 .loc
选择列:
分类变量(例如,“male”、“female”)需要数值表示。使用虚拟变量(或独热编码)。
get_dummies()
🐼pd.get_dummies()
简化了此操作:
prefix
添加一个前缀(例如,category_a
)。
Patsy 使用公式语法(类似于 R)来指定模型,尤其是线性模型。
它随 statsmodels 一起安装: conda install statsmodels
示例公式:
# y ~ x0 + x1
y
:因变量(响应变量)。x0
, x1
:自变量(预测变量)。~
:分隔左侧(响应变量)和右侧(预测变量)。+
:包含项(不是数学加法!)。patsy.dmatrices()
🧮dmatrices()
接受一个公式和数据,返回设计矩阵:
Patsy 默认包含一个截距(一列 1)——当预测变量为零时的基线响应。
使用 + 0
删除截距:
Patsy 中的设计矩阵可与 NumPy(例如 np.linalg.lstsq
)或 statsmodels 一起使用:
在公式中包含 Python 代码以进行转换:
Patsy 在作用域中查找 np.log
等函数。
standardize
、center
🛠️Patsy 具有内置函数:
standardize(x)
:标准化 x
(均值为 0,标准差为 1)。center(x)
:减去均值。build_design_matrices
💾当应用像center
和standardize
这样的转换时,在转换新数据时使用原始数据集的统计数据。 patsy.build_design_matrices
可以提供帮助:
要添加列,请将它们包装在 I()
中:
Patsy 自动处理分类变量:
Patsy 省略了一个级别以避免共线性(与截距)。
没有截距时,将包含所有类别列:
使用 C()
将数字视为分类变量:
交互项对组合效应进行建模。使用 :
:
statsmodels
用于统计建模、假设检验和数据探索。它侧重于统计推断,与 scikit-learn 互补。
statsmodels
包括:
使用数组和公式 API 拟合线性模型。
创建示例数据:
import statsmodels.api as sm # 导入 statsmodels.api 模块
import statsmodels.formula.api as smf # 导入 statsmodels.formula.api 模块
# 可重现的示例
rng = np.random.default_rng(seed=12345) # 设置随机数种子以实现可重复性
# 定义一个生成正态分布随机数的函数
def dnorm(mean, variance, size=1):
if isinstance(size, int): # 如果 size 是整数
size = size, # 将其转换为元组
return mean + np.sqrt(variance) * rng.standard_normal(*size) # 生成正态分布随机数
N = 100 # 样本数量
# 生成自变量 X
X = np.c_[dnorm(0, 0.4, size=N),
dnorm(0, 0.6, size=N),
dnorm(0, 0.2, size=N)]
eps = dnorm(0, 0.1, size=N) # 生成随机误差项
beta = [0.1, 0.3, 0.5] # 系数
y = np.dot(X, beta) + eps # 生成因变量 y
sm.add_constant(X)
添加一列 1 以表示截距。
公式 API 处理截距并与 DataFrame 一起使用。
statsmodels
具有时间序列工具。示例:自回归 (AR) 模型:
from statsmodels.tsa.ar_model import AutoReg # 导入 AutoReg 类
init_x = 4 # 初始值
values = [init_x, init_x] # 初始值列表
N = 1000 # 时间序列长度
b0 = 0.8 # AR(1) 系数
b1 = -0.4 # AR(2) 系数
noise = dnorm(0, 0.1, N) # 生成噪声
# 生成 AR(2) 时间序列
for i in range(N):
new_x = values[-1] * b0 + values[-2] * b1 + noise[i]
values.append(new_x)
MAXLAGS = 5 # 最大滞后阶数
model = AutoReg(values, MAXLAGS) # 创建 AutoReg 模型
results = model.fit() # 拟合模型
print(results.params) # 打印模型参数
scikit-learn
是一个强大、广泛使用的机器学习库。它具有用于分类、回归、聚类等的算法。
使用泰坦尼克号数据集展示 scikit-learn
工作流程。
impute_value = train['Age'].median() # 计算 'Age' 列的中位数
train['Age'] = train['Age'].fillna(impute_value) # 使用中位数填充 'Age' 列中的缺失值
test['Age'] = test['Age'].fillna(impute_value) # 使用中位数填充 'Age' 列中的缺失值
# 创建一个新特征 'IsFemale'
train['IsFemale'] = (train['Sex'] == 'female').astype(int)
test['IsFemale'] = (test['Sex'] == 'female').astype(int)
# 定义预测变量
predictors = ['Pclass', 'IsFemale', 'Age']
X_train = train[predictors].to_numpy() # 获取训练集的特征
X_test = test[predictors].to_numpy() # 获取测试集的特征
y_train = train['Survived'].to_numpy() # 获取训练集的标签
print(X_train[:5]) # 打印前 5 个训练样本的特征
print(y_train[:5]) # 打印前 5 个训练样本的标签
from sklearn.linear_model import LogisticRegressionCV # 导入 LogisticRegressionCV 类
from sklearn.model_selection import cross_val_score # 导入 cross_val_score 函数
# 使用交叉验证创建 LogisticRegression 模型
model_cv = LogisticRegressionCV(Cs=10)
model_cv.fit(X_train, y_train) # 使用训练数据训练模型
# 使用交叉验证评估模型
model = LogisticRegression(C=10)
scores = cross_val_score(model, X_train, y_train, cv=4) # 进行 4 折交叉验证
print(scores) # 打印交叉验证分数
交叉验证有助于避免过拟合,并提供更稳健的模型。
statsmodels
和 scikit-learn
将 pandas 数据整理和模型构建联系起来。.to_numpy()
将 DataFrame 转换为 NumPy 数组。statsmodels
擅长统计推断。scikit-learn
对于许多机器学习任务具有通用性。statsmodels
和 scikit-learn
之间进行选择?考虑推断与预测。邱飞 💌 [email protected]