【Python・机器学习】多元回归模型(原理及代码)

前言

自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文最少限度涉及公式讲解(文科生小白友好体质)~(部分讲解会参考知乎等平台)

本文重点:多元回归模型的建立以及在实际语言学数据的处理

1.多元回归分析的基本原理

2.应用条件

3.数据实例以及Python代码

4.结果分析


1.多元回归分析的基本原理

  多元线性回归用于估计两个或多个自变量一个因变量之间的线性关系。

其基本思想是,因变量可以表示为自变量的线性组合,加上一个随机误差项。通过最小二乘法估计回归系数,建立回归方程,可以用于预测和解释变量间的关系。

  1. 左侧蓝色框代表多个自变量(X₁, X₂, X₃, …)
  2. 右侧橙色框代表因变量(Y)
  3. 连接线上的β₁、β₂、β₃表示回归系数,表示各个自变量对因变量的影响程度
  4. 底部的回归方程:Y = β₀ + β₁X₁ + β₂X₂ + β₃X₃ + … + ε
  5. β₀ 是截距
  6. β₁, β₂, β₃ 等是回归系数
  7. ε 是误差项

这种关系表明:

  • 每个自变量都可能对因变量产生影响
  • 影响程度由回归系数β的大小决定
  • 所有自变量的影响是综合的、同时存在的
  • 模型中包含误差项(ε),表示存在其他未知或未计入的影响因素
  • 2.应用条件

  • 线性关系:因变量与自变量之间存在线性关系。可通过【散点图】初步判断。
  • 误差项正态性:随机误差项服从均值为0的正态分布。
  • 误差项独立性:随机误差项之间相互独立。
  • 方差齐性:不同自变量水平下,因变量的方差相等。
  • 自变量间无多重共线性:自变量之间不存在精确的线性关系。 
  • 3.数据实例以及Python代码

    下面以一个语言教育学的数据为例,探讨多元回归分析的应用。

    该数据包含了影响英语成绩的几个因素:学习时间词汇量语法能力阅读理解能力得分。希望建立一个回归模型预测英语成绩

    数据实例如下(随机生成)
    序号 学习时间
    (小时/周)
    词汇量
    (个)
    语法能力
    (分)
    阅读理解
    (分)
    英语成绩
    (分)
    1 7.49 1884 83.94 66.21 73.87
    2 8.77 2273 92.22 72.77 86.1
    3 8.91 1731 85.51 67.37 77.47
    4 9.41 2158 71.53 73.82 78.53
    5 7.99 2023 82.66 69.11 77.18
    1.导入必要的包和库
    # 导入必要的库
    import numpy as np
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LinearRegression
    from sklearn.metrics import r2_score, mean_squared_error
    import matplotlib.pyplot as plt
    
    2.数据准备(以下数据随机生成,自己有数据的情况下直接读取即可,读取方法在后面) 
    # 生成模拟数据
    np.random.seed(42)  # 设置随机种子,确保结果可重现
    n_students = 100    # 生成100名学生的数据
    
    # 生成自变量数据
    study_time = np.random.normal(8, 2, n_students)  # 学习时间
    vocabulary = np.random.normal(2000, 500, n_students)  # 词汇量
    grammar_score = np.random.normal(75, 15, n_students)  # 语法能力
    reading_score = np.random.normal(70, 10, n_students)  # 阅读理解
    
    #创建因变量(英语成绩)
    english_score = (0.3 * study_time + 
                    0.25 * vocabulary/100 + 
                    0.25 * grammar_score + 
                    0.2 * reading_score + 
                    np.random.normal(0, 5, n_students))
    
    # 创建数据框
    data = pd.DataFrame({
        '学习时间': study_time,
        '词汇量': vocabulary,
        '语法能力': grammar_score,
        '阅读理解': reading_score,
        '英语成绩': english_score
    })
    
    # 查看数据统计信息
    print(data.describe())

     输出结果:

    # 相关性分析
    correlation_matrix = data.corr()
    plt.figure(figsize=(10, 8))
    sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
    plt.title('变量相关性热力图')
    plt.tight_layout()
    plt.show()
    3.回归模型建立
    # 准备建模数据(如果是从excel/csv文件读取的话需要替换相应的变量名,读取方法参考最后)
    X = data[['学习时间', '词汇量', '语法能力', '阅读理解']]
    y = data['英语成绩']
    
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
    
    # 建立并训练模型
    model = LinearRegression()
    model.fit(X_train, y_train)

    这部分将数据划分为训练集和测试集,并使用线性回归建立模型。 

    4.模型评估
    # 打印模型系数
    print("\n回归系数:")
    for feature, coef in zip(X.columns, model.coef_):
        print(f"{feature}: {coef:.4f}")
    print(f"截距: {model.intercept_:.4f}")
    
    # 模型评估
    y_pred = model.predict(X_test)
    r2 = r2_score(y_test, y_pred)
    mse = mean_squared_error(y_test, y_pred)
    print(f"\n模型评估:")
    print(f"R² 分数: {r2:.4f}")
    print(f"均方误差: {mse:.4f}")

    这部分展示了每个变量的回归系数,以及模型的R²值和均方误差。  

     输出结果:

     

    5.预测示例 
    # 预测示例
    example_student = pd.DataFrame({
        '学习时间': [10],
        '词汇量': [2500],
        '语法能力': [85],
        '阅读理解': [80]
    })
    predicted_score = model.predict(example_student)
    print(f"\n示例预测:")
    print(f"对于学习时间为10小时/周、词汇量2500词、语法85分、阅读理解80分的学生:")
    print(f"预测英语成绩为: {predicted_score[0]:.2f}")
    

     

    6.可视化预测结果
    # 可视化预测结果
    plt.figure(figsize=(10, 6))
    plt.scatter(y_test, y_pred, alpha=0.5)
    plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
    plt.xlabel('Actual Score')
    plt.ylabel('Predicted Score')
    plt.title('Predicted vs Actual Scores')
    plt.tight_layout()
    plt.show()

     

    ▷从excel 或者csv文件中读取数据的情况
    # 读取Excel文件(路径按需修改)
    excel_data = read_excel_file("language_education.xlsx")
    
    # 读取CSV文件(路径按需修改)
    csv_data = read_csv_file("language_education.csv")
    
    
    # 读取自变量/因变量(以excel文件为例)
    X, y = read_variables_by_names(
        "language_education.xlsx",
        dependent_var='英语成绩',
        independent_vars=['词汇量', '语法能力', '阅读理解']
    )
    
    
    #之后代码相通,记得修改变量名即可
    
    

    完整代码如下: 
    # 导入必要的库
    import numpy as np
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LinearRegression
    from sklearn.metrics import r2_score, mean_squared_error
    import matplotlib.pyplot as plt
    
    
    # 生成模拟数据
    np.random.seed(42)  # 设置随机种子,确保结果可重现
    
    # 生成100名学生的数据
    n_students = 100
    
    # 生成自变量数据
    study_time = np.random.normal(8, 2, n_students)  # 平均8小时/周,标准差2
    vocabulary = np.random.normal(2000, 500, n_students)  # 平均2000词,标准差500
    grammar_score = np.random.normal(75, 15, n_students)  # 平均75分,标准差15
    reading_score = np.random.normal(70, 10, n_students)  # 平均70分,标准差10
    
    # 生成因变量(英语成绩)
    # 设定一些权重来模拟各因素对成绩的影响
    english_score = (0.3 * study_time + 
                    0.25 * vocabulary/100 + 
                    0.25 * grammar_score + 
                    0.2 * reading_score + 
                    np.random.normal(0, 5, n_students))  # 添加一些随机噪声
    
    # 创建数据框
    data = pd.DataFrame({
        '学习时间': study_time,
        '词汇量': vocabulary,
        '语法能力': grammar_score,
        '阅读理解': reading_score,
        '英语成绩': english_score
    })
    
    # 查看数据的基本统计信息
    print("\n数据基本统计信息:")
    print(data.describe())
    
    
    # 准备建模数据
    X = data[['学习时间', '词汇量', '语法能力', '阅读理解']]
    y = data['英语成绩']
    
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    # 建立并训练模型
    model = LinearRegression()
    model.fit(X_train, y_train)
    
    # 打印模型系数
    print("\n回归系数:")
    for feature, coef in zip(X.columns, model.coef_):
        print(f"{feature}: {coef:.4f}")
    print(f"截距: {model.intercept_:.4f}")
    
    # 模型评估
    y_pred = model.predict(X_test)
    r2 = r2_score(y_test, y_pred)
    mse = mean_squared_error(y_test, y_pred)
    print(f"\n模型评估:")
    print(f"R² 分数: {r2:.4f}")
    print(f"均方误差: {mse:.4f}")
    
    # 预测示例
    example_student = pd.DataFrame({
        '学习时间': [10],
        '词汇量': [2500],
        '语法能力': [85],
        '阅读理解': [80]
    })
    predicted_score = model.predict(example_student)
    print(f"\n示例预测:")
    print(f"对于学习时间为10小时/周、词汇量2500词、语法85分、阅读理解80分的学生:")
    print(f"预测英语成绩为: {predicted_score[0]:.2f}")
    
    # 可视化预测结果
    plt.figure(figsize=(10, 6))
    plt.scatter(y_test, y_pred, alpha=0.5)
    plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
    plt.xlabel('Actual Score')
    plt.ylabel('Predicted Score')
    plt.title('Predicted vs Actual Scores')
    plt.tight_layout()
    plt.show()

    4.结果分析:

    1.回归系数解释
  • 学习时间: 0.1710
  • 含义:每增加1小时的学习时间,预期英语成绩会增加0.171分
  • 影响程度相对较小
  • 词汇量: 0.0050
  • 含义:每增加1个词汇量,预期英语成绩会增加0.005分
  • 看似很小,但考虑到词汇量通常以百或千为单位增长,实际影响不小
  • 例如:增加100个词汇量,预期成绩增加0.5分
  • 语法能力: 0.2181
  • 含义:语法测试分数每提高1分,预期英语成绩会增加0.218分
  • 影响程度中等
  • 阅读理解: 0.3077
  • 含义:阅读理解分数每提高1分,预期英语成绩会增加0.308分
  • 在所有因素中影响最大
  • 2.模型评估指标解释
  • R² (R平方) = 0.4948
  • 含义:模型可以解释约49.48%的英语成绩变异
  • 这个R²值表明模型的拟合程度一般,还有约50%的变异无法被当前自变量解释
  • 说明可能还有其他重要因素影响英语成绩未被纳入模型
  • MSE(均方误差)= 33.0542
  • 含义:预测值与实际值的平均偏差的平方
  • 开平方后约为5.75分,表示预测值平均偏离实际值约5.75分
  • 这个误差相对于英语成绩的总分范围来说中等偏大
  • 3.结论和建议
  • 阅读理解能力对英语成绩的影响最大,应优先提升
  • 语法能力的影响次之
  • 学习时间的效果相对较小,可能需要关注学习效率而不仅是时间投入
  • 模型的预测能力一般,建议:
  • 考虑增加其他相关变量(如听力能力、口语水平等)
  • 可能存在非线性关系,考虑使用更复杂的模型
  • 增加样本量以提高模型稳定性
  • 4.实践意义
  • 教学重点应放在提升阅读理解和语法能力上
  • 单纯增加学习时间的收益可能有限
  • 在预测学生成绩时,需要考虑较大的误差范围

  • 本文展示了多元回归分析的基本实现流程。在实际应用中,还可以使用交叉检验评估模型稳定性。

    按需更新!

    作者:TUTO_TUTO

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python・机器学习】多元回归模型(原理及代码)

    发表回复