趋近智
线性回归包含模型结构()、最小二乘估计、系数解释和评估指标等基本概念。Python常用于实现这些模型。两个流行的库在这一方面占据主导地位:statsmodels和scikit-learn。每个库都有其优点,同时理解它们能为回归任务提供一套多功能的工具。
statsmodels因其对统计推断和详细模型分析的重视而常受青睐,其输出与R等统计软件中常见的结果相似。scikit-learn是更广泛的机器学习 (machine learning)体系的一部分,为各种算法提供了一致的API,使其适合构建预测流程。
statsmodels提供了全面的工具,用于估计多种不同的统计模型,并进行统计检验和数据查看。它的formula.api子模块允许使用基于字符串的公式来指定模型,类似于R,这相当直观。
我们用一个简单的线性回归例子来说明。假设我们有一个pandas DataFrame df,其中包含'TargetVariable' (y) 和 'PredictorVariable' (x) 两列。
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
# 示例数据(请替换为您的实际数据)
data = {'PredictorVariable': np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
'TargetVariable': np.array([2.5, 3.1, 4.5, 5.2, 6.8, 7.1, 8.5, 9.2, 10.1, 11.5])}
df = pd.DataFrame(data)
# 使用公式语法定义模型
# 'TargetVariable ~ PredictorVariable' 表示将 TargetVariable 建模为 PredictorVariable 的函数
# statsmodels 自动包含截距项
model_formula = 'TargetVariable ~ PredictorVariable'
model = smf.ols(formula=model_formula, data=df)
# 将模型拟合到数据
results = model.fit()
# 打印详细摘要
print(results.summary())
results.summary() 方法提供了一个丰富的结果输出,包含几项重要的信息:
coef:截距项()和PredictorVariable的系数()的估计值。std err:估计值的标准误差,表示其变动性。t:t统计量,用于检验每个系数是否显著异于零。P>|t|:与t统计量相关的p值。小的p值(通常小于0.05)表明系数具有统计显著性。[0.025 0.975]:系数的95%置信区间。当你主要目标是理解数据中关系的统计特性和显著性时,这种详细摘要是statsmodels的一大优势。
scikit-learn提供了一个更简洁的接口,在不同机器学习 (machine learning)模型之间保持一致,这在将回归集成到更大的工作流程或与其他预测算法比较时很有利。
下面是使用scikit-learn执行简单线性回归的方法:
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 示例数据(与之前相同)
data = {'PredictorVariable': np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
'TargetVariable': np.array([2.5, 3.1, 4.5, 5.2, 6.8, 7.1, 8.5, 9.2, 10.1, 11.5])}
df = pd.DataFrame(data)
# 准备数据
# X 需要是一个二维数组(或DataFrame);y 是一个一维数组(或Series)
X = df[['PredictorVariable']] # 注意双括号使其保持为DataFrame
y = df['TargetVariable']
# 初始化模型
sk_model = LinearRegression()
# 拟合模型
sk_model.fit(X, y)
# 获取估计的系数
intercept = sk_model.intercept_ # Beta_0
coefficient = sk_model.coef_[0] # Beta_1(它是一个数组)
print(f"Intercept (beta_0): {intercept:.4f}")
print(f"Coefficient (beta_1): {coefficient:.4f}")
# 进行预测
y_pred = sk_model.predict(X)
# 评估模型
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print(f"Mean Squared Error (MSE): {mse:.4f}")
print(f"R-squared (R2): {r2:.4f}")
关于scikit-learn方法的重要说明:
scikit-learn通常要求特征 (X) 是一个二维数组结构(例如,形状为 (样本数, 特征数) 的DataFrame或NumPy数组),而目标 (y) 则是一个一维数组结构(例如,pandas Series或形状为 (样本数,) 的NumPy数组)。fit() 方法训练模型,predict() 方法对新数据生成预测。模型参数 (parameter)(如系数)作为拟合模型对象的属性存储(例如,sk_model.intercept_,sk_model.coef_)。sklearn.metrics 模块中的函数完成,这需要真实目标值和模型的预测值。与statsmodels相比,scikit-learn提供的内置统计摘要输出较少。它的优势在于其一致的API、易于集成到机器学习流程(包括数据预处理、交叉验证和模型选择),以及对多种算法的支持。
这两个库都可以轻松处理多个预测变量。
Statsmodels: 只需在公式字符串中添加更多变量即可。
# 假设 df 包含 'Predictor1'、'Predictor2'、'TargetVariable' 列
model_formula_multi = 'TargetVariable ~ Predictor1 + Predictor2'
multi_model_sm = smf.ols(formula=model_formula_multi, data=df).fit()
# print(multi_model_sm.summary()) # 摘要包括 Predictor1 和 Predictor2 的系数
Scikit-learn: 在特征DataFrame X 中包含更多列。
# 假设 df 包含 'Predictor1'、'Predictor2'、'TargetVariable' 列
X_multi = df[['Predictor1', 'Predictor2']]
y = df['TargetVariable']
multi_model_sk = LinearRegression()
multi_model_sk.fit(X_multi, y)
# 系数将是一个数组,包含 Predictor1 和 Predictor2 的值
# print(multi_model_sk.coef_)
# print(multi_model_sk.intercept_)
statsmodels。它擅长解释当前数据中的关系。scikit-learn。熟悉这两个库能提供灵活性。你可以使用statsmodels进行初步的数据分析和模型理解,然后转向scikit-learn来构建一个可部署的预测模型。接下来的实践部分将为你提供直接将这些工具应用于数据集的经验。
这部分内容有帮助吗?
LinearRegression的API及其在机器学习工作流中的应用。scikit-learn构建和评估机器学习模型,其中包含线性回归和更广泛的机器学习概念的实践示例。© 2026 ApX Machine LearningAI伦理与透明度•