Bootstrap

机器学习实验报告——线性回归和分类

一、实验目的

本实验旨在通过实际编程实践,掌握线性回归和线性分类模型的基本原理和实现方法。通过对比两种模型在特定数据集上的表现,加深对机器学习算法的理解,并学习如何评估模型的性能。

二、实验环境

  • 操作系统:Windows/Linux/MacOS
  • 编程语言:Python
  • 开发环境:Jupyter Notebook/PyCharm
  • 库:NumPy, Pandas, Matplotlib, scikit-learn

三、实验数据集

本实验使用了一个包含两个类别(类别0和类别1)的模拟数据集。数据集包含特征变量和目标变量,用于训练和评估线性回归和线性分类模型。

四、实验步骤

  1. 数据预处理
    • 加载数据集,查看数据分布和特征。
    • 对数据进行必要的清洗和转换,如缺失值处理、标准化等。
  2. 线性回归模型
    • 使用scikit-learn库中的LinearRegression类构建线性回归模型。
    • 将数据集划分为训练集和测试集(如果需要)。
    • 在训练集上训练线性回归模型。
    • 在测试集上评估模型的性能,如计算均方误差(MSE)等。
  3. 线性分类模型
    • 使用scikit-learn库中的LogisticRegression类构建逻辑回归模型(一种常用的线性分类模型)。
    • 同样将数据集划分为训练集和测试集。
    • 在训练集上训练逻辑回归模型。
    • 在测试集上评估模型的性能,如计算准确率、精确率、召回率和F1分数等。
  4. 结果对比与分析
    • 对比线性回归模型和线性分类模型在测试集上的性能。
    • 分析两种模型在不同指标上的表现,并解释可能的原因。
    • 讨论线性回归和线性分类模型各自的适用场景和优缺点。

 

  • 实验目的

1.线性回归模型部分

(1)应用场景

预测房价:根据多个特征(如面积、卧室数量、位置等)预测房价。

销售额预测:根据广告支出、季节、市场趋势等特征预测未来的销售额。

温度预测:根据历史数据中的日期和时间特征预测未来的温度。

(2)原因

线性回归模型适用于预测一个连续变量(因变量)与一个或多个自变量之间的线性关系。在上述场景中,目标变量(如房价、销售额、温度等)都是连续的数值,这使得线性回归成为一个合适的选择。

2.逻辑回归模型部分

(1)应用场景

疾病诊断:根据病人的症状和体检数据预测是否患有某种疾病(如糖尿病)。

客户流失预测:根据客户的使用行为、服务反馈等数据预测客户是否会流失。

垃圾邮件分类:根据邮件内容的特征(如词频、链接数量等)预测邮件是否为垃圾邮件。

(2)原因

逻辑回归模型适用于二分类问题,即预测目标变量是两个类别之一。在上述场景中,目标变量(如是否患病、是否流失、是否为垃圾邮件)都是二元的,这使得逻辑回归成为一个合适的选择。此外,逻辑回归还提供概率输出,可以帮助我们更好地理解预测结果的置信度。

  • 实验步骤
  1. 实验流程

2.实验结果反映的现实问题:

通过线性回归模型,我们可以得到特征(如时间、消费指数等)与目标变量(如物价)的关系。现实世界中,物价趋势受多种因素影响,包括经济发展水平、政策变化等。线性回归可以帮助我们量化这些关系,为政府和企业提供决策依据。例如:预测未来物价: 基于历史数据,预测未来某一时间点的物价。政策效果分析: 评估某一政策(如税收政策)对物价的影响。

通过上述模型,我们可以构建综合分析系统,预测和分析物价趋势与经济情况的关联性。例如:

(1)数据收集与预处理:

收集多年的经济数据,包括 GDP、失业率、通货膨胀率等。

收集相应年份的物价指数、消费指数等。

(2)模型建立与训练:

使用线性回归模型,分析各经济指标与物价指数的关系。

使用逻辑回归模型,将经济数据与物价变化分类(上涨、平稳、下跌)。

(3)模型应用:

预测未来物价趋势,为政府制定经济政策提供参考。

评估不同政策对物价的影响,帮助企业制定价格策略。

  1. 附源代码
