12.《Python数据分析》建模相关Python库介绍

本章主要简单介绍了statsmodels 和 scikit-learn这两个Python建模的常用模块

1 衔接pandas与建模代码

先使用pandas进行数据加载和清理后,再进行建模是模型开发的一个常见工作流

一般建模工具都支持数组结构,所以经常用to_numpy方法将DataFrame转换为NumPy数组

代码示例:

data = pd.DataFrame({
     'x0': [1, 2, 3, 4, 5],
     'x1': [0.01, -0.01, 0.25, -4.1, 0.],
     'y': [-1.5, 0., 3.6, 1.3, -2.]})
data.to_numpy()
data.loc[:, ['x0', 'x1']].to_numpy() # 子集转数组
data['category'] = pd.Categorical(['a', 'b', 'a', 'a', 'b'],
                                   categories=['a', 'b'])
dummies = pd.get_dummies(data.category, prefix='category') # 哑变量处理
data_with_dummies = data.drop('category', axis=1).join(dummies)

2 使用Patsy创建模型描述

对于统计模型,常使用Patsy模块进行公式化描述(灵感来自R语言): $$y \sim x0 + x1$$ Pasty在安装statsmodels时会自动安装:conda install statsmodels

代码示例:

import patsy
y, X = patsy.dmatrices('y ~ x0 + x1', data) # 构建模型
# Patsy对象可以直接传递到numpy.linalg这样的算法中
coef, resid, _, _ = np.linalg.lstsq(X, y) # 回归系数,残差
# 可以将Python代码混合到Patsy公式中
y, X = patsy.dmatrices('y ~ x0 + np.log(np.abs(x1) + 1)', data)
# Patsy公式也内置了一些常用的函数:比如标准化或中心化
y, X = patsy.dmatrices('y ~ standardize(x0) + center(x1)', data)
# 直接将处理后的X输出
new_X = patsy.build_design_matrices([X.design_info], data)
# 因为加号有特殊函数,所以加法的写法比较特殊
y, X = patsy.dmatrices('y ~ I(x0 + x1)', data)
# 显式声明某一特征为非数值型特征
y, X = patsy.dmatrices('y ~ C(x0)', data)
# 构造特征交互性,增强模型的非线性拟合能力
y, X = patsy.dmatrices('y ~ x0 + x1 + x0:x1', data)

对于非数值型特征,Patsy默认会转换为虚拟变量(0-1变量)

3 statsmodels介绍

statsmodels常用于经典的统计建模、假设检验以及数据探索和可视化

代码示例:

import statsmodels.api as sm
import statsmodels.formula.api as smf
# 随机生成测试数据
rng = np.random.default_rng(seed=12345)

def dnorm(mean, variance, size=1):
    if isinstance(size, int):
        size = size,
    return mean + np.sqrt(variance) * rng.standard_normal(*size)

N = 100
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
# 拟合普通线性回归 - 最小二乘法
results = sm.OLS(y, X).fit()
print(results.summary())
# 拟合普通线性回归 - Patsy格式
data = pd.DataFrame(X, columns=['col0', 'col1', 'col2'])
data['y'] = y
results = smf.ols('y ~ col0 + col1 + col2', data=data).fit()
results.predict(data[:5]) # 执行预测

除了普通线性回归,statsmodels模块还主要支持广义线性模型、鲁棒线性模型、线性混合效应模型、方差分析(ANOVA)、时序分析(ARMA)、状态空间模型、广义矩方法等

4 scikit-learn介绍

scikit-learn 是广泛使用的通用Python机器学习工具包之一,包含了大量的标准有监督和无监督机器学习方法,以及用于模型选择和评估、数据转换、数据加载和模型持久化的工具

本小节将使用来自Kaggle的经典的泰坦尼克号数据集来进行演示:

train = pd.read_csv('datasets/titanic/train.csv')
test = pd.read_csv('datasets/titanic/test.csv')
# 缺失检查
train.isnull().sum()
test.isnull().sum()
# 缺失处理
impute_value = train['Age'].median() 
train['Age'] = train['Age'].fillna(impute_value)
test['Age'] = test['Age'].fillna(impute_value)
# 类型转换
train['IsFemale'] = (train['Sex'] == 'female').astype(int)
test['IsFemale'] = (test['Sex'] == 'female').astype(int) 
# 数据准备
predictors = ['Pclass', 'IsFemale', 'Age']
 X_train = train[predictors].values
X_test = test[predictors].values
y_train = train['Survived'].values
# 逻辑回归建模
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train) # 拟合
y_predict = model.predict(X_test) # 预测
(y_true == y_predict).mean() # 计算准确率
# 自动调参 - 正则化参数C
from sklearn.linear_model import LogisticRegressionCV
model_cv = LogisticRegressionCV(Cs=10)
model_cv.fit(X_train, y_train)
# 交叉验证
from sklearn.model_selection import cross_val_score
model = LogisticRegression(C=10)
scores = cross_val_score(model, X_train, y_train, cv=4)
scores # 查看模型评价

本章内容仅为基本介绍,进阶阅读推荐:

  • _Introduction to Machine Learning with Python_ by Andreas Müller and Sarah Guido (O'Reilly)
  • _Python Data Science Handbook_ by Jake VanderPlas (O'Reilly)
  • _Data Science from Scratch: First Principles with Python_ by Joel Grus (O'Reilly)
  • _Python Machine Learning_ by Sebastian Raschka and Vahid Mirjalili (Packt Publishing)
  • _Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow_ by Aurélien Géron (O'Reilly)

往年同期文章