# 导入线性回归模型
from sklearn.linear_model import LinearRegression # 线性回归模型用于预测一个或多个自变量与因变量之间的关系
# 打印标题,说明接下来是一个线性回归模型的训练例子
print("线性回归模型训练例子")
# 实例化一个线性回归模型对象
clf = LinearRegression()
# 使用三个样本点进行训练。这些点形成一条直线,所以线性回归模型可以完美地拟合它们
clf.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2]) # 训练数据,前两个列表是特征(x1, x2),第三个列表是目标值(y)
# 说明预期的线性方程,这里的注释仅用于说明,并非模型实际学到的方程
y = 0.5*x1 + 0.5*x2 # 线性方程(预测模型),但这只是假设,实际模型可能会学到不同的系数
# 使用训练好的模型对新的数据点 [3, 3] 进行预测
pre = clf.predict([[3, 3]]) # 预测数据[3, 3]的 y 值
# 打印模型的回归系数和截距
print("回归系数", clf.coef_) # 回归系数表示每个特征对目标变量的影响程度
print("截距", clf.intercept_) # 截距表示当所有特征都为 0 时,目标变量的预测值
# 打印数据[3, 3]的预测值
print("数据[3, 3]的预测值:", pre)
print("*****************")
# 导入逻辑回归模型类,它是 sklearn 库中用于解决分类问题的一个类
from sklearn.linear_model import LogisticRegression
# 导入 make_classification 函数,该函数用于生成模拟的分类数据集
# 它非常适合于测试机器学习算法
from sklearn.datasets import make_classification
# 导入 train_test_split 函数,该函数用于将数据集划分为训练集和测试集
# 在机器学习中,我们通常需要将数据集划分为这两部分来训练和评估模型
from sklearn.model_selection import train_test_split
# 导入 classification_report 函数,该函数用于评估分类模型的性能
# 它会输出每个类别的精确度、召回率、F1 分数等指标
from sklearn.metrics import classification_report
# 导入 numpy 库,它提供了大量的数学函数和工具来操作大型多维数组和矩阵
import numpy as np
# 使用 make_classification 函数来生成一个模拟的二分类数据集
# 参数解释:
# n_samples=100: 生成的样本数量为 100
# n_features=2: 每个样本的特征数量为 2
# n_informative=2: 所有特征都是信息性的(即都与目标变量 y 相关)
# n_redundant=0: 没有冗余的特征(即与目标变量 y 无关的特征)
# random_state=42: 设置随机数生成器的种子,以确保每次运行代码时生成的数据集相同
X, y = make_classification(n_samples=100, n_features=2, n_informative=2,
n_redundant=0, random_state=42)
# 使用 train_test_split 函数来划分数据集
# 参数解释:
# X, y: 要划分的特征矩阵和目标变量数组
# test_size=0.2: 测试集占整个数据集的比例为 20%
# random_state=42: 设置随机数生成器的种子,以确保划分的结果相同
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42)
# 创建一个逻辑回归模型的实例
# 参数解释:
# solver='liblinear': 使用'liblinear'求解器来优化问题,它特别适合于小数据集
# random_state=42: 设置随机数生成器的种子,以确保模型训练的结果相同
clf = LogisticRegression(solver='liblinear', random_state=42)
# 使用训练集数据来拟合(训练)逻辑回归模型
# 参数解释:
# X_train, y_train: 训练集的特征矩阵和目标变量数组
clf.fit(X_train, y_train)
# 使用训练好的模型对测试集进行预测
# 参数解释:
# X_test: 测试集的特征矩阵
# 返回值:
# y_pred: 测试集上模型预测的目标变量数组
y_pred = clf.predict(X_test)
# 打印分类报告,该报告会展示模型的分类性能
print(classification_report(y_test, y_pred))
# 打印逻辑回归模型的系数(权重)
# 这些系数表示每个特征对模型预测结果的影响程度
print("回归系数(权重):", clf.coef_)
# 打印模型的截距
# 截距表示当所有特征都为 0 时,模型预测为正样本的概率的对数几率
print("截距:", clf.intercept_)
# 使用 predict_proba 方法获取测试集上每个样本属于各个类别的概率预测
# 对于二分类问题,这将返回两个概率值(对应于两个类别),它们的和应该接近 1
y_prob = clf.predict_proba(X_test)
print("预测概率:\n", y_prob)

 结果展示:

 

 

